设为首页 收藏本站
查看: 881|回复: 0

[经验分享] python小白之paramiko(1)

[复制链接]

尚未签到

发表于 2018-8-10 11:28:49 | 显示全部楼层 |阅读模式
  楼主python小白一枚,无任何编程经验。近期研究python自动化运维技术与最佳实践,今天在看paramiko模块,依葫芦画瓢,实现了两个小程序,分享如下!
  首先,简单介绍下paramiko这个模块。paramiko是基于python实现的SSH2远程安全连接、支持认证及密钥方式,实现远程命令执行,文件传输,中间ssh代理等,相对Pexpect,封装的层次更高,更贴近SSH协议的功能。
  安装的话,采用pip安装即可,指令很简单:pip install paramiko
  当然,前提需要配置好pip。
  废话不多说,上代码:
  1、示例1:
  该代码读取当前目录下commands.txt(该文件记录需要执行的命令)文件的内容,并进行处理,返回命令行列表,然后在main()函数中直接调用paramiko模块相关方法,顺次执行文件中的命令,并打印出输出结果。
  [root@cenos paramiko]# more simple1.py
  #!/usr/bin/python
  import sys
  import os
  import paramiko
  def get_cmds(fp='commands.txt'):
  if os.path.isfile(fp) and os.access(fp,os.R_OK):
  f = open(fp,'rb')
  lines = f.readlines()
  f.close()
  cmds = map(lambda x:x.rstrip(),lines)
  return cmds
  else:
  sys.exit()
  return None
  def main():
  if len(sys.argv) == 4:
  host = sys.argv[1]
  user = sys.argv[2]
  passwd = sys.argv[3]
  else:
  print "Usage:%s host user passwd"%(sys.argv[0])
  sys.exit()
  paramiko.util.log_to_file('syslogin.log')
  ssh = paramiko.SSHClient()
  ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  ssh.connect(hostname=host,username=user,password = passwd)
  cmds = get_cmds()
  for cmd in cmds:
  stdin,stdout,stderr = ssh.exec_command(cmd)
  print stdout.read()
  ssh.close()
  if __name__ == "__main__":
  main()
  在该示例中,commands.txt文件的内容如下(可以根据自己实际需要将命令写入这个文件即可,无需修改原始代码):
  [root@cenos paramiko]# more commands.txt
  free -m
  uptime
  uname -a
  df -h
  who
  指令结果如下:
  [root@cenos paramiko]# ./simple1.py
  Usage:./simple1.py host user passwd   #远程server的主机名,用户名,密码通过命令行参数输入,此处未给定,直接输出了用法提示。
  [root@cenos paramiko]# ./simple1.py 192.168.0.200 root 123456
  total        used        free      shared  buff/cache   available
  Mem:            984          96         733           6         154         728
  Swap:          3967           0        3967
  18:33:17 up 1 day,  4:38,  1 user,  load average: 0.00, 0.01, 0.05
  Linux admin-node 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

  Filesystem          >  /dev/mapper/cl-root   36G  1.4G   34G   4% /
  devtmpfs             482M     0  482M   0% /dev
  tmpfs                493M     0  493M   0% /dev/shm
  tmpfs                493M  6.8M  486M   2% /run
  tmpfs                493M     0  493M   0% /sys/fs/cgroup
  /dev/sda1           1014M  139M  876M  14% /boot
  tmpfs                 99M     0   99M   0% /run/user/0
  root     tty1         2017-10-16 09:09
  该例子比较简单,如果需要在多台服务器上同时执行指令,可以把远程主机信息通过字典的格式存入列表,通过循环顺次执行。此处不再赘述,楼主自己也没有码相关的代码。
  2、示例2:
  该代码首先筛选出给定目录下(含子目录)后缀为.py的所有文件,并将文件名称存入列表;然后通过tar_files函数将文件打包,最后通过put_files函数将打包文件上传到远端服务器,而put_files函数使用了paramiko的put方法。
  [root@cenos paramiko]# more simple2.py
  #!/usr/bin/python
  import sys
  import os
  import tarfile
  import datetime
  import paramiko
  def get_files(dir_path,files=[]):
  for name in os.listdir(dir_path):
  full_path = os.path.join(dir_path,name)
  if os.path.isfile(full_path) and os.path.splitext(full_path)[1]=='.py':
  files.append(full_path)
  if os.path.isdir(full_path):
  get_files(full_path,files)
  return files
  def tar_files(files,dst):
  if isinstance(files,list):
  tar = tarfile.open(dst,'w:gz')
  for file in files:
  tar.add(file)
  tar.close()
  else:
  sys.exit()
  def put_files(host,user,passwd,localpath,remotepath):
  tran = paramiko.Transport((host,22))
  tran.connect(username=user,password=passwd)
  sftp = paramiko.SFTPClient.from_transport(tran)
  sftp.put(localpath,remotepath)
  tran.close()
  def main():
  try:
  files = get_files('/root/python')
  suffix = datetime.datetime.now().strftime("%Y%m%d%H%M")
  dst = "/tmp/tar_%s.tar.gz"%(suffix)
  tar_files(files,dst)
  remotepath = dst
  put_files('192.168.0.200','root','123456',dst,remotepath)
  except Exception,e:
  print str(e)
  sys.exit()
  if __name__ == "__main__":
  main()
  执行该脚本:
  [root@cenos paramiko]# ./simple2.py
  本端主机上的压缩文件
  [root@cenos tmp]# pwd
  /tmp
  [root@cenos tmp]# ls -al *.tar.gz
  -rw-r--r--  1 root root    56884 Oct 20 17:55 tar_201710201755.tar.gz
  -rw-r--r--  1 root root    56884 Oct 20 18:41 tar_201710201841.tar.gz
  -r--r--r--. 1 root root 60654199 Sep 25  2016 VMwareTools-9.6.0-1294478.tar.gz
  远端主机上的压缩文件:
  [root@admin-node ~]# cd /tmp
  [root@admin-node tmp]# ls -al *.tar.gz
  -rw-r--r-- 1 root root 27179 Oct 16 11:40 tar_201710161140.tar.gz
  -rw-r--r-- 1 root root 27179 Oct 16 12:14 tar_201710161214.tar.gz
  -rw-r--r-- 1 root root 56884 Oct 20 17:55 tar_201710201755.tar.gz
  -rw-r--r-- 1 root root 56884 Oct 20 18:41 tar_201710201841.tar.gz
  完美实现文件的压缩和上传,哈哈!
  今天仅仅学习了paramiko的SSHClient和SFTPClient两个类,也仅仅了解了最基本的使用方法,后续再学习,再更新,与各位共勉!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-549618-1-1.html 上篇帖子: python rabbitmq no_ack=false 下篇帖子: 26. Python 对 mysql 的操作
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表