Piszę skrypt, który zautomatyzuje niektóre polecenia wiersza poleceń w Pythonie. W tej chwili wykonuję telefony tak:
cmd = "some unix command"
retcode = subprocess.call(cmd,shell=True)
Jednak muszę uruchomić niektóre polecenia na zdalnym komputerze. Ręcznie logowałem się za pomocą ssh, a następnie uruchamiałem polecenia. Jak mógłbym to zautomatyzować w Pythonie? Muszę zalogować się za pomocą (znanego) hasła do zdalnego komputera, więc nie mogę po prostu użyć cmd = ssh user@remotehost
, zastanawiam się, czy jest moduł, którego powinienem używać?
k = paramiko.RSAKey.from_private_key_file(keyfilename)
ALBO : LUBk = paramiko.DSSKey.from_private_key_file(keyfilename)
WTEDYssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
i na koniecssh..connect(hostname=host, username=user, pkey=k)
.def run_cmd(host, cmd):
które robi to, co chcesz, ale Twoje potrzeby ewoluują. W końcu zmieniasz pomocnika dla nowego przypadku użycia, co zmienia zachowanie starszego istniejącego użycia. Zaplanuj odpowiednio.Lub możesz po prostu użyć commands.getstatusoutput :
Używałem go intensywnie i działa świetnie.
W Pythonie 2.6+ użyj
subprocess.check_output
.źródło
Widziałeś Fabric ? Pozwala na wykonywanie wszelkiego rodzaju zdalnych rzeczy przez SSH przy użyciu Pythona.
źródło
Uważam, że paramiko jest trochę za niskopoziomowe, a Fabric nie jest specjalnie przystosowany do wykorzystania jako biblioteka, więc stworzyłem własną bibliotekę o nazwie spur, która używa paramiko do zaimplementowania nieco ładniejszego interfejsu:
Jeśli chcesz biegać wewnątrz powłoki:
źródło
spur
. Generujesz dodatkowe polecenia powłoki i otrzymujesz: który 'mkdir'> / dev / null 2> & 1; echo $ ?; exec 'mkdir' '-p' '/ data / rpmupdate / 20130207142923'. Chciałbym mieć również dostęp do zwykłegoexec_command
. Możliwość uruchamiania zadań w tle brakuje również:nohup ./bin/rpmbuildpackages < /dev/null >& /dev/null &
. Np. Generuję skrypt zsh (rpmbuildpackages) przy użyciu szablonu i po prostu zostawiam go uruchomionego na maszynie. Może przydałaby się również możliwość monitorowania takich zadań w tle (zapisywanie PIDów w jakimś ~ / .spur).spur
najwyraźniej działa tylko na systemach uniksowych, ponieważ jest zależny odtermios
. Czy ktoś zna dobrą bibliotekę dla systemu Windows?SshShell
powłoki istnieje teraz możliwość ustawienia typu powłoki. Jeśli przez przekazanie używana jest powłoka minimalna,shell_type=spur.ssh.ShellTypes.minimal
wysyłane jest tylko polecenie surowe. Wdrażanie zadań w tle bezpośrednio wydaje się być nieco poza zakresem Spur, ale powinieneś być w stanie uruchomić opisane polecenie, wywołując powłokę, npshell.run(["sh", "-c", "nohup ./bin/rpmbuildpackages < /dev/null >& /dev/null &"]
.).Nie komplikuj. Żadne biblioteki nie są wymagane.
źródło
Wszyscy już powiedzieli (zalecane) użycie paramiko i po prostu udostępniam kod Pythona (można powiedzieć API), który pozwoli ci wykonać wiele poleceń za jednym razem.
aby wykonać polecenia na innym węźle użyj:
Commands().run_cmd(host_ip, list_of_commands)
Dziękuję Ci!
źródło
Użyłem paramiko a bunch (nice) i pxssh (także fajnie). Poleciłbym też. Działają trochę inaczej, ale ich użycie jest stosunkowo duże.
źródło
paramiko w końcu zadziałało dla mnie po dodaniu dodatkowej linii, która jest naprawdę ważna (linia 3):
Upewnij się, że pakiet paramiko jest zainstalowany. Oryginalne źródło rozwiązania: Źródło
źródło
źródło
Działa świetnie...
źródło
Zaakceptowana odpowiedź nie zadziałała dla mnie, oto, czego użyłem:
Alternatywnie możesz użyć sshpass :
Źródła:
1. https://github.com/onyxfish/relay/issues/11
2. https://stackoverflow.com/a/61016663/797495
źródło
Spójrz na
spurplus
opakowanie, które opracowaliśmy,spur
które zawiera adnotacje typu i kilka drobnych sztuczek (ponowne łączenie SFTP, md5 itp .): Https://pypi.org/project/spurplus/źródło
Poproszenie Użytkownika o wpisanie komendy na urządzeniu, na którym się loguje.
Poniższy kod jest weryfikowany przez PEP8online.com.
źródło
Poniżej przykład, jeśli chcesz, aby użytkownik wprowadził nazwę hosta, nazwę użytkownika, hasło i numer portu.
źródło