Paramiko不执行命令或shell - Python

1 投票
1 回答
4105 浏览
提问于 2025-04-17 15:49

我正在使用Paramiko库在两台服务器之间运行ssh命令。我的"主"服务器是一个Fedora 18的机器,而我的"从"服务器是一个Windows 7的电脑。为了在Windows 7上运行ssh服务器,我安装了FreeSSHd。在配置好freesshd后,我可以从Fedora 18机器通过ssh连接到Windows机器,并执行像dir这样的命令。

但是,当我尝试使用Paramiko时,就没有那么顺利了:

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']

有人能告诉我为什么不行吗?我是不是漏掉了什么?

1 个回答

5

cmd = ["cd ..", "dir" ] 替换成 cmd = ['cmd.exe /c "cd C:\ && dir"' ]

撰写回答