paramiko模块
概述
ssh是一个协议,OpenSSH是其中一个开源实现,paramiko是Python的一个库,实现了SSHv2协议(底层使用cryptography)。
使用paramiko需要先安装pycrypto
Paramiko介绍
paramiko包含两个核心组件:SSHClient和SFTPClient
- SSHClient的作用类似于Linux的ssh命令,是对SSH会话的封装,该类封装了传输(Transport),通道(Channel)及SFTPClient建立的方法(open_sftp),通常用于执行远程命令。
- SFTPClient的作用类似与Linux的sftp命令,是对SFTP客户端的封装,用以实现远程文件操作,如文件上传、下载、修改文件权限等操作。
Paramiko中的几个基础名词:
- Channel:是一种类Socket,一种安全的SSH传输通道;
- Transport:是一种加密的会话,使用时会同步创建了一个加密的Tunnels(通道),这个Tunnels叫做Channel;
- Session:是client与Server保持连接的对象,用connect()/start_client()/start_server()开始会话。
Paramiko的基本使用
SSHClient常用的方法介绍
-
connect()
实现远程服务器的连接与认证,对于该方法只有hostname是必传参数。
常用参数
-
hostname 连接的目标主机
-
port=SSH_PORT 指定端口
-
username=None 验证的用户名
-
password=None 验证的用户密码
-
pkey=None 私钥方式用于身份验证
-
key_filename=None 一个文件名或文件列表,指定私钥文件
-
timeout=None 可选的tcp连接超时时间
-
allow_agent=True, 是否允许连接到ssh代理,默认为True 允许l
-
ook_for_keys=True 是否在~/.ssh中搜索私钥文件,默认为True 允许
-
compress=False, 是否打开压缩
-
-
set_missing_host_key_policy()
设置远程服务器没有在know_hosts文件中记录时的应对策略。目前支持三种策略:
设置连接的远程主机没有本地主机密钥或HostKeys对象时的策略,目前支持三种:
-
AutoAddPolicy 自动添加主机名及主机密钥到本地HostKeys对象,不依赖load_system_host_key的配置。即新建立ssh连接时不需要再输入yes或no进行确认
-
WarningPolicy 用于记录一个未知的主机密钥的python警告。并接受,功能上和AutoAddPolicy类似,但是会提示是新连接
-
RejectPolicy 自动拒绝未知的主机名和密钥,依赖load_system_host_key的配置。此为默认选项
-
-
exec_command()
在远程服务器执行Linux命令的方法。
使用exec_command()方法执行例如ls,pwd等命令的时候,都执行的还不错。
但是cd /path这个命令就有点问题了,发现cd到其他路径下,但是使用pwd发现还是在登录的时候的默认路径,/home/
。 这是因为exec_command()执行完成之后默认返回到初始路径。
要把后续的想要执行的命令和cd放在同一个字符串中传入exec_command方法中才会生效。
# 在Linux中可以通过‘;’拼接两条命令 ssh.exec_command('cd /home/<user>/xxx/yyy; ls -al')# stdin,stdout,stderr 对应标准输入,标准输出,标准错误 stdin,stdout,stderr = ssh.exec_command('pwd') print(stdout.read()) # 打印出输出结果 print(stdout.readline()) print(stdout.readlines()) -
invoke_shell()
可以创建一个交互式shell
# 创建一个shell chan = ssh.invoke_shell() # 利用send函数发送cmd到SSH server,添加'\n'做回车来执行shell命令 chan.send(cmd+'\n') # 通过recv函数获取回显 chan.recv(bufsize) -
open_sftp()
在当前ssh会话的基础上创建一个sftp会话。该方法会返回一个SFTPClient对象。
利用SSHClient对象的open_sftp()方法,可以直接返回一个基于当前连接的sftp对象,可以进行文件的上传等操作.
sftp = client.open_sftp() sftp.put('D:/test.txt','/home/text.txt') sftp.get('/home/text.txt','D:/test.txt')
示例
import paramiko
import time
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='10.1.1.32',username='root',password='admin@123',port=22)
stdin,stdout,stderr = ssh.exec_command('pwd')
print(stdout.read())
print(stdout.readline())
print(stdout.readlines())
channel = ssh.invoke_shell()
channel.send('cd /'+'\n')
channel.send('ls'+'\n') # '\n'命令才会执行
time.sleep(5) # 命令执行需要时间
res = channel.recv(1024).decode('utf8') # 通过decode函数转为utf8格式
print(res)
channel.close() # 关闭shell通道连接
sftp = ssh.open_sftp() # 打开sftp
sftp.get('/home/1.txt','d:/1.txt')
sftp.put('d:/2.txt','/home/2.txt')
sftp.close() # 关闭SFTP连接
ssh.close() # 关闭SSH连接

浙公网安备 33010602011771号