python学习之---- paramiko 模块

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()
View Code

 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()
View Code

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()
View Code

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()
View Code

 小技巧:

修改 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文件中了。

相关推荐