Pytanie Jaki jest najprostszy sposób na SSH przy użyciu Pythona?


Jak mogę po prostu połączyć się z serwerem zdalnym za pomocą lokalnego skryptu Python (3.0), podać login / hasło, wykonać polecenie i wydrukować dane wyjściowe na konsolę Python?

Wolałbym nie używać żadnej dużej zewnętrznej biblioteki lub instalować czegokolwiek na zdalnym serwerze.


76
2017-08-05 14:34


pochodzenie




Odpowiedzi:


Nie próbowałem tego, ale to pysftp moduł może pomóc, który z kolei korzysta z paramiko. Wierzę, że wszystko jest po stronie klienta.

Prawdopodobnie interesujące polecenie .execute() który wykonuje dowolne polecenie na zdalnej maszynie. (Moduł zawiera również .get() i .put metody, które bardziej przypominają jego charakter FTP).

AKTUALIZACJA:

Ponownie napisałem odpowiedź po tym, jak blog, z którym pierwotnie linkowałem, nie jest już dostępny. Niektóre komentarze odnoszące się do starej wersji tej odpowiedzi będą teraz wyglądać dziwnie.


38
2017-08-05 14:49



Dobre znalezisko! Tak długo, jak nie będziesz dbał o dostosowywanie odpowiedzi na błędy, ta dodatkowa abstrakcja będzie bardzo przydatna. - Cascabel
Moduł ssh zrobił lewę. Proste i działa dobrze. Brak przeszukiwania interfejsu API Paramiko. - Christopher Tokar
Link do pliku ssh.py wewnątrz podanego linku jest uszkodzony: / - dgorissen
Tak, możemy uzyskać nowy link. Znalazłem ssh.py na github, ale to nie to samo (i nie tak dobre) - jdborg
Pakiet pysftp zapewnia tylko SFTP. Daleko od klienta SSH. - bortzmeyer


Możesz napisać to sam, używając Paramiko, jak zasugerowano powyżej. Alternatywnie możesz zajrzeć do Fabric, aplikacji pythonowej do robienia wszystkich rzeczy, o które pytasz:

Fabric jest biblioteką Pythona i   narzędzie wiersza polecenia zaprojektowane dla   usprawnienie wdrażania aplikacji lub   wykonywanie zadań administracyjnych systemu   za pośrednictwem protokołu SSH. To zapewnia   narzędzia do uruchamiania dowolnej powłoki   polecenia (zarówno jako normalne logowanie   użytkownik lub przez sudo), przesyłanie i   pobieranie plików i tak dalej.

Myślę, że to pasuje do twoich potrzeb. Nie jest to również duża biblioteka i nie wymaga instalacji serwera, chociaż ma zależności od paramiko i pycrypt, które wymagają instalacji na kliencie.

Aplikacja była kiedyś tutaj. Teraz można go znaleźć tutaj.

* The official, canonical repository is git.fabfile.org
* The official Github mirror is GitHub/bitprophet/fabric

Jest na niej kilka dobrych artykułów, ale powinieneś być ostrożny, ponieważ zmienił się w ciągu ostatnich sześciu miesięcy:

Wdrażanie Django z Fabric

Narzędzia współczesnego hakera Pythona: Virtualenv, Fabric i Pip

Proste i łatwe wdrożenie z Fabric i Virtualenv


Później: Tkanina nie wymaga już instalacji paramiko:

$ 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...

Jest to jednak w większości kosmetyczne: ssh jest widelcem paramiko, opiekun obu bibliotek jest taki sam (Jeff Forcier, także autor Fabric), oraz opiekun ma plany ponownego połączenia paramiko i ssh pod nazwą paramiko. (Ta korekta za pośrednictwem pbanka.)


60
2017-08-05 15:00



Ponieważ wydaje się to interesujący link, chciałbym go zaktualizować, ponieważ teraz Twoja jest zepsuta. proszę użyć: clemesha.org/blog/... - dlewin
Dzięki. Naprawiono link 404. - hughdbrown
Czy osoba pytająca nie zaznaczyła, że ​​nie chce używać "dużej biblioteki zewnętrznej"? Paramiko i Fabric są zarówno przesadne, gdy wszystkie autor naprawdę poprosił o to prosty jednorazowy przepis ssh. - Zoran Pavlovic
@Zoran Pavlovic: wszystkie odpowiedzi dotyczyły instalacji lokalnego pakietu (paramiko, fabric, ssh, libssh2) lub użycia podprocesu do uruchomienia ssh. To ostatnie rozwiązanie nie jest instalowane, ale nie sądzę, aby spawnięcie ssh było świetnym pomysłem, a także PO, ponieważ wybrał odpowiedź na instalację modułu ssh. Dokumenty te mówią: "ssh.py zapewnia trzy typowe operacje SSH, get, put i execute. Jest to abstrakcja na wysokim poziomie dla Paramiko." Więc jeśli nie preferujesz libssh2, który jest ciężki przy kodowaniu, nie ma zaleceń zgodnych. Opowiadam się za dobrym rozwiązaniem, gdy nie można w sposób racjonalny spełnić warunków PO. - hughdbrown


