Как рекурсивно скопировать полный каталог на удаленный сервер в Python (paramiko), используя SCP или SSH? - PullRequest
0 голосов
/ 23 октября 2018

У меня есть каталог, содержащий некоторые файлы и подкаталоги на моем локальном компьютере, который генерируется ежедневным скриптом Python.И затем я хочу скопировать все эти сгенерированные файлы в каталоге на сервер, а затем выполнить несколько команд для него с помощью ssh, используя пакет python paramiko.

Я хочу добавить небольшой код для безопасного копирования всего каталогаи файлы и подкаталоги внутри него на мой сервер через SSH / SCP, используя пакет python для paramiko.Я могу отправить отдельные файлы, используя один и тот же, но не могу отправить весь каталог и его содержимое, используя paramikoЭто дает мне IOError, говоря, что это каталог.

IOError: [Errno 21] Is a directory: 'temp'

Вот мой код:

from paramiko import SSHClient, AutoAddPolicy
from scp import SCPClient

class SSh(object):

    def __init__(self, address, username, password, port=22):
        print "Connecting to server."
        self._address = address
        self._username = username
        self._password = password
        self._port = port
        self.sshObj = None
        self.connect()
        self.scp = SCPClient(self.sshObj.get_transport())

    def sendCommand(self, command):
        if(self.sshObj):
            stdin, stdout, stderr = self.sshObj.exec_command(command)
            while not stdout.channel.exit_status_ready():
                # Print data when available
                if stdout.channel.recv_ready():
                    alldata = stdout.channel.recv(1024)
                    prevdata = b"1"
                    while prevdata:
                        prevdata = stdout.channel.recv(1024)
                        alldata += prevdata

                    print str(alldata)
        else:
            print "Connection not opened."

    def connect(self):
        try:
            ssh = SSHClient()
            ssh.set_missing_host_key_policy(AutoAddPolicy())
            ssh.connect(self._address, port=self._port, username=self._username, password=self._password, timeout=20, look_for_keys=False)
            print 'Connected to {} over SSh'.format(self._address)
            return True
        except Exception as e:
            ssh = None
            print "Unable to connect to {} over ssh: {}".format(self._address, e)
            return False
        finally:
            self.sshObj = ssh

if __name__ == "__main__":
    # Parse and check the arguments
    ssh = SSh('10.24.143.190', 'username', 'password')
    ssh.scp.put("Valigrind_BB.py") # This works perfectly fine
    ssh.scp.put("temp") # IOError over here Is a directory
    ssh.sendCommand('ls')

Заранее спасибо.

1 Ответ

0 голосов
/ 23 октября 2018

Глядя на исходный код для SCP, кажется, что вы можете передать параметр "recursive" как bool методу put (), чтобы указать рекурсивную передачу содержимого каталога. Здесь - ссылка на исходный код, о котором я говорю.Попробуйте изменить последнюю часть кода следующим образом:

if __name__ == "__main__":
    # Parse and check the arguments
    ssh = SSh('10.24.143.190', 'username', 'password')
    ssh.scp.put("Valigrind_BB.py") # This works perfectly fine
    ssh.scp.put("temp", recursive=True) # IOError over here Is a directory
    ssh.sendCommand('ls')

Кроме того, если вы просто хотите передать файлы, вы можете попробовать rsync в качестве альтернативы.Модификация вашего кода выше должна работать, хотя.Надеюсь, это поможет.

...