ITPub博客

首页 > 应用开发 > IT综合 > 【python】python 模块学习之--pexpect

【python】python 模块学习之--pexpect

原创 IT综合 作者:小亮520cl 时间:2016-08-18 13:53:14 0 删除 编辑

基础例子:

拷贝数据
  1. >>> import pexpect
  2. >>> child=pexpect.spawn('scp /home/chenliang/oradba.perl root@218.78.186.162:/home/chenliang/')            -----启动程序
  3. >>> child.expect('(?i)password:')                                                                          -----匹配密码,expect正则表达式,表示匹配的意思
  4. 0
  5. >>> child.sendline('XXXXXXXXX')                                                                            ------发送密码,sendline 发送命令
  6. 9
检查:拷贝成功
[root@localhost /home/chenliang ]# ls
1.txt  2.txt  oradba.perl  test.txt

ssh目标机器并创建一个文件
  1. >>> import pexpect
  2. >>> tar=pexpect.spawn('ssh root@218.78.186.162')
  3. >>> tar.expect('(?i)password:')
  4. 0
  5. >>> tar.sendline('ESBecs00')                               ####sendline 发送密码
  6. 9
  7. >>> tar.sendline('touch /home/chenliang/tar.txt')          ####sendline 发送命令
  8. 30
检查:成功
[root@localhost /home/chenliang ]# ls
1.txt  2.txt  oradba.perl  tar.txt  test.txt

run命令
  1. 和 os.system一样调用系统命令
  2. >>> run('touch /home/chenliang/run.txt')
  3. ''


练习一
  1. ssh并执行命令
    1. [root@hostnfsd :/soft/python]$ more test2.py
    2. #ssh_cmd.py
    3. #coding:utf-8

    4. import pexpect
    5. import sys
    6. ip='218.78.186.162'
    7. user='root'
    8. passwd='XXXXX'
    9. cmd='df -h'
    10. def ssh_cmd(vip,vuser,vpassword,vcmd):
    11.         child=pexpect.spawn('ssh %s@%s %s' % (vuser, vip,vcmd))
    12.         r = ''
    13.         child.expect('(?i)password:')
    14.         child.sendline(vpassword)
    15.         r = child.read()
    16.         return r

    17. print ssh_cmd(ip, user, passwd, cmd)

    [root@hostnfsd :/soft/python]$ python test2.py 
     
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/mapper/VolGroup-lv_root
                           18G   15G  1.7G  90% /
    tmpfs                 1.9G  8.0K  1.9G   1% /dev/shm
    /dev/xvda1            485M  119M  341M  26% /boot
    /dev/mapper/vgu01-lvu01
                           20G  3.2G   16G  17% /home
    /dev/mapper/vgu01-lvu02
                           30G   33M   30G   1% /back


  2. 向多台机器ssh并执行多个命令
    1. 稍微修改一下就好了
    2. #!/usr/bin/python
      import pexpect


      def ssh_cmd(ip, user, passwd, cmd):
          ssh = pexpect.spawn('ssh %s@%s "%s"' % (user, ip, cmd))
          r = ''
          ssh.expect('(?i)password:')
          ssh.sendline(passwd)
          r = ssh.read()
          return r


      hosts = '''
      218.78.186.162:root:xxxx:df -h,uptime,tar -zcf /home/chenliang/tar.txt.tar.gz  /home/chenliang/tar.txt;
    3. 218.78.186.163:root:xxxx:df -h,uptime,tar -zcf /home/chenliang/tar.txt.tar.gz  /home/chenliang/tar.txt;
      '''


      for host in hosts.split("\n"):
          if host:
              ip, user, passwd, cmds = host.split(":")
              for cmd in cmds.split(","):
                  print "-- %s run:%s --" % (ip, cmd)
                  print ssh_cmd(ip, user, passwd, cmd)


    4. 运行结果
      1. [root@hostnfsd :/soft/python]$ python test1.py
      2. -- 218.78.186.162 run:df -h --
      3.  
      4. Filesystem Size Used Avail Use% Mounted on
      5. /dev/mapper/VolGroup-lv_root
      6.                        18G 15G 1.7G 90% /
      7. tmpfs 1.9G 8.0K 1.9G 1% /dev/shm
      8. /dev/xvda1 485M 119M 341M 26% /boot
      9. /dev/mapper/vgu01-lvu01
      10.                        20G 3.2G 16G 17% /home
      11. /dev/mapper/vgu01-lvu02
      12.                        30G 33M 30G 1% /back

      13. -- 218.78.186.162 run:uptime --
      14.  
      15.  13:28:27 up 57 days, 1 min, 1 user, load average: 0.10, 0.11, 0.03

      16. -- 218.78.186.162 run:tar -zcf /home/chenliang/tar.txt.tar.gz /home/chenliang/tar.txt; --




  3. 更完整版
    1. #ssh_cmd.py
    2. #coding:utf-8

    3. import pexpect

    4. def ssh_cmd(ip, user, passwd, cmd):
    5.     ssh = pexpect.spawn('ssh %s@%s "%s"' % (user, ip, cmd))
    6.     r = ''
    7.     try:
    8.         i = ssh.expect(['password: ', 'continue connecting (yes/no)?'])
    9.         if i == 0 :
    10.             ssh.sendline(passwd)
    11.         elif i == 1:
    12.             ssh.sendline('yes')
    13.     except pexpect.EOF:
    14.         ssh.close()
    15.     else:
    16.         r = ssh.read()
    17.         ssh.expect(pexpect.EOF)
    18.         ssh.close()
    19.     return r

    20. hosts = '''
    21. 218.78.186.162:root:XXXXXX:df -h,uptime,tar -zcf /home/chenliang/tar.txt.tar.gz /home/chenliang/tar.txt;
    22. '''

    23. for host in hosts.split("\n"):
    24.     if host:
    25.         ip, user, passwd, cmds = host.split(":")
    26.         for cmd in cmds.split(","):
    27.             print "-- %s run:%s --" % (ip, cmd)
    28.             print ssh_cmd(ip, user, passwd, cmd)


