какой самый простой способ ssh с использованием python?

<p>как я могу просто подключиться к удаленному серверу по ssh из локального скрипта python (3.0), ввести логин/пароль, выполнить команду и распечатать вывод на консоль python?</p><p>я бы предпочел не использовать какую-либо большую внешнюю библиотеку или устанавливать что-либо на удаленный сервер.</p>

<p>я не пробовал, но этот модуль <a href="http://pypi.python.org/pypi/pysftp/">pysftp</a> может помочь, который, в свою очередь, использует paramiko. я верю, что все на стороне клиента.</p><p>интересная команда, вероятно, <code>.execute()</code>, которая выполняет произвольную команду на удаленной машине. (модуль также имеет методы <code>.get()</code> и <code>.put</code>, которые ссылаются больше на его символ ftp).</p><p>обновление:</p><p>я переписал ответ после того, как сообщение в блоге, на которое я изначально ссылался, больше не доступно. некоторые из комментариев, которые ссылаются на старую версию этого ответа, теперь будут выглядеть странно.</p>

<p>вы можете написать его самостоятельно, используя paramiko, как предложено выше. кроме того, вы можете посмотреть на fabric, приложение на python для выполнения всего, о чем вы спрашивали:</p><blockquote> <p>fabric - это библиотека python и инструмент командной строки, предназначенный для оптимизировать развертывание приложений или выполнение задач системного администрирования через протокол ssh. это обеспечивает инструменты для запуска произвольной оболочки команды (либо как обычный логин пользователь, либо через sudo), загрузка и загрузка файлов и пр.</p> </blockquote><p>я думаю, что это соответствует вашим потребностям. это также небольшая библиотека, которая не требует установки сервера, хотя в ней есть зависимости от paramiko и pycrypt, которые требуют установки на клиенте.</p><p>раньше приложение было <a href="http://www.nongnu.org/fab/">здесь</a> . теперь его можно найти <a href="http://docs.fabfile.org/0.9/">здесь</a> .</p><pre><code>* the official, canonical repository is git.fabfile.org * the official github mirror is github/bitprophet/fabric </code></pre><p>есть несколько хороших статей об этом, хотя вы должны быть осторожны, потому что он изменился за последние шесть месяцев:</p><p> <a href="http://lethain.com/entry/2008/nov/04/deploying-django-with-fabric/">развертывание django с тканью</a> </p><p> <a href="http://www.clemesha.org/blog/modern-python-hacker-tools-virtualenv-fabric-pip/">инструменты современного python hacker: virtualenv, fabric и pip</a> </p><p> <a href="http://lincolnloop.com/blog/2008/dec/07/simple-easy-deployment-fabric-and-virtualenv/">простое и легкое развертывание с fabric и virtualenv</a> </p><hr><p>позже: fabric больше не требует paramiko для установки:</p><pre><code>$ pip install fabric downloading/unpacking fabric downloading fabric-1.4.2.tar.gz (182kb): 182kb downloaded running setup.py egg\_info for package fabric warning: no previously-included files matching '*' found under directory 'docs/\_build' warning: no files found matching 'fabfile.py' downloading/unpacking ssh>=1.7.14 (from fabric) downloading ssh-1.7.14.tar.gz (794kb): 794kb downloaded running setup.py egg\_info for package ssh downloading/unpacking pycrypto>=2.1,!=2.4 (from ssh>=1.7.14->fabric) downloading pycrypto-2.6.tar.gz (443kb): 443kb downloaded running setup.py egg\_info for package pycrypto installing collected packages: fabric, ssh, pycrypto running setup.py install for fabric warning: no previously-included files matching '*' found under directory 'docs/\_build' warning: no files found matching 'fabfile.py' installing fab script to /home/hbrown/.virtualenvs/fabric-test/bin running setup.py install for ssh running setup.py install for pycrypto ... successfully installed fabric ssh pycrypto cleaning up... </code></pre><p>однако это в основном косметическое средство: ssh - это ветвь paramiko, сопровождающий для обеих библиотек один и тот же (джефф форсьер, также автор fabric), и <a href="http://bitprophet.org/blog/2012/09/29/paramiko-and-ssh/">сопровождающий планирует воссоединить paramiko и ssh под именем paramiko</a> . (это исправление через <a href="https://stackoverflow.com/users/687980/pbanka">pbanka</a> .)</p>

<p>если вы хотите избежать каких-либо дополнительных модулей, вы можете использовать модуль подпроцесса для запуска</p><pre><code>ssh [host] [command] </code></pre><p>и захватить вывод. </p><p>попробуйте что-то вроде:</p><pre><code>process = subprocess.popen("ssh example.com ls", shell=true, stdout=subprocess.pipe, stderr=subprocess.stdout) output,stderr = process.communicate() status = process.poll() print output </code></pre><p>чтобы работать с именами пользователей и паролями, вы можете использовать подпроцесс для взаимодействия с процессом ssh или установить открытый ключ на сервере, чтобы избежать запроса пароля.</p>

<p>я написал <a href="http://www.no-ack.org/2010/11/python-bindings-for-libssh2.html">привязки python для libssh2</a> . libssh2 - это библиотека на стороне клиента, реализующая протокол ssh2.</p><pre><code>import socket import libssh2 sock = socket.socket(socket.af\_inet, socket.sock\_stream) sock.connect(('exmaple.com', 22)) session = libssh2.session() session.startup(sock) session.userauth\_password('john', '******') channel = session.channel() channel.execute('ls -l') print channel.read(1024) </code></pre>