Jeśli chcesz uniknąć dodatkowych modułów, możesz uruchomić moduł podprocesu

ssh [host] [command]

i przechwytuj wynik.

Spróbuj czegoś takiego:

process = subprocess.Popen("ssh example.com ls", shell=True,
    stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output,stderr = process.communicate()
status = process.poll()
print output

Aby poradzić sobie z nazwami użytkowników i hasłami, możesz użyć podprocesu do interakcji z procesem ssh, lub możesz zainstalować klucz publiczny na serwerze, aby uniknąć monitu o hasło.


22
2017-08-05 15:05



Ale co, jeśli klient jest w systemie Windows? - Nathan
Podanie hasła może być trudne sshpodproces za pośrednictwem potoku. Widzieć Dlaczego po prostu nie użyć rury (popen ())?. Możesz potrzebować pty, pexpect moduły do ​​obejścia tego. - jfs
nie wydaje się działać dla ciągu `ssh somecomputer; python -c "import numpy; print numpy .__ version__" "mówi, że nie zna polecenia" import " - usethedeathstar
@usethedeathstar: zawiń całe polecenie w cudzysłowie: ssh somecomputer 'python -c "zaimportuj to, wydrukuj to"' - Neil


napisałem Powiązania Pythona dla biblioteki libssh2. Libssh2 to biblioteka po stronie klienta implementująca protokół SSH2.

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)

16
2018-02-28 12:51



Wydaje się bardzo niski poziom. Na przykład (własny przykład), musisz wyraźnie powiedzieć, że używasz IPv4 lub IPv6 (coś, czego nie musisz robić z klientem linii poleceń OpenSSH). Ponadto nie znalazłem sposobu, aby to działało z ssh-agent. - bortzmeyer
Dobrą rzeczą w Pylibssh2 jest to, że przesyła pliki WAY szybciej niż jakakolwiek natywna implementacja Pythona z ssh jak paramiko. - Damien


Wasza definicja "najprostszy" jest tutaj ważna - prosty kod oznacza użycie modułu (choć "duża biblioteka zewnętrzna" jest przesadą).

Uważam, że najbardziej aktualnym (aktywnie opracowanym) modułem jest paramiko. Zawiera skrypty demo do pobrania i zawiera szczegółową dokumentację API online. Możesz także spróbować PxSSH, który jest zawarty w pexpect. Jest krótki próbka wraz z dokumentacją na pierwszym łączu.

Ponownie w odniesieniu do prostoty zauważ, że dobre wykrywanie błędów zawsze sprawi, że Twój kod będzie wyglądał na bardziej złożony, ale powinieneś być w stanie wykorzystać wiele kodu z przykładowych skryptów, a następnie o tym zapomnieć.


8
2017-08-05 14:44





Podobnie jak Hughdbrown, lubię Fabric. Zauważ, że chociaż implementuje własne deklaratywne skrypty (do tworzenia wdrożeń i tym podobne), może być również importowany jako moduł Pythona i używany w twoich programach bez konieczności pisania skryptu Fabric.

Tkanina ma nowego opiekuna i jest w trakcie przepisywania; oznacza to, że większość samouczków (aktualnie) znajdujących się w Internecie nie będzie działać z bieżącą wersją. Ponadto Google nadal pokazuje starą stronę Fabric jako pierwszy wynik.

W celu uzyskania aktualnej dokumentacji możesz sprawdzić: http://docs.fabfile.org


6
2017-08-06 10:08



Tkanina używa widelca paramiko pypi.python.org/pypi/ssh dla wszystkich rzeczy ssh. - Damien


Zauważyłem, że paramiko jest trochę za niski, a Fabric nie jest specjalnie dostosowany do wykorzystania jako biblioteka, więc stworzyłem własną bibliotekę ostroga który używa paramiko do implementacji nieco ładniejszego interfejsu:

import spur

shell = spur.SshShell(hostname="localhost", username="bob", password="password1")
result = shell.run(["echo", "-n", "hello"])
print result.output # prints hello

Możesz także wybrać wydruk wyjściowy programu w trakcie jego działania, co jest przydatne, jeśli chcesz zobaczyć dane wyjściowe długotrwałych poleceń przed ich wyjściem:

result = shell.run(["echo", "-n", "hello"], stdout=sys.stdout)

6
2018-01-10 21:47



Nie obsługuje uruchamiania niestandardowych poleceń, na przykład na niektórych routerach (MikroTik) polecenia są poprzedzone przedrostkiem "/", biblioteka ta zgłasza błąd. Dla standardowych hostów Linuxa wydaje się jednak całkiem niezły. - Babken Vardanyan
Kiedy przekazuję adres IP do nazwy hosta, generuje komunikat o tym, że nie znaleziono adresu IP w known_hosts ... - rexbelia
@rexbelia Jest to normalne zachowanie SSH: aby upewnić się, że rozmawiasz z właściwym serwerem, SSH zaakceptuje klucz tylko z hosta, jeśli jest już znany. Rozwiązaniem jest dodanie odpowiedniego klucza do znanych_hostów lub ustawienie argumentu missing_host_key na odpowiednią wartość, zgodnie z opisem w dokumentacji. - Michael Williamson