练习二:

  1. ssh远程机器 并tar文件再传回本地
    1. #!/usr/bin/python
    2. import pexpect
    3. import sys
    4. ip='218.78.186.162'
    5. passwd='XXXXXXX'
    6. user='root'
    7. cmd='gzip /home/chenliang/tar.txt'
    8. source_dir='/home/chenliang/'
    9. def ssh_m(vip,vuser,vpassword,vcmd):
    10.         child=pexpect.spawn('ssh %s@%s %s' % (vuser, vip,vcmd))
    11.         r = ''
    12.         child.expect('(?i)password:')
    13.         child.sendline(vpassword)
    14.         r = child.read()
    15.         child.sendline('exit')
    16.         return r

    17. def scp_m(vip,vuser,vpassword,source_dir):
    18.         child=pexpect.spawn('scp %s@%s:/home/chenliang/tar.txt.gz %s' % (vuser, vip,source_dir))
    19.         r = ''
    20.         child.expect('(?i)password:')
    21.         child.sendline(vpassword)
    22.         r = child.read()
    23.         child.sendline('exit')
    24.         return r

    25. print ssh_m(ip, user, passwd, cmd)
    26. print scp_m(ip, user, passwd,source_dir)


疑问:
  1. [root@hostnfsd :/soft/python]$ more test3.py
  2. #!/usr/bin/python
  3. import pexpect
  4. import sys
  5. ip='218.78.186.162'
  6. user='root'
  7. passwd='ESBecs00'
  8. cmd='touch /home/chenliang/111t'
  9. def ssh_cmd(vip,vuser,vpassword,vcmd):
  10.         child=pexpect.spawn('ssh %s@%s ' % (vuser, vip))        ----####如果将cmd移到下面
  11.         r = ''
  12.         child.expect('(?i)password:')
  13.         child.sendline(vpassword)
  14.         child.sendline('%s'%vcmd)                               ------#####命令移到这个部分,会tm的执行失败,还不知道为什么
  15.         r = child.read() 
  16.         return r

  17. print ssh_cmd(ip, user, passwd, cmd)

。。。待续

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29096438/viewspace-2123669/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
毕业以后专业任职数据库工程师职位,itpub一直作为自己的笔记记录的地方,blog写的不详细,草书笔记,仅供参考!

注册时间:2013-09-12

  • 博文量
    529
  • 访问量
    1127021