Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1783076
  • 博文数量: 297
  • 博客积分: 285
  • 博客等级: 二等列兵
  • 技术积分: 3006
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-06 22:04
个人简介

Linuxer, ex IBMer. GNU https://hmchzb19.github.io/

文章分类

全部博文(297)

文章存档

2020年(11)

2019年(15)

2018年(43)

2017年(79)

2016年(79)

2015年(58)

2014年(1)

2013年(8)

2012年(3)

分类: Python/Ruby

2016-09-30 11:35:30

1. 第一个使用sudo 来run commands. 

点击(此处)折叠或打开

  1.     ssh=paramiko.SSHClient()
  2.     ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  3.     ssh.connect("127.0.0.1",username="root",password='password')
  4.     stdin,stdout,stderr=ssh.exec_command("sudo -k netstat -tnlp",get_pty=True)
  5.     stdin.write('password\n')
  6.     stdin.flush()
  7.     #print(dir(stdout))
  8.     data=stdout.read(65536).decode()
  9.     print(data)
2.  远程备份mysql , 先在remote 机器上执行mysqldump 命令,然后再把这个dump.sql 文件用sftp 远程拷贝回来。我觉得很奇怪,mysqldump 生成的文件在/root的家目录,意味着如果用其他用户执行mysqldump,会在其他用户的家目录生成dmp.sql文件。当然来而不往非礼也,我也把本地的一个文件拷贝到远端,为了玩玩sftp的 put 方法。

点击(此处)折叠或打开

  1. # Execute mysqldump
  2.     cmd="mysqldump -u{0} -p{1} --all-databases --single-transaction > dump.sql".format(mysql_user,mysql_pw)
  3.     ssh=paramiko.SSHClient()
  4.     ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  5.     ssh.connect("127.0.0.1",username="root",password='password')
  6.     chan=ssh.get_transport().open_session()
  7.     chan.exec_command(cmd)
  8.     timestamp=str(int(time.time()))
  9.     newname="/tmp/{}".format(timestamp)
  10.     if chan.recv_exit_status()==0:
  11.         ftp=ssh.open_sftp()
  12.         ftp.get("/root/dump.sql",newname)
  13.         ftp.put(localpath="requirements-dev.txt",remotepath="/tmp/requirements-dev.txt",confirm=True)
  14.         ftp.close()
3. 这个比较搞,我模拟了wall 的命令执行方法,首先 wall \n,然后输入一行str, 'lol\n', 最后再模拟用户输入的CTRL+D, 就是EOF。 
参考了很多   的回复,表示感谢

点击(此处)折叠或打开

  1. ssh=paramiko.SSHClient()
  2.     ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  3.     ssh.connect("127.0.0.1",username="kobe",password='Netf1n1ty')
  4.     #stdin,stdout,stderr=ssh.exec_command("wall",get_pty=True)
  5.     stdin,stdout,stderr=ssh.exec_command("wall",get_pty=True)
  6.     stdin.write('lol\n')
  7.     #stdin.write(bytearray([0x4]))
  8.     #stdin.channel.send(bytearray([0x4]))
  9.     stdin.write(bytes([0x4]))
  10.     #stdin.channel.send(b'0x4')
  11.     #stdin.write(b'0x4')
  12.     #stdin.flush()
  13.     #print(dir(stdout))
  14.     print(stdout.channel.recv_exit_status())
  15.     data=stdout.read(1024).decode()

  16.     print(data)

4. 这个代码我是从别人那里看来的。使用select 来判断是否已经读完了,很不错。select 和Epoll 作为底层的系统调用,是做file descriptor multiplex 的成熟工具了。
虽然epoll 要比select 高效很多,当然我也并不清楚python的select 到底用的是epoll 还是select 系统调用。
原始代码地址在这里:

点击(此处)折叠或打开

  1. import sys
  2. import time
  3. import select
  4. import paramiko

  5. host='127.0.0.1'
  6. i = 1

  7. #
  8. # Try to connect to the host.
  9. # Retry a few times if it fails.
  10. #
  11. while True:
  12.     print ("Trying to connect to %s (%i/30)" % (host, i))

  13.     try:
  14.         ssh = paramiko.SSHClient()
  15.         ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  16.         ssh.connect('127.0.0.1',username='root',password='password')
  17.         print ("Connected to %s" % host)
  18.         break
  19.     except paramiko.AuthenticationException:
  20.         print ("Authentication failed when connecting to %s" % host)
  21.         sys.exit(1)
  22.     except:
  23.         print ("Could not SSH to %s, waiting for it to start" % host)
  24.         i += 1
  25.         time.sleep(2)

  26.     # If we could not connect within time limit
  27.     if i == 3:
  28.         print ("Could not connect to %s. Giving up" % host)
  29.         sys.exit(1)

  30. # Send the command (non-blocking)
  31. stdin, stdout, stderr = ssh.exec_command("echo good; sleep 3; echo yes ; sleep 3;ls -al /dev")

  32. # Wait for the command to terminate
  33. while not stdout.channel.exit_status_ready():
  34.     # Only print data if there is data to read in the channel
  35.     if stdout.channel.recv_ready():
  36.         rl, wl, xl = select.select([stdout.channel], [], [], 0.0)
  37.         if len(rl) > 0:
  38.             # Print data from stdout
  39.             print (stdout.channel.recv(65535).decode(),end="")
  40.             #print (stdout.channel.readlines())
  41. #
  42. # Disconnect from the host
  43. #
  44. print ("Command done, closing SSH connection")
  45. ssh.close()


阅读(2294) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~