[toc]
简介
paramiko 是基于Python实现的SSH2远程安全连接,支支认证及密钥方式 。可以实现远程命令执行;
文件传输、中间SSH代理等功能,相对于Pexpect,封装的层次更高,更贴近SSH协议的功能;
paramiko 的安装
1、 paramiko 支持pip、 easy_install 或者源安装方式,很方便解决依赖的问题,具体安装命令如下;
# pip easy_install paramiko # easy_install paramiko
2、 paramiko 依赖第三方的Crypto、Ecdsa包及Python开发包python-devel的支持,源码如下;
# yum -y install python-devel # wget http://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-2.6.tar.gz # tar -zxvf pycrypto-2.6.tar.gz # cd pycrypto-2.6 # python setup.py install # cd .. # wget https://pypi.python.org/packages/source/e/ecdsa/ecdsa-0.10.tar.gz --no-check-certificate # tar -zxvf ecdsa-0.10.tar.gz # cd ecdsa-0.10 # python setup.py install # cd .. # git clone https://github.com/paramiko/paramiko.git # cd paramiko # python setup.py install
3、 校验安装结果,导入模块 没有提示异常,则说明该包安装成功;
➜ ~ ipython Python 2.7.14 (default, Sep 25 2017, 09:53:22) Type "copyright", "credits" or "license" for more information. IPython 5.5.0 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features. %quickref -> Quick reference. help -> Python's own help system. object? -> Details about 'object', use 'object??' for extra details. In [1]: import paramiko In [2]:
4、使用密码认证方式,通过exec_command()方法执行命令;
➜ test cat paramiko_ssh.py #!/usr/bin/env python # -*- coding: utf-8 -*- import paramiko hostname = '192.168.0.78' username = 'root' password = 'paramiko_test*5' paramiko.util.log_to_file('syslogin.log') # 发送paramiko 日志到syslog 文件 ssh=paramiko.SSHClient() # 创建一个ssh客户端 client对象 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.load_system_host_keys() # 获取客户端host_keys,默认 ~/.ssh/known_hosts #ssh.load_system_host_keys(filname='/Users/macbookdzsbe/.ssh/known_hosts') # 获取客户端host_keys,默认 ~/.ssh/known_hosts # ssh.load_host_keys(filename='/root/.ssh/known_hosts') ssh.connect(hostname=hostname,username=username,password=password)# 创建ssh连接 stdin,stdout,stderr=ssh.exec_command('netstat -tnlup') #调用远程执行命令方法exec_command # 打印命令执行结果,得到Pyhton列表形,可以使用stdout.readlines() print stdout.read() stdin,stdout,stderr=ssh.exec_command('date') print stdout.readlines() ssh.close # 关闭 ssh 连接 ➜ test python paramiko_ssh.py Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 885/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1341/master tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 18341/mongod tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1266/mysqld tcp6 0 0 :::22 :::* LISTEN 885/sshd tcp6 0 0 ::1:25 :::* LISTEN 1341/master udp 0 0 127.0.0.1:323 0.0.0.0:* 624/chronyd udp6 0 0 ::1:323 :::* 624/chronyd [u'2018\u5e74 01\u6708 12\u65e5 \u661f\u671f\u4e94 16:50:33 CST\n']
5、 paramiko 的核组件
paramiko 包含两个核心组件,一个为SSHClient类,另一个为SFTPClient类
6、 SSHClient类
SSHClient类是SSH服务会话的高级表示,该类封装了传输(transport)、通道(channel)
及SFTPClient的检验、建立的方法,通常用于执行远程命令
# 例 client = SSHClient() client.load_system_host_keys() client.connect('ssh.example.com') stdin, stdout, stderr = client.exec_command('ls -l')
SSHClient类方法使用
1、 connect 方法
connect 方法实现了远程SSH连接并检验
# 方法定义 connect(self, hostname, port=22, username=None, password=None, pkey=None, key_filename=None, timeout=None, allow_agent=True, look_for_keys=True, compress=False) # 参数说明 # hostname (str类型),连接的目标主机地址; # prot (int 类型),连接目录主机的端口,默认为22; # username (str 类型), 校验的用户名 (默认为当前的本地用户名); # password (str 类型), 密码用于身份检验或解锁私钥; # pkey (PKey 类型), 私钥方式用于身份难; # key_filename(str or list(str) 类型),一个文件名或者文件名的列表,用于私钥的身份验证; # timeout (float 类型),一个可选 的超时时间(以秒为单位)的TCP连接; # allow_agent (bool 类型),设置为False时用于禁用连接到SSH代理; # look_for_keys (bool 类型),设置False时用来禁用在~/.ssh中搜索私钥文件; # compress (bool 类型), 设置为True时打开压缩
2、 exec_command 方法
远程命令执行方法,该命令的输入与输出流为标准输入(stdin)、输出(stdout)、错误(stderr)
# 方法定义 exec_command(self, command, bufsize=-1) # 参数说明 # command (str 类型), 执行的命令串; # bufsize (int 类型), 文件缓冲区大小,默认为-1(不局限);
3、loa_syste_host_keys 方法
加载本地公钥校验文件,默认为~/.ssh/known_hosts,非默认路径需要手工指定;
load_system_host_keys(self, filename=None) # 参数说明 fiename(str类型 ),指定远程主机公钥记录文件;
4、 set_missing_host_key_policy 方法
设置连接的远程主机没有本地主机密钥或HostKeys对象时的策略,目前支持三种
分别是 AutoAddPolicy、RejectPolicy(默认),WarnningPolicy,仅限于SSHClient类
# 使用方法如下 ssh=paramiko.SSHClient() ssh.set_missing_host_keypolicy(paramiko.AutoAddPolicy) # AutoAddPolicy,自动添加主机名及主机密钥到本地HostKeys对象,并将其保存 # 不依赖load_system_host_keys()的配置,即使 ~/.ssh/known_hosts不存在也不产生影响 # RejectPolicy,自动拒绝未知的主机名和密钥,依赖load_system_host_keys()的配置 # WarningPolicy,用于记录一个未知的主机密钥的Python警告并接受它,功能上与AutoAddPolicy相似 # 但区别在于,未知的主机会有警告
SFTPClient类
SFTPClient 作为一个SFTP客户端对象,根据SSH传输协议的sftp会话,实现远客程文件操作
比如文件上传、下载、权限、状态等操作;
1、 from_transport 方法
创建一个已连接通的SFTP客户端通道;
# 方法定义 from_transport(cls, t) # 参数说明 t(Transport),一个已经通过验证的传输对象。 t = paramiko.Transport(("192.168.0.78", 22)) t.connect(username="root",password="paramiko_test*5") sftp =paramiko.SFTPClient.from_transport(t)
2、 put 方法
上传本地文件到远程SFTP服务端;
put(self, localpath, remotepath, callback=None, confirm=True) # 参数说明 # localpath (str 类型),需上传的本地文件(源); # remotepath (str 类型),远程路径(目标); # collback(functioin(int,int)),获取已接收的字字数及总传输字节数,以便回调函数高用,默认为None; # connfirm (bool类型),文件上传完毕后是否调用 stat()方法,以便确认文件的大小。 localpath='/var/log/httpd/access.log' remotepath='/data/bak/log/httpd/access.log' sftp.put(localpath,remotepath)
3、 get方法
从远程SFTP服务端下载文件到本地;
get(self, remotepth, localpath, callbak=None) # 参数说明 # remotepath (str类型),需下载的远程文件 (源文件); # localpath (str类型),本地路径(目标); # callback(function(int, int)),获取已接收的字节数及总传输字节数,以便回调函数及调用,默认为None remotepath='/var/log/httpd/access.og' localpath='/data/bak/log/httpd/access.log' sftp.get(remotepath,localpath)
4、其他方法
mkdir,在SFTP服务器端创建目录,如sftp.mkdir("/home/testdir",0700) remove, 删除SFTP服务端创指定目录,如sftp.remove("/home/testdir") rename, 重命名SFTP服务器端文件或目录,如sftp.rename("/home/testdir","/home/test") state, 获取远程SFTP服务器指定文件信息,如sftp.stat("/home/test") listdir, 获取远程SFTP服务器端指定目录列表, 以Python的(List)形式返回, 如sftp.listdir("/home")
5、SFTPClient类应用示例
#!/usr/bin/env python # -*- coding: utf-8 -*- import paramiko import os username = "root" password = "paramiko_test*5" hostname = "10.180.55.118" port = 22 try: t = paramiko.Transport((hostname, port)) t.connect(username=username, password=password) sftp =paramiko.SFTPClient.from_transport(t) sftp.put("/tmp/next.vim.log", "/home/root/next.vim.log") #上传文件 sftp.get("/etc/hosts", "/tmp/hosts") #下载文件 sftp.mkdir("/home/testdir",0700) #创建文件 sftp.rmdir("/home/root/test5.sql") #删除目录 sftp.rename("/home/root/test1.sql", "/home/root/test5.sql") #文件重命名 print sftp.stat("/home/root/test5.sql") #打印文件信息 print sftp.listdir("/home/root") # 打印目录列表 t.close(); except Exception, e: print str(e)