Соединение SSH с Python 3.0

Как я могу установить SSH-соединение в Python 3.0? Я хочу сохранить файл на удаленном компьютере, где у меня настроен SSH без пароля.


person Steven Hepting    schedule 04.06.2009    source источник


Ответы (6)


Я рекомендую вызывать ssh как подпроцесс. Это надежно и портативно.

import subprocess
proc = subprocess.Popen(['ssh', 'user@host', 'cat > %s' % filename],
                        stdin=subprocess.PIPE)
proc.communicate(file_contents)
if proc.retcode != 0:
    ...

Вам придется беспокоиться о цитировании имени файла назначения. Если вам нужна большая гибкость, вы можете даже сделать это:

import subprocess
import tarfile
import io
tardata = io.BytesIO()
tar = tarfile.open(mode='w:gz', fileobj=tardata)
... put stuff in tar ...
proc = subprocess.Popen(['ssh', 'user@host', 'tar xz'],
                        stdin=subprocess.PIPE)
proc.communicate(tardata.getvalue())
if proc.retcode != 0:
    ...
person Dietrich Epp    schedule 04.06.2009
comment
proc.communicate (tardata) говорит, что TypeError: должно быть строкой или буфером, а не _io.BytesIO - person monty0; 11.09.2013
comment
тогда у tardata.getvalue() есть ваш ответ - person Dietrich Epp; 11.09.2013

Первый:

Два шага для входа через ssh без пароля

в вашем терминале

[macm@macm ~]$  ssh-keygen
[macm@macm ~]$  ssh-copy-id -i $HOME/.ssh/id_rsa.pub [email protected] <== change

Теперь с питоном

from subprocess import PIPE, Popen

cmd = 'uname -a'
stream = Popen(['ssh', '[email protected]', cmd],
                    stdin=PIPE, stdout=PIPE)

rsp = stream.stdout.read().decode('utf-8')
print(rsp)
person macm    schedule 09.08.2013

Вы хотите, чтобы вся функциональность ssh была реализована в виде библиотеки Python? Взгляните на paramiko, хотя я думаю, что он не портирован на Python 3.0 (пока?).

Если вы можете использовать существующую установку ssh, вы можете использовать subprocess способ, описанный Дитрихом, или (другой способ) вы также можете использовать pexpect (здесь).

person ChristopheD    schedule 04.06.2009
comment
Этот OP запросил вариант Python 3, но вы все равно упомянули paramiko. Но я согласен, что отрицательное голосование незаслуженно, учитывая, что это еще не все, что вы сказали. Простите меня. - person tshepang; 10.01.2013
comment
на домашней странице paramiko теперь указано, что она также работает с python 3.3+. Цитата: Paramiko - это Python (2.6+, 3.3+) реализация протокола SSHv2 [1], обеспечивающая как клиентскую, так и серверную функциональность ... - person klaas; 22.09.2014

Это может занять немного времени, потому что "twisted: conch" не работает похоже, есть вариант 3.0.

person Richard    schedule 04.06.2009

Я написал привязки Python для libssh2, которые работать на Python 2.4, 2.5, 2.6, 2.7 и 3.

person Sebastian Noack    schedule 28.02.2011

libssh2 отлично работает с Python 3.x.
См. эту статью о переполнении стека Как отправить файл с помощью scp с помощью python 3.2?

person Don    schedule 06.05.2013
comment
Документация отсутствует. Ссылки на странице проекта pypi мертвы! - person exhuma; 03.12.2013