paramiko模块简介
“Paramiko”是世界语中“偏执狂”和“朋友”的合成词。它是Python 2.7/3.4+的一个模块,实现了SSH2协议,用于到远程机器的安全(加密和身份验证)连接。与SSL(又名TLS)不同,SSH2协议不需要由强大的中央权威签署层次证书。您可能知道SSH2是替代Telnet和rsh的协议,用于对远程shell的安全访问,但是该协议还包括通过加密的隧道为远程服务打开任意通道的能力(例如,这就是SFTP的工作方式)。
简单的来说:我想通过python去操作远程Linux服务器,或者带有ssh服务的远程机器。通过python本地去查看远程系统信息,执行一些指令,同时我们可以上传或者下载文件。
本节要实现的目标:远程部署任务,定时执行脚本。
一、paramiko模块的安装
安装超级简单:
一般直接 :pip install paramiko
在pycharm安装更简单界面化:
PyCharm→Preferences→Project:项目名→Project Interpreter
点击 + 号 搜索paramiko 安装就好
二、paramiko基础的功能与dome实现
1. 基于用户名和密码的 sshclient 方式登录
- 实例化一个SSH对象:
ssh = paramiko.SSHClient()
- 自动添加机器(否则会连不上):
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
- 连接服务器:
ssh.connect(hostname='', port= , username='', password='')
- 执行命令:
stdin, stdout, stderr = ssh.exec_command('命令')
,返回3个结果:标准输入、输出、错误 - 获取输出结果:
result = stdout.read()
- 关闭SSH:
ssh.close()
这里注意的是用户权限的问题,有些命令是无法执行的。
import paramiko
#创建ssh连接对象
ssh=paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='', port=22, username='', password='')
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df')
# 获取命令结果
res,err = stdout.read(),stderr.read()
result = res if res else err
print(result.decode())
# 关闭连接
ssh.close()
2.基于用户名和密码的 transport 方式登录
基于SSHClient是传统的连接服务器、执行命令、关闭的一个操作,有时候需要登录上服务器执行多个操作,比如执行命令、上传/下载文件,上面方法则无法实现,可以通过如下方式来操作
#SSHClient 封装 Transport
import paramiko
# 实例化一个transport对象
transport = paramiko.Transport(('', 22))
# 建立连接
transport.connect(username='', password='')
# 将sshclient的对象的transport指定为以上的transport
ssh = paramiko.SSHClient()
ssh._transport = transport
# 执行命令,和传统方法一样
stdin, stdout, stderr = ssh.exec_command('df')
print (stdout.read().decode())
# 关闭连接
transport.close()
3.利用 transport 实现文件上传和下载
import paramiko
# 实例化一个trans对象# 实例化一个transport对象
transport = paramiko.Transport(('',22 ))
# 建立连接
transport.connect(username='', password='')
# 实例化一个 sftp对象,指定连接的通道
sftp = paramiko.SFTPClient.from_transport(transport)
# LocalFile.txt 上传至服务器 /home/fishman/test/remote.txt
sftp.put('LocalFile.txt', '/home/fishman/test/remote.txt')
# 将LinuxFile.txt 下载到本地 fromlinux.txt文件中
sftp.get('/home/fishman/test/LinuxFile.txt', 'fromlinux.txt')
transport.close()
三、远程部署任务实现
def runSshCmd(cmd,*userinof):
ip=userinof[0]
name=userinof[1]
pwd=userinof[2]
transport = paramiko.Transport((ip, 22))
# 建立连接
transport.connect(username=name, password=pwd)
# 将sshclient的对象的transport指定为以上的transport
ssh = paramiko.SSHClient()
ssh._transport = transport
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 执行命令
stdin, stdout, stderr = ssh.exec_command(cmd)
# 获取命令结果
res,err = stdout.read(),stderr.read()
result = res if res else err
print(result.decode())
# 关闭连接
ssh.close()
transport.close()
def putfile(inpath,outpath,*userinof):
ip=userinof[0]
name=userinof[1]
pwd=userinof[2]
transport = paramiko.Transport((ip, 22))
# 建立连接
transport.connect(username=name, password=pwd)
# 将sshclient的对象的transport指定为以上的transport
ssh = paramiko.SSHClient()
sftp = paramiko.SFTPClient.from_transport(transport)
# LocalFile.txt 上传至服务器 /home/fishman/test/remote.txt
sftp.put(inpath, outpath)
transport.close()
def getfile(inpath,outpath,*userinof):
ip=userinof[0]
name=userinof[1]
pwd=userinof[2]
transport = paramiko.Transport((ip, 22))
# 建立连接
transport.connect(username=name, password=pwd)
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
sftp = paramiko.SFTPClient.from_transport(transport)
# 将LinuxFile.txt 下载到本地 fromlinux.txt文件中
sftp.get(outpath,inpath)
transport.close()
def newcrontab(crontabstr,ip,name,pwd):
crontabstr="""echo "0 */1 * * * python /home/kt/getPm/CityDataSpider.py" >> /var/spool/cron/root """
runSshCmd(crontabstr,ip,name,pwd)
def linDeploy(ip,name,pwd):
putfile(inpath,outpath,*userinof)
crontabstr=""
runSshCmd(crontabstr,ip.name,pwd)