<p>здесь важно ваше определение «простейшего» - простой код означает использование модуля (хотя «большая внешняя библиотека» - это преувеличение).</p><p>я считаю, что самый современный (активно разработанный) модуль - это <a href="http://www.lag.net/paramiko/">paramiko</a> . он поставляется с демонстрационными сценариями при загрузке и содержит подробную документацию по api. вы также можете попробовать <a href="http://pexpect.sourceforge.net/pxssh.html">pxssh</a> , который содержится в <a href="http://sourceforge.net/projects/pexpect/">pexpect</a> . там краткий образец вместе с документацией по первой ссылке. </p><p>опять же, что касается простоты, обратите внимание, что хорошее обнаружение ошибок всегда сделает ваш код более сложным, но вы должны иметь возможность повторно использовать много кода из примеров сценариев, а затем забыть об этом.</p>

<p>как hughdbrown, мне нравится fabric. обратите внимание, что, хотя он реализует свои собственные декларативные сценарии (для развертывания и тому подобное), он также может быть импортирован как модуль python и использоваться в ваших программах без необходимости написания сценария fabric.</p><p>ткань имеет нового сопровождающего и находится в процессе переписывания; это означает, что большинство учебных пособий, которые вы (в настоящее время) найдете в интернете, не будут работать с текущей версией. кроме того, google по-прежнему показывает старую страницу fabric в качестве первого результата. </p><p>для получения актуальной документации вы можете проверить: <a href="http://docs.fabfile.org">http://docs.fabfile.org</a> </p>

<p>я обнаружил, что paramiko слишком низкоуровневый, и fabric не особенно подходит для использования в качестве библиотеки, поэтому я собрал свою собственную библиотеку под названием <a href="http://pypi.python.org/pypi/spur">spur</a> , которая использует paramiko для реализации немного более приятного интерфейса:</p><pre><code>import spur shell = spur.sshshell(hostname="localhost", username="bob", password="password1") result = shell.run(["echo", "-n", "hello"]) print result.output # prints hello </code></pre><p>вы также можете распечатать выходные данные программы во время ее работы, что полезно, если вы хотите увидеть выходные данные долго выполняющихся команд до ее выхода:</p><pre><code>result = shell.run(["echo", "-n", "hello"], stdout=sys.stdout) </code></pre>

<p>для пользы тех, кто достигает здесь googling для примера python ssh .. оригинальный вопрос и ответ уже почти старый декодер . кажется, что paramiko получил немного функциональности (хорошо. я признаю - просто угадай здесь - я новичок в python) и ты можешь создать ssh-клиент напрямую с paramiko.</p><pre><code>import base64 import paramiko client = paramiko.sshclient() client.set\_missing\_host\_key\_policy(paramiko.autoaddpolicy()) client.connect('192.168.1.1', username='user', password='password') stdin, stdout, stderr = client.exec\_command('cat /proc/meminfo') for line in stdout: print('... ' + line.strip('\n')) client.close() </code></pre><p>этот код был адаптирован из демо <a href="https://github.com/paramiko/paramiko">https://github.com/paramiko/paramiko</a> он работает для меня.</p>

<p>это сработало для меня</p><pre><code>import subprocess import sys host="ip" command="ifconfig" def passwordless\_ssh(host): ssh = subprocess.popen(["ssh", "%s" % host, command], shell=false, stdout=subprocess.pipe, stderr=subprocess.pipe) result = ssh.stdout.readlines() if result == []: error = ssh.stderr.readlines() print >>sys.stderr, "error: %s" % error return "error" else: return result </code></pre>

<p><code>please refer to paramiko.org, its very useful while doing ssh using python.</code></p><p>импорт парамико</p><p>время импорта</p><p>ssh = paramiko.sshclient () #sshclient () является объектом paramiko</p><p>'' 'в следующих строках ключ сервера автоматически добавляется в файл know\_hosts.</p><h1>ssh.load\_system\_host\_keys ()</h1><p>ssh.set\_missing\_host\_key\_policy (paramiko.autoaddpolicy ())</p><p>пытаться:</p><h1>здесь мы фактически подключаемся к серверу.</h1><pre><code>ssh.connect('10.106.104.24', port=22, username='admin', password='') time.sleep(5) </code></pre><p><code>i have mentioned time because some servers or endpoint prints there own information after loggin in e.g. the version, model and uptime information, so its better to give some time before executing the command.</code></p><p><code>here we execute the command, stdin for input, stdout for output, stderr for error</code></p><pre><code>stdin, stdout, stderr = ssh.exec\_command('xstatus time') </code></pre><h1>здесь мы читаем строки из вывода.</h1><pre><code>output = stdout.readlines() print(output) </code></pre><p><code>below all are the exception handled by paramiko while ssh. refer to paramiko.org for more information about exception.</code></p><p>кроме (badhostkeyexception, authenticationexception,<br> sshexception, socket.error) как e:</p><pre><code>print(e) </code></pre>

<p>взгляните на <a href="https://github.com/parquery/spurplus">spurplus</a> , обертку вокруг <a href="https://github.com/mwilliamson/spur.py">spur</a> и <a href="http://www.paramiko.org/">paramiko</a> , которую мы разработали для управления удаленными машинами и выполнения файловых операций.</p><p>spurplus предоставляет функцию <code>check\_output()</code> "из коробки":</p><pre><code>import spurplus with spurplus.connect\_with\_retries( hostname='some-machine.example.com', username='devop') as shell: out = shell.check\_output(['/path/to/the/command', '--some\_argument']) print(out) </code></pre>