1

Paramikoライブラリを使用して、ssh2台のサーバー間でコマンドを実行しています。私の"Master"サーバーはFedora 18ボックスであり、私のサーバー"Slave"Windows 7マシンです。sshマシンでサーバーを実行する他の方法では、 FreeSSHdWindows 7をインストールしました。構成後、Fedora 18マシンからWindowsマシンに移動して、のようなコマンドを実行できます。ただし、を使用してこれを実行しようとすると、同じ運がありません。freesshdsshdirParamiko

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

1 に答える 1

5

に置き換えcmd = ["cd ..", "dir" ]ますcmd = ['cmd.exe /c "cd C:\ && dir"' ]

于 2013-02-14T03:13:57.403 に答える