2013-02-13 203 views
0

我正在使用Paramiko庫在兩臺服務器之間運行ssh命令。 我的"Master"服務器是一個Fedora 18框,而我的"Slave"Windows 7機器。在其他運行服務器的Windows 7機器上,我安裝了FreeSSHd。配置好freesshd後,我可以將Fedora 18機器上的ssh裝入Windows機器並執行一條命令,如dir。 然而,當我嘗試這樣做使用Paramiko,我不具有相同的運氣:Paramiko不執行命令或shell - Python

import paramiko 
import os 
import errno 

""" 
written by Philippe Ribeiro 

class Connection 
stabilishes the ssh connection between two servers 
allowing the executing of commands remotely 
""" 
class Connection: 

    def __init__(self, hostname, username, password): 
     """Create a ssh client using the paramiko library 
     """ 
     self.host = hostname 
     self.user = username 
     self.password = password 
     self.port = 23 
     self.sshclient = paramiko.SSHClient() 
     self.username = username 
     self.password = password 

     try:   
      self.sshclient.load_system_host_keys() 
      self.sshclient.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 

      self.sshclient.connect(hostname=self.host, port=self.port, 
        username=self.username, password=self.password) 

      self.sftpclient = self.sshclient.open_sftp() 

     except SSHException, e: 
      print e 

     except AuthenticationException, e: 
      print e 

     except BadHostKeyException, e: 
      print e 

    def close(self): 
     """Closes a client using the Connection class' API 
     """ 
     self.sshclient.close() 
     return 

    def remove_directory(self, path): 
     """Remove remote directory that may contain files 
     It does not support directories that contain subdiretories 
     """ 
     if self.exists(path): 
      for filename in self.sftpclient.listdir(path): 
       filepath = os.path.join(path, filename) 
       self.sfptclient.remove(filepath) 
      self.sftpclient.rmdir(path) 

     return 

    def exists(self, path): 
     """Return True if the remote path exists 
     """ 
     try: 
      self.sfptclient.stat(path) 

     except IOError, e: 
      if e.errno == errno.ENOENT: 
       return False 
       raise 
      else: 
       return True 

    def put_directory(self, localdir, remotedir): 
     """Put a directory of files on the remote server 
     Create the remote directory if it does not exist 
     Does not support directories that contain subdirectories 
     Return the number of files transferred 
     """ 
     if not self.exists(remotedir): 
      self.sftp.client.mkdir(remotedir) 
     count = 0 
     for filename in os.listdir(localdir): 
      self.sftpclient.put(
        os.path.join(localdir, filename), 
        os.path.join(remotedir, filename) 
      ) 
      count += 1 
     return count 

""" 
Just for testing purposes 
try to connect to a Windows machine from a Unix one 
so it can execute commands remotely 
""" 
cmd = ["cd ..", "dir" ] 
client = Connection("hostname", "username", "password") 

try: 
    for c in cmd: 
      stdin, stdout, stderr = client.sshclient.exec_command(c) 
      print stdout.readlines() 

except SSHException, e: 
    print e 

client.close() 

,但是當我執行:

python client.py 

我得到:

['Unable to execute command or shell on remote system: Failed to Execute process.\r\n'] 
['Unable to execute command or shell on remote system: Failed to Execute process.\r\n'] 

莫非有人請給我一個線索爲什麼不工作?我錯過了什麼嗎?

回答

4

更換cmd = ["cd ..", "dir" ]cmd = ['cmd.exe /c "cd C:\ && dir"' ]

+0

很好的例子@Yevgen。只是澄清 - 例如,如果您的當前目錄是在驅動器上的字母D,並且您想要cd到C:\,所以'cmd = ['cmd.exe/c「c:&& dir'']'。沒有cd和反斜槓 – Nafscript 2014-12-18 19:28:57