一、paramiko简介
paramiko是基于Python实现用于做远程控制的第三方模块,使用该模块可以对远程服务器进行命令或文件操作,支持认证及密钥方式,自动化运维管理工具fabric和ansible内部的远程管理功能就是使用paramiko来现实的。
官网地址:https://pypi.python.org/pypi/paramiko
目前最新版本是2.0.0
二、paramiko安装
paramiko支持pip、easy_install或源码安装方式,推荐使用pip安装paramiko
1、在pycharm中使用pip安装paramiko (Python3中需要先升级pip到8.1.2版本 升级命令:pip install --upgrade pip)
下图是安装完成之后的截图。
2、在CentOS6.6中使用pip安装paramiko
pip3 install paramiko
安装过程中报错:
解决办法: yum install libffi libffi-devel
检验安装结果,导入模块没有提示异常则说明安装成功:
三、paramiko的核心组件
paramiko包含两个核心组件,分别是SSHClient类和SFTPClient类。
SSHClient
用于连接远程服务器并执行基本命令
基于用户名密码连接
#!/usr/bin/python3 # -*- coding:utf-8 -*- import paramiko import sys # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname='192.168.65.246', port=22, username='root', password='123,.abc') # 执行命令 stdin, stdout, stderr = ssh.exec_command(sys.argv[1]) # 获取命令结果 result,err = stdout.read(),stderr.read() if not err: print(str(result,'utf-8')) else: print(err) # 关闭连接 ssh.close()
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 import sys 5 import paramiko 6 7 transport = paramiko.Transport(('192.168.65.246', 22)) 8 transport.connect(username='root', password='123,.abc') 9 10 ssh = paramiko.SSHClient() 11 ssh._transport = transport 12 13 stdin, stdout, stderr = ssh.exec_command(sys.argv[1]) 14 15 result = list(filter(lambda x: x is not None,[stdout.read(),stderr.read()]))[0] 16 print(str(result,'utf-8')) 17 18 transport.close()
基于公钥密钥连接
#!/usr/bin/python3 # -*- coding:utf-8 -*- import paramiko import sys private_key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa') # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname='192.168.65.246', port=22, username='root', pkey=private_key) # 执行命令 stdin, stdout, stderr = ssh.exec_command(sys.argv[1]) # 获取命令结果 result,err = stdout.read(),stderr.read() if not err: print(str(result,'utf-8')) else: print(err) # 关闭连接 ssh.close()
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 import paramiko 5 import sys 6 7 private_key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa') 8 9 transport = paramiko.Transport(('192.168.65.246', 22)) 10 transport.connect(username='root', pkey=private_key) 11 12 ssh = paramiko.SSHClient() 13 ssh._transport = transport 14 15 stdin, stdout, stderr = ssh.exec_command(sys.argv[1]) 16 result = list(filter(lambda x: x is not None,[stdout.read(),stderr.read()]))[0] 17 print(str(result,'utf-8')) 18 19 transport.close()
SFTPClient
用于连接远程服务器并执行上传下载
基于用户名密码上传下载
#!/usr/bin/python3 # -*- coding:utf-8 -*- import paramiko import sys transport = paramiko.Transport(('192.168.65.246',22)) transport.connect(username='root',password='123,.abc') sftp = paramiko.SFTPClient.from_transport(transport) # 将location.py 上传至服务器 /tmp/test.py sftp.put('/data/pyscripts/miyao.py', '/root/miyao.py') # 将remove_path 下载到本地 local_path sftp.get('/root/miyao.py', '/root/miyao.py') transport.close()
基于公钥密钥上传下载
1 #!/usr/bin/python3 2 # -*- coding:utf-8 -*- 3 4 import paramiko 5 6 private_key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa') 7 8 transport = paramiko.Transport(('192.168.65.246', 22)) 9 transport.connect(username='root', pkey=private_key ) 10 11 sftp = paramiko.SFTPClient.from_transport(transport) 12 # 将location.py 上传至服务器 /tmp/test.py 13 sftp.put('/data/pyscripts/sftp.py', '/root/test.py') 14 # 将remove_path 下载到本地 local_path 15 sftp.get('/root/test.py', '/root/sftp.py') 16 17 transport.close()
注:代码中的主机均为VM虚拟机。