Python操作远程服务器 paramiko模块详细介绍


Posted in Python onAugust 07, 2019

前言

paramiko模块是基于Python实现的SSH远程安全连接,可以提供在远程服务器上执行命令、上传文件到服务器或者从指定服务器下载文件的功能。

paramiko模块安装方法

paramiko模块不是python自带的标准库,需要自行下载安装,建议使用pip自动安装。方法如下:

(1)配置pip命令和镜像源路径。如果已配置,跳过。

(2)执行pip install paramiko进行安装。出现successful字样表示安装完成。

paramiko常用函数介绍

SSHclient类

(1)ssh远程连接服务器,格式为:connect(hostname, port=22, username=None, password=None, pkey=None, key_filename=None, timeout=None, ...)。其中hostname表示主机IP,port表示ssh服务端口号,默认是22,username和password表示登录用户名和密码,timeout表示设置连接超时时长。

(2)远程主机没有本地主机密钥或HostKeys对象时的连接方法。格式为:set_missing_host_key_policy(policy)。其中policy

参数常见取值有3种,分别如下:

  • AutoAddPolicy:自动添加主机名及主机密钥到本地的known_hosts,不依赖load_system_host_key的配置。即新建立ssh连接时不需要再输入yes或no进行确认。最为常用。
  • WarningPolicy 用于记录一个未知的主机密钥的python警告。并接受,功能上和AutoAddPolicy类似,但是会提示是新连接。
  • RejectPolicy 自动拒绝未知的主机名和密钥,依赖load_system_host_key的配置。此为默认选项

(3)远程执行命令,函数格式:exec_command(command, bufsize=-1, timeout=None, get_pty=False, environment=None),该命令的输入与输出流为标准输入、标出输出、标准错误输出。

(4)在远程服务器上生成新的交互式shell。函数格式为:invoke_shell(term='vt100', width=80, height=24, width_pixels=0, height_pixels=0, environment=None)。

上述只是介绍了SSHclient类常用的几个函数。SSHclient类函数详细介绍参考SSHClient

SFTPClient类

(1)创建一个已连通的SFTP客户端通道,格式为:from_transport(cls,t)

(2)将本地文件上传到服务器,格式为:put(localpath, remotepath, callback=None, confirm=True)

(3)从服务器下载文件到本地,格式为:get(remotepath, localpath, callback=None)

(4)在服务器上创建目录,格式为:mkdir()

(5)在服务器上删除目录,格式为:remove()

(6)在服务器上重命名目录,格式为:rename()

(7) 查看服务器文件状态,格式为:stat()

(8)列出服务器目录下的文件,格式为:listdir()

paramiko常用场景

(1)在远程服务器执行命令,并获取命执行命令输出结果

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='192.168.0.1', port=22, username='root', password='Aa12345!')
stdin, stdout, stderr = ssh.exec_command('df -k')
print stdout.read()
ssh.close()

(2)在远程服务器执行命令,并获取执行命令的结果码

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='192.168.0.1', port=22, username='root', password='Aa12345!')
stdin, stdout, stderr = ssh.exec_command('df -k')
channel = stdout.channel
ret = channel.recv_exit_status()
if ret == 0:
  print stdout.read()
else:
  print stderr.read()

(3)在远程服务器执行命令,需要生成子进程并交互执行命令

import paramiko,time
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='192.168.0.1', port=22, username='root', password='Aa12345!')
interact = conn.invoke_shell()
stdin, stdout, stderr = ssh.exec_command('df -k')
interact = conn.invoke_shell()
interact.send("sed -i '/192.168.0.2/d' /root/.ssh/known_hosts" + '\n')
time.sleep(1)
interact.send('ssh root@172.16.128.2' + '\n')
time.sleep(2)
interact.send('yes' + '\n')
time.sleep(2)
interact.send('Aa12345!' + '\n')
time.sleep(2)
interact.send('df -k!' + '\n')
result = interact.recv(65535)
print result

(4)上传文件到远程服务器

import paramiko
scp = paramiko.Transport(('192.168.0.1',22))
scp.connect(username='root',password='Aa12345!')
sftp=paramiko.SFTPClient.from_transport(scp)
local_path = "D:\\temp\\cc.txt"
remote_path = "/tmp/cc.txt"
sftp.put(local_path, remote_path)
scp.close()

(5)从远程服务器下载文件

import paramiko
scp = paramiko.Transport(('192.168.0.1',22))
scp.connect(username='root',password='Aa12345!')
sftp=paramiko.SFTPClient.from_transport(scp)
remote_path = "/tmp/aaaa.txt"
local_path = "D:\\temp\\aaaa.txt"
sftp.get(remote_path, local_path)
scp.close()

paramiko使用完整实例

