2014-04-02 219 views
1

我正在接受一個命令在遠程linux上執行的python腳本。我衝浪並找到了帕拉米科。我開發了一個腳本,如果命令如'','ps','ls'被執行的腳本。但是相同的腳本未能執行'top'和'ping'命令。 請幫我解決這個問題。命令執行使用paramiko

import paramiko 
import sys 

class sampleParamiko: 
    ssh = "" 
    def __init__(self, host_ip, uname, passwd): 
     try: 
      self.ssh = paramiko.SSHClient() 
      self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
      self.ssh.connect(host_ip, username=uname, password=passwd) 
      #print "In init function" 
     except (paramiko.BadHostKeyException, paramiko.AuthenticationException, paramiko.SSHException) as e: 
      print str(e) 
      sys.exit(-1) 

    def ececuteCmd(self,cmd): 
     try: 
      stdin, stdout, stderr = self.ssh.exec_command(cmd) 
      out_put = stdout.readlines() 
      for item in out_put: 
       print item, 
     except paramiko.SSHException as e: 
      print str(e) 
      sys.exit(-1) 
host_ip = "10.27.207.62" 
uname = "root" 
password = "linux" 
cmd = str(raw_input("Enter the command to execute in the host machine: ")) 
conn_obj = sampleParamiko(host_ip, uname, password) 
conn_obj.ececuteCmd(cmd) 

回答

2

你可能想看看的paramiko.SSHClientinvoke_shell()方法。

從你的代碼,你可以這樣做:

import paramiko 
import sys 

class sampleParamiko: 
    ssh = "" 
    def __init__(self, host_ip, uname, passwd): 
     try: 
      self.ssh = paramiko.SSHClient() 
      self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
      self.ssh.connect(host_ip, username=uname, password=passwd) 
      #print "In init function" 
     except (paramiko.BadHostKeyException, paramiko.AuthenticationException,  paramiko.SSHException) as e: 
      print str(e) 
      sys.exit(-1) 

    def ececuteCmd(self,cmd): 
     try: 
      channel = self.ssh.invoke_shell() 
      timeout = 60 # timeout is in seconds 
      channel.settimeout(timeout) 
      newline  = '\r' 
      line_buffer = '' 
      channel_buffer = '' 
      channel.send(cmd + ' ; exit ' + newline) 
      while True: 
       channel_buffer = channel.recv(1).decode('UTF-8') 
       if len(channel_buffer) == 0: 
        break 
       channel_buffer = channel_buffer.replace('\r', '') 
       if channel_buffer != '\n': 
        line_buffer += channel_buffer 
       else: 
        print line_buffer 
        line_buffer = '' 
     except paramiko.SSHException as e: 
      print str(e) 
      sys.exit(-1) 
host_ip = "10.27.207.62" 
uname = "root" 
password = "linux" 
cmd = str(raw_input("Enter the command to execute in the host machine: ")) 
conn_obj = sampleParamiko(host_ip, uname, password) 
conn_obj.ececuteCmd(cmd) 

輸出是:

[email protected]:~$ ./test_paramiko.py 
Enter the command to execute in the host machine: ping -c2 127.0.0.1 
ping -c2 127.0.0.1 ; exit 
[[email protected] ~]# ping -c2 127.0.0.1 ; exit 
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.032 ms 
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.043 ms 

--- 127.0.0.1 ping statistics --- 
2 packets transmitted, 2 received, 0% packet loss, time 999ms 
rtt min/avg/max/mdev = 0.032/0.037/0.043/0.008 ms 
logout 

但你不能以交互方式發送命令。所以如果你只是ping 127.0.0.1它會一直持續下去,直到你[CTRL] + [C]或殺死你的Python腳本。與top相同。

如果您想要一個交互式shell,請查看paramiko附帶的示例腳本。尤其是demos/demo.pydemos/interactive.py