简介
paramiko模块是使用Python编写的一个第三方模块,遵循了SSH2协议,支持加密和认证的方式进行远程连接。利用该模块,可以实现ssh远程连接和sftp协议进行文件传输(就相当于我们的scp)
安装
在本机安装,直接执行命令:pip install paramiko
由于我们是在Pycharm中进行验证和开发,所以我们直接在Pycharm中进行安装(因为Pycharm是基于虚拟python环境的)
进入Pycharm的设置中,进行添加。
paramiko实现ssh连接paramiko.SSHClient()
我们通过一个示例来理解如何实现ssh
import paramiko
#创建一个ssh对象
client = paramiko.SSHClient()
"""
The authenticity of host '172.25.254.254 (172.25.254.254)' can't be established.
ECDSA key fingerprint is 4c:98:51:43:65:46:66:fd:af:5b:ea:cc:d9:97:c0:74.
Are you sure you want to continue connecting (yes/no)?
"""
# 因为可能会出现上面的提示,使用下面的方法可以自动填写yes
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 建立连接
client.connect(
hostname='172.25.18.1',
username='root',
password='redhat'
)
# 执行操作,获取操作对应的标准输入,标准输出,标准错误
stdin,stdout,stderr = client.exec_command('echo hellomac')
# 获取执行结果,先使用read()读到,再需要解码才能正确显示
print(stdout.read().decode('utf-8'))
# 关闭连接
client.close()
结果:
paramiko实现批量ssh连接
通常情况下,我们会把远程主机的相关信息写到一个文件里,当我们需要批量远程连接的时候,可以利用with
上下文管理进行主机信息文件读取,然后将读取到的信息分别使用paramiko定义的函数进行连接.
首先,我们在/tmp
目录下新建一个文件hosts
,写入相关信息:
其中,第一个信息是正确的,第二个ip不存在,第三个密码故意写错.
接下来我们用paramiko模块尝试批量ssh连接.
from paramiko.ssh_exception import NoValidConnectionsError,AuthenticationException
import paramiko
def multi_connection(cmd,hostname,username,passwd):
try:
# 尝试连接
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(
hostname=hostname,
username=username,
password=passwd
)
# 各种异常处理
except NoValidConnectionsError as CE:
return '主机%s连接失败:%s' %(hostname,CE)
except AuthenticationException as AE:
return '主机%s密码错误:%s' %(hostname,AE)
except Exception as E:
return '发生未知错误:%s' %E
else:
# 未发生异常,说明连接成功
print('主机%s连接成功' %hostname)
print("执行操作:%s" %cmd)
stdin,stdout,stderr = client.exec_command(cmd)
res = stdout.read().decode()
return res
finally:
# 完成后关闭连接
client.close()
with open('/tmp/hosts') as f:
# 逐行遍历文件
for line in f:
# 对每行的内容进行去除空格和以:分隔,分别对应ip 用户名 密码
hostname,username,passwd = line.strip().split(':')
res = multi_connection('free -m ',hostname,username,passwd)
print(res)
结果:
paramiko实现文件上传下载(SFTP)
上传:
from paramiko.ssh_exception import AuthenticationException,NoValidConnectionsError
import paramiko
# 定义上传函数,传入参数分别是远程主机ip,密码,本地文件,远程文件
def put_file(hostname,passwd,localfile,romotefile):
try:
transfer = paramiko.Transport((hostname,22))
transfer.connect(username='root',password=passwd)
sftp = paramiko.SFTPClient.from_transport(transfer)
except Exception as E:
print('出现错误:',E)
else:
sftp.put(localfile,romotefile)
print('上传成功!')
finally:
sftp.close()
put_file('172.25.18.1','redhat','/tmp/hosts','/mnt/1519')
下载:
import paramiko
# 定义下载函数,传入参数分别是远程主机ip,密码,本地文件,远程文件
def get_file(hostname,passwd,localfile,romotefile):
try:
transfer = paramiko.Transport((hostname,22))
transfer.connect(username='root',password=passwd)
sftp = paramiko.SFTPClient.from_transport(transfer)
except Exception as E:
print('出现错误:',E)
else:
sftp.get(romotefile,localfile)
print('下载成功!')
finally:
sftp.close()
get_file('172.25.18.1','redhat','/tmp/1524','/mnt/1519')