通过【ctrl+alt+s】快捷键,打开设置面板,在编译环境选项中添加paramiko远程登录模块(需要连网)
paramiko是基于Python实现的SSH2远程安全连接,支持认证及秘钥方式。可以实现远程命令执行、文件传输、之间SSH代理等功能,相对于pexpect,封装的层次更高,更贴近SSH协议的功能。基于ssh用于连接远程服务器做操作:可以远程执行命令和上传/下载文件。
一、paramiko远程密码连接
import paramiko
# 创建一个ssh对象
client = paramiko.SSHClient()
# 自动选择yes
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
client.connect(
hostname='172.25.31.110',
username='root',
password='redhat'
)
# 执行操作
# 标准输入 标准输出 标准错误
stdin,stdout,stderr = client.exec_command('route -n') #在远程主机上执行的命令
# 获取命令的执行结果
print(stdout.read().decode('utf-8'))
# 关闭连接
client.close()
二、paramiko批量连接主机
from paramiko.ssh_exception import NoValidConnectionsError,AuthenticationException
def connect(cmd,hostname,user,password):
import paramiko
client = paramiko.SSHClient()
#SSHClient类是SSH服务会话的高级表示,该类封装了传输、通道及SFTPClient的校验、建立的方法。
client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
try:
client.connect(
hostname=hostname,
username=user,
password=password
)
stdin,stdout,stderr = client.exec_command(cmd) #标准输入输出
# a = stdout.read().decode('utf-8') #解码
print(stdout.read().decode('utf-8'))
# return a #返回主机名
return hostname #返回ip
except NoValidConnectionsError as e:
return '主机%s连接失败' %(hostname)
except AuthenticationException as e:
return '主机%s密码错误' %(hostname)
except Exception as e:
return '未知错误:',e
finally:
client.close()
with open('/tmp/hosts') as f:
for line in f:
hostname,username,password = line.strip().split(':')
res = connect('hostname',hostname,username,password)
print('主机名:',res)
三、paramiko上传下载
from paramiko.ssh_exception import NoValidConnectionsError,AuthenticationException
import paramiko
# 主机名 密码 远程主机源文件 本地
def put(hostname,password,source_name,target_name): #上传本地文件到远程SFTP服务端
try:
transport = paramiko.Transport((hostname,22))
transport.connect(username='root',password=password)
sftp = paramiko.SFTPClient.from_transport(transport) #创建一个已经连通的SFTP客户端通道
#SFTPClient作为一个SFTP客户端对象,根据SSH传输协议的sftp回话,实现远程文件操作,比如文件上传、下载、权限、状态等操作。
except AuthenticationException as e:
return '主机%s密码错误' %(hostname)
except Exception as e:
return '未知错误:',e
else:
# sftp.put(source_name,target_name)
sftp.get(source_name,target_name) #下载文件到本地
finally:
transport.close()
put('172.25.31.110','redhat','/mnt/xing','/tmp/westos')
远程登录172.25.31.110主机,将该主机中的/mnt/xing文件,上传到本地/tmp目录中的westos文件里