Połącz się przez SSH i wpisz hasło automatycznie, bez użycia klucza publicznego

20

Serwer zezwala na połączenia SSH, ale nie korzysta z uwierzytelniania za pomocą klucza publicznego. W tej chwili nie jestem w stanie zmienić tego (z powodu trudności technicznych, a nie organizacyjnych), ale załatwię to jak najszybciej!

Co muszę teraz jest do wykonywania poleceń na serwerze przy użyciu zwykłego stare konto + hasło uwierzytelniania ze skryptu . To znaczy, muszę to zrobić w sposób nieinteraktywny. Czy to możliwe? Jak mam to zrobić?

Klient, który będzie wykonywał skrypt, uruchomi Ubuntu Server 8.04. Serwer obsługuje Cygwin i OpenSSH.

Usunięte
źródło
2
Jakie są trudności techniczne z włączeniem uwierzytelniania opartego na kluczach? Być może powinieneś zadać to pytanie zamiast lub dodatkowo do tego.
Zoredache
1
Pytam o to :-) serverfault.com/questions/125842/... Po prostu potrzebuję teraz drogi ucieczki, ponieważ od jakiegoś czasu waliłem w nią głową. Ale oczywiście moim celem jest, aby działał na dłuższą metę.
Usunięte

Odpowiedzi:

22

Istnieje narzędzie linux o nazwie sshpass. Pozwala ci robić dokładnie to, co chcesz i pobierze hasło serwera albo jako argument wiersza poleceń, albo z pliku (wolę w ten sposób, aby moje hasło do serwera nie było wyświetlane w historii powłoki) i używasz go tak:

sshpass -f file_with_password ssh user@server ls -la

Spowoduje to ssh na serwerze i uruchomienie ls -la. Jedną rzeczą jest jednak ręczne ręczne ssh na serwerze (jeśli jeszcze tego nie zrobiłeś), aby serwer został dodany do twojego ~/.ssh/known_hosts. Jeśli tego nie zrobisz, sshpassnie będzie działać.

solefald
źródło
2
To nie jest standardowa część OpenSSH i dosłownie żadna z moich maszyn (Mac OS X 10.7, Ubuntu 12.04, FreeBSD 8, Debian 3.1) nie ma go ...
voretaq7
@ voretaq7: sshpass to projekt SourceForge: sourceforge.net/projects/sshpass
kevinarpe
1
@KCArpe Myślę, że przegapiłeś mój punkt („Cały świat nie jest twoją maszyną z Linuksem - spróbuj wybrać rozwiązania, które działają w innych miejscach”). Korzystanie ze SSH_ASKPASSzmiennej jest bardziej ogólnym rozwiązaniem, które działa w każdym systemie z OpenSSH i nie wymaga instalowania dodatkowego oprogramowania. Dla niektórych z nas (w regulowanych branżach) instalowanie nowego oprogramowania wymaga dużo pracy administracyjnej.
voretaq7
@ voretaq7 Korzystanie SSH_ASKPASSnie działa we wszystkich systemach. Nawet jeśli klient go obsługuje, nie będzie działać, jeśli serwer go używa keyboard-interactive. Tak naprawdę napotkałem ten problem podczas pisania skryptu w celu dystrybucji authorized_keyspliku na wiele wbudowanych maszyn.
kasperd
8

Aby to zrobić, możesz użyć opcji Oczekuj . Oczywiście nie jest to preferowane z punktu widzenia bezpieczeństwa, ponieważ będzie wymagało użycia skryptu zawierającego hasło w postaci zwykłego tekstu. (Ale nie będę omawiać tej kwestii, ponieważ powiedziałeś w swoim pytaniu, że planujesz jak najszybciej zastosować uwierzytelnianie za pomocą klucza publicznego!)

Mox
źródło
Wygląda na to, że rozwiąże mój problem! Sprawdzę to jutro. To nie jest ostateczne rozwiązanie, ale oferuje pewne bezpieczeństwo. Kiedy o tym myślę, jeśli użytkownik skryptu jest jedynym, który może czytać skrypt. Wtedy będzie tak bezpieczny, jak mój klucz prywatny, który jest również „tylko” chroniony przez uprawnienia systemu plików. A może coś przeoczyłem?
Usunięte
Wrócę jutro z wynikami. :-) Dziękuje za odpowiadanie!
Usunięte
Wydaje się, że działa. Ale sshpass był łatwiejszy dla tego konkretnego przypadku IMHO.
Usunięto
7

Zależy trochę od używanego języka skryptowego. Piszę teraz prawie wszystko w pythonie, gdzie nie jest to problem. Zarówno pyssh, jak i Paramiko pozwalają po prostu napisać hasło bez kłopotów.

Jeśli zamierzasz to zrobić za pomocą skryptów (ba) sh i używać OpenSSH, staje się to trudniejsze. OpenSSH wyraźnie zapobiega wprowadzaniu haseł w wierszu poleceń (ponieważ wszyscy użytkownicy widzą wiersz poleceń za pomocą czegoś takiego ps -fe, co jest złym mojo). W takim przypadku będziesz musiał bezpośrednio współpracować z programem ssh i mieć dwie opcje:

  • Możesz napisać znaczną ilość kodu pomocniczego, używając czegoś takiego jak Expect.
  • Robisz włamanie za pomocą zmiennej SSH_ASKPASS, mówiąc jej, aby zadzwoniła do aplikacji zwracającej twoje hasło i uruchomiła to wszystko jako zadanie wsadowe, aby zapobiec odczytowi z terminala.
pehrs
źródło