Python 实现远程ssh连接linux 管理上传文件 paramiko

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)

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值