paramiko 模块
功能:提供了ssh及sftp进行远程登录服务器执行命令和上传下载文件的功能。这是一个第三方的软件包,使用之前需要安装。
1 基于用户名和密码的 sshclient 方式登录
执行过程:传统的连接服务器、执行命令、关闭的一个操作
1 import paramiko 2 3 # 实例化一个客户端 4 ssh_client = paramiko.SSHClient() 5 # 实现自动添加ssh信任关系knows_hosts 6 ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 7 # 连接远程linux目标机 8 ssh_client.connect(hostname='ip',port=22,username='root',password='paswd') 9 # 在远程服务器执行命令 10 stdin,stdout,stderr = ssh_client.exec_command('df -h') 11 # 读取标准输出和标准错误 12 out,err = stdout.read(),stderr.read() 13 # 打印输出的信息 14 mess = out if out else err 15 print(mess.decode()) 16 # 关闭客户端连接 17 ssh_client.close()
2 基于用户名和密码的 transport 方式登录
执行过程:连接服务器,执行上传,下载,关闭操作
1 import paramiko 2 # 定义传输的ip和端口 3 transfer = paramiko.Transport('10.10.2.12',22) 4 # 定义传输的账号,密码 5 transfer.connect(username='root',password='passwd') 6 # 建立sftp连接 7 sftp = paramiko.SFTPClient.from_transport(transfer) 8 # 上传 9 sftp.put('源文件','目标文件') 10 # 下载 11 sftp.get('服务器文件,'本地文件') 12 # 关闭连接 13 transfer.close()
3 基于公钥密钥的 SSHClient 方式登录
1 # 指定本地的RSA私钥文件,如果建立密钥对时设置的有密码,password为设定的密码,如无不用指定password参数 2 pkey = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa', password='12345') 3 # 建立连接 4 ssh = paramiko.SSHClient() 5 ssh.connect(hostname='ip',port=22,username='user',pkey=pkey) 6 # 执行命令 7 stdin, stdout, stderr = ssh.exec_command('df -hl') 8 # 结果放到stdout中,如果有错误将放到stderr中 9 print(stdout.read().decode()) 10 # 关闭连接 11 ssh.close()
4 基于密钥的 Transport 方式登录
1 # 指定本地的RSA私钥文件,如果建立密钥对时设置的有密码,password为设定的密码,如无不用指定password参数 2 pkey = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa', password='12345') 3 # 建立连接 4 trans = paramiko.Transport(('ip', 22)) 5 trans.connect(username='user', pkey=pkey) 6 7 # 将sshclient的对象的transport指定为以上的trans 8 ssh = paramiko.SSHClient() 9 ssh._transport = trans 10 11 # 执行命令,和传统方法一样 12 stdin, stdout, stderr = ssh.exec_command('df -hl') 13 print(stdout.read().decode()) 14 15 # 16 sftp = paramiko.SFTPClient.from_transport(trans) 17 sftp.put('src_file,'dst_file') 18 sftp.get('dst_file,'src_file) 19 # 关闭连接 20 trans.close()
小技巧:
修改 paramiko模块的源码,将用户的输入进行文件保存
首先从github下载模块的源码包,打开 demmosinteractive.py文件,跳转到49行,添加如下:
# 这里开始输入命令的监听
cmd_list = [] # 用于记录用户的输入的每个键
while True:
r, w, e = select.select([chan, sys.stdin], [], []) # 进入监听状态
if chan in r:
try:
x = u(chan.recv(1024))
if len(x) == 0:
sys.stdout.write(' *** EOF ')
break
sys.stdout.write(x)
sys.stdout.flush()
except socket.timeout:
pass
if sys.stdin in r:
x = sys.stdin.read(1) # 这里的1 代表读取用户敲击的每一个键
if len(x) == 0:
break
# 将用户输入的命令进行写文件保存,当遇到键盘输入为回车,则开发文件写入用户输入的命令,如果没有回车,则
# 将用户键盘输入的每一个键进行列表添加
if x == ' ': # 为回车则写文件
f = open('./stdin.log','w')
cmd_str = ''.join(cmd_list)
f.write(cmd_str+' ')
f.close()
else:
cmd_list.append(x)
chan.send(x)
这样就把用户的输入保存到stdin.log文件中了。