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 中的列表解析和生成表达式
Mar 10 Python
Python中optionParser模块的使用方法实例教程
Aug 29 Python
Python随机生成一个6位的验证码代码分享
Mar 24 Python
python 与GO中操作slice,list的方式实例代码
Mar 20 Python
Python实现的爬取网易动态评论操作示例
Jun 06 Python
python实现决策树分类(2)
Aug 30 Python
在pycharm上mongodb配置及可视化设置方法
Nov 30 Python
Python设计模式之适配器模式原理与用法详解
Jan 15 Python
Django实现web端tailf日志文件功能及实例详解
Jul 28 Python
Python学习笔记之函数的参数和返回值的使用
Nov 20 Python
Python写出新冠状病毒确诊人数地图的方法
Feb 12 Python
使用Python三角函数公式计算三角形的夹角案例
Apr 15 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数组函数知识汇总
2016/05/12 PHP
ThinkPHP表单令牌错误的相关解决方法分析
2016/05/20 PHP
微信随机生成红包金额算法php版
2016/07/21 PHP
thinkPHP模板中for循环与switch语句用法示例
2016/11/30 PHP
php实现将二维关联数组转换成字符串的方法详解
2017/07/31 PHP
PHP简单实现二维数组赋值与遍历功能示例
2017/10/19 PHP
javascript 框架小结 个人工作经验
2009/06/13 Javascript
Javascript下IE与Firefox下的差异兼容写法总结
2010/06/18 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
2013/09/02 Javascript
js中通过父级进行查找定位元素
2014/06/15 Javascript
JavaScript 变量、作用域及内存
2015/04/08 Javascript
原生JS实现幻灯片
2017/02/22 Javascript
MvcPager分页控件 适用于Bootstrap
2017/06/03 Javascript
JS验证码实现代码
2017/09/14 Javascript
详解使用jest对vue项目进行单元测试
2018/09/07 Javascript
Angular(5.2->6.1)升级小结
2018/12/27 Javascript
bootstrap-table实现表头固定以及列固定的方法示例
2019/03/07 Javascript
基于JS实现父组件的请求服务过程解析
2019/10/14 Javascript
node中短信api实现验证码登录的示例代码
2021/01/20 Javascript
[28:42]Ti4正赛VG vs NEWBEE1
2014/07/19 DOTA
用python 制作图片转pdf工具
2015/01/30 Python
python实现井字棋游戏
2020/03/30 Python
python操作oracle的完整教程分享
2018/01/30 Python
python实现连连看辅助(图像识别)
2020/03/25 Python
python 模拟银行转账功能过程详解
2019/08/06 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
2019/12/02 Python
《我为你骄傲》教学反思
2014/02/20 职场文书
英语故事演讲稿
2014/04/29 职场文书
学雷锋志愿者活动总结
2014/06/27 职场文书
爱护公物演讲稿
2014/09/09 职场文书
大学四年个人总结
2015/03/03 职场文书
2016年学校党支部创先争优活动总结
2016/04/05 职场文书
PHP基本语法
2021/03/31 PHP
详解Redis瘦身指南
2021/05/26 Redis
如何在pycharm中快捷安装pip命令(如pygame)
2021/05/31 Python
mysql备份策略的实现(全量备份+增量备份)
2021/07/07 MySQL