import paramiko
def ssh_con(ip, username, password):
  try:
    con = paramiko.SSHClient()
    con.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    con.connect(ip=ip, username=username, password=password, timeout=5)
  except:
    return None
  else:
    return con
def exec_cmd(conn, cmd):
  interact = conn.invoke_shell()
  interact.send(cmd)
  result = interact.recv(65535)
  return result  
def exec_cmd2(conn,cmd):
  stdin, stdout, stderr = conn.exec_command(cmd)
  channel = stdout.channel
  ret = channel.recv_exit_status()
  if ret == 0:
    return (ret, stdout.read())
  else:
    return (ret, stderr.read())
if __name__ == '__main__':
  ip = '192.168.0.1'
  user = 'root'
  passwd = 'root'
  con = ssh_con(ip, user, passwd)
  if not con:
    print "Connect %s fail,please check." % (ip,)
  cmd = 'df -k'
  ret, result = exec_cmd2(con,cmd)
  print result

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Python中使用dict和set方法的教程
Apr 27 Python
python文件操作之目录遍历实例分析
May 20 Python
Python处理文本文件中控制字符的方法
Feb 07 Python
Python读取MRI并显示为灰度图像实例代码
Jan 03 Python
浅谈python可视化包Bokeh
Feb 07 Python
python hook监听事件详解
Oct 25 Python
mac PyCharm添加Python解释器及添加package路径的方法
Oct 29 Python
解决python3 安装不了PIL的问题
Aug 16 Python
python检测服务器端口代码实例
Aug 31 Python
Django后端发送小程序微信模板消息示例(服务通知)
Dec 17 Python
Python 解码Base64 得到码流格式文本实例
Jan 09 Python
Python实现自动访问网页的例子
Feb 21 Python
使用Python快乐学数学Github万星神器Manim简介
Aug 07 #Python
python中的&&及||的实现示例
Aug 07 #Python
程序员的七夕用30行代码让Python化身表白神器
Aug 07 #Python
python代码实现逻辑回归logistic原理
Aug 07 #Python
Python在cmd上打印彩色文字实现过程详解
Aug 07 #Python
Python如何调用外部系统命令
Aug 07 #Python
PyQt5通信机制 信号与槽详解
Aug 07 #Python
You might like
用php实现的下载css文件中的图片的代码
2010/02/08 PHP
PHP-FPM之Chroot执行环境详解
2015/08/03 PHP
WordPress中调试缩略图的相关PHP函数使用解析
2016/01/07 PHP
php判断是否连接上网络的方法实例详解
2016/12/14 PHP
基于jquery的blockui插件显示弹出层
2011/04/14 Javascript
php图像生成函数之间的区别分析
2012/12/06 Javascript
javascript ajax 仿百度分页函数
2013/10/29 Javascript
addEventListener()第三个参数useCapture (Boolean)详细解析
2013/11/07 Javascript
javascript类型转换使用方法
2014/02/08 Javascript
使用js显示当前时间示例
2014/03/02 Javascript
dropload.js插件下拉刷新和上拉加载使用详解
2017/10/20 Javascript
详解webpack编译速度提升之DllPlugin
2019/02/05 Javascript
bootstrap table.js动态填充单元格数据的多种方法
2019/07/18 Javascript
微信小程序保持session会话的方法
2020/03/20 Javascript
Nodejs在局域网配置https访问的实现方法
2020/10/17 NodeJs
Python中比较特别的除法运算和幂运算介绍
2015/04/05 Python
Python中map,reduce,filter和sorted函数的使用方法
2015/08/17 Python
Python中二维列表如何获取子区域元素的组成
2017/01/19 Python
Tensorflow卷积神经网络实例进阶
2018/05/24 Python
pytorch sampler对数据进行采样的实现
2019/12/31 Python
Python3利用openpyxl读写Excel文件的方法实例
2021/02/03 Python
世界最大的票务市场:viagogo
2017/02/16 全球购物
恶意软件的定义
2014/11/12 面试题
大专自我鉴定范文
2013/10/23 职场文书
如何做好总经理助理
2013/11/12 职场文书
财务部岗位职责
2013/11/19 职场文书
心得体会开头
2014/01/01 职场文书
就业协议书怎么填
2014/04/11 职场文书
药品业务员岗位职责
2014/04/17 职场文书
迎七一演讲稿
2014/09/12 职场文书
个人自我剖析材料
2014/09/30 职场文书
2015年医院工作总结范文
2015/04/09 职场文书
校长新学期致辞
2015/07/30 职场文书
Oracle笔记
2021/04/05 Oracle
Python中相见恨晚的技巧
2021/04/13 Python
MySQL8.0 Undo Tablespace管理详解
2022/06/16 MySQL