Skrypt powłoki do logowania się na serwerze ssh

29

Próbowałem napisać skrypt powłoki, który może wykonać automatyczne logowanie do serwera ssh przy użyciu hasła wymienionego w skrypcie. Napisałem następujący kod:

set timeout 30
/usr/bin/ssh -p 8484 [email protected]
expect 
{
   "[email protected]'s password" 
   {
      send "password\r" 
   }
}

Ten kod nie działa poprawnie, wciąż prosi o hasło. Czy ktoś może mi pomóc w rozwiązaniu tego problemu

pradeepchhetri
źródło
2
Powiązane: hasło do su / sudo / ssh
Piotr Dobrogost
serverfault.com/questions/241588/…
Ciro Santilli 30 改造 中心 法轮功 六四 事件

Odpowiedzi:

36

Kiedyś napisałem expectskrypt, aby zalogować się na serwerze ssh (takim jak Twoja sprawa), a mój skrypt wyglądał mniej więcej tak:

#!/usr/bin/expect

spawn ssh [email protected]
expect "password"
send "MyPassword\r"
interact

Myślę, że może interactbrakuje tego w twoim skrypcie.

saeedn
źródło
to jest absolutnie w porządku pracy dla mnie i siedzę w tym miejscu, Interact zapewnia interaktywny terminala z wierszem, ale staram się zautomatyzować dalsze kroki jak zrobić więcej cdi lsi odczytać zawartość pliku, jak również. Czy można to zrobić po interakcji? Odpowiedz
Hansiemithun,
@ Hansie możesz wysłać lspolecenie po zalogowaniu. Na przykład po wysłaniu hasła wykonaj expecttekst wiersza polecenia (aby upewnić się, że jesteś zalogowany), a następnie send "ls\r". Wszystko to dzieje się wcześniej interact.
saeedn
pytanie było nieco niepoprawne i przepraszam po wykonaniu ls i przeczytaniu treści, jestem w stanie wydrukować to samo. Ale jak przenieść to z sesji ssh do zmiennej dostępnej z lokalnego komputera. ref: stackoverflow.com/questions/32341234/expect-script-return-value . Ale wydajność nie działa dla mnie. Moje pytanie pisał: stackoverflow.com/questions/51628465/... . Potrzebuję file_listpo wyjściu, aby uzyskać dostęp z lokalnego wiersza polecenia
Hansiemithun
31

Zrozumiesz to źle. To, co chcesz zrobić, to wygenerować parę kluczy ssh bez hasła, a następnie (o ile serwer obsługuje uwierzytelnianie za pomocą klucza RSA) możesz wejść bez konieczności wpisywania hasła dla wszystkich. Jest to zagrożenie bezpieczeństwa, jeśli klucz prywatny jest przechowywany w miejscu, w którym mógłby zostać skradziony.

Wykonaj następujące kroki:

  1. mkdir -p ~/.ssh
  2. cd ~/.ssh
  3. ssh-keygen -type dsa -i mysshkeys
  4. Naciśnij, Returngdy pojawi się monit o hasło
  5. Naciśnij Returndrugi raz, aby potwierdzić.

W twoim ~/.sshkatalogu będą teraz dwa pliki mysshkey.pubi mysshkey. mysshkey.pubto twój klucz publiczny, ten można bezpiecznie umieścić na zdalnych serwerach. mysshkeyjest Twój prywatny klucz podawania haseł, to nie jest bezpieczne, aby umieścić na serwerach zdalnych (lub gdzieś kogoś innego może dostać kopię).

Na serwerze chcesz SSH na:

  1. Zaloguj się do zdalnego serwera
  2. mkdir -p ~/.ssh
  3. Skopiuj i wklej zawartość mysshkey.pubdo~/.ssh/authorized_keys
  4. Upewnij się, że ~/.ssh/authorized_keysznaczy chmod„d600

Teraz, aby uruchomić go na komputerze lokalnym, uruchom następujące polecenie:

ssh -i ~/.ssh/mysshkey <remote_server_ip>

I będziesz zalogowany bez pytania o hasło.

Jest to o wiele lepsza metoda zarządzania automatycznymi logowaniami, ponieważ nie kończysz na twardym kodowaniu hasła w wielu miejscach, które wymagają aktualizacji, jeśli kiedykolwiek je zmienisz.

synthesizerpatel
źródło
2
Wolałbym używać kluczy RSA niż DSA. Ale poza tym w pełni się zgadzam.
glglgl
12
czasami nie można dodać kluczy do zdalnego hosta, np. urządzeń sieciowych.
DarkHeart
1
Próbowałem tego. ssh wciąż prosi o hasło. Czy konkretnie musisz podać adres IP? Wypróbowałem to zarówno z <użytkownik> @ <nazwa_domeny>, jak iz samą nazwą domeny.
Jay Bienvenu,
To polecenie powiedziało zbyt wiele argumentów? (dla kroku 3)
Joseph Astrahan
Musiałem zmienić na ssh-keygen -t dsa i zamiast tego ręcznie wprowadzić lokalizację pliku.
Joseph Astrahan,
20

W przypadku dystrybucji opartych na Debianie sshpasspakiet zapewnia łatwiejszy sposób robienia tego, co chcesz. Pakiet jest dostępny dla wielu innych popularnych dystrybucji. Najpierw musisz go skonfigurować:

echo 'YourPassword' > passwordFile.txt
chmod 600 passwordFile.txt

Następnie wywołaj polecenie SSH ze skryptu takiego jak ten:

sshpass -f /path/to/passwordFile.txt /usr/bin/ssh -p 8484 [email protected]

Zapewnia to większą elastyczność, na przykład w przypadku korzystania z innego ustawienia narodowego lub konieczności zmiany hasła, niż przy użyciu rozwiązań expect.

likeitlikeit
źródło
7

Najpierw zainstaluj sshPass sudo apt-get install sshpass

Następnie utwórz alias w pliku .bashrc jako

alias sshLogin='sshpass -p <your ssh password> ssh username@remote_host'

Teraz ponownie załaduj zmieniony plik .bashrc przez source ~/.bashrc

Skończyłeś.

Teraz możesz uruchomić ssh używając wyżej utworzonego aliasu sshLoginw terminalu.

bpathak
źródło
5

możesz użyć tego:

sshpass -p 'yourpassword'  ssh user@ip
Behrooz Mohamadi nasab
źródło
2

Wszystko, czego potrzebujesz, aby utworzyć klucz mieszający i zapisać go na komputerze

Po prostu wpisz

ssh-keygen -t rsa -b 4096 # just press Enter till the end

następnie wprowadź

ssh-copy-id <user>@<server>

następnie zaloguj się normalnie, używając

ssh <user>@<server>

Teraz nie potrzebujesz hasła

Uwaga: Zapisanie hasła w postaci zwykłego tekstu jest niebezpieczne

Ta metoda polega na tworzeniu zaszyfrowanej wartości hasła przy użyciu RSA z kluczem publicznym o długości 4096, co jest bardzo bezpieczne.

Mohammad Hizzani
źródło
1
To wydaje się być powtórzeniem tej odpowiedzi .
roaima
#roaima Tak, ale algo sugeruje niezwykle przydatne ssh-copy-idpolecenie, o którym nikt inny nie wspomniał. Głosuję za to.
Huw Walters
1

SSH Logowanie bez hasła za pomocą SSH Keygen w 5 łatwych krokach :

Konfiguracja środowiska: wprowadź opis zdjęcia tutaj

Krok 1: Uwierzytelnianie SSH-Kegen Keys on - (192.168.0.12)
Najpierw zaloguj się do serwera 192.168.0.12 z użytkownikiem i wygeneruj parę kluczy publicznych za pomocą następującego polecenia.

wprowadź opis zdjęcia tutaj

Krok 2: Utwórz katalog .ssh na - 192.168.0.11
Użyj SSH z serwera 192.168.0.12, aby połączyć się z serwerem 192.168.0.11, aby utworzyć katalog .ssh pod nim, używając następującej komendy.

wprowadź opis zdjęcia tutaj

Krok 3: Prześlij wygenerowane klucze publiczne do - 192.168.0.11
Użyj SSH z serwera 192.168.0.12 i załaduj nowy wygenerowany klucz publiczny (id_rsa.pub) na serwer 192.168.0.11 w .sshkatalogu użytkownika jako nazwa pliku klucze autoryzowane.

wprowadź opis zdjęcia tutaj

Krok 4: Ustaw uprawnienia na - 192.168.0.11
Ze względu na różne wersje SSH na serwerach, musimy ustawić uprawnienia do .sshkatalogu i authorized_keyspliku.

wprowadź opis zdjęcia tutaj

Krok 5: Zaloguj się z 192.168.0.12 do 192.168.0.11 Serwer bez hasła
Od teraz możemy zalogować się do 192.168.0.11 jako użytkownik sheena z serwera 192.168.0.12 jako użytkownik tecmint bez hasła.

wprowadź opis zdjęcia tutaj

Premraj
źródło
Dzięki ... to zadziałało dla mnie, z wyjątkiem tego, że w kroku 4 dostałem dramatyczne „ostrzeżenie”: „NIEPRAWIDŁOWY PRYWATNY KLUCZOWY PLIK! ... ... /. Ssh / id_rsa 'jest zbyt otwarty. ... klucz prywatny będzie zignorowano ... złe uprawnienia ". Zrobiłem to chmod 700 id_rsaw katalogu .ssh na lokalnym serwerze (klient, tj. 192.168.0.12 w twoim przykładzie): problem rozwiązany
Mike Rodent
2
Proszę nie publikować zdjęć tekstu .
roaima
1

Jak już opisano w innych odpowiedziach, również używam, sshpassale łączę to z readpoleceniem przechowywania hasła w tymczasowej zmiennej środowiskowej. W ten sposób moje hasło nigdy nie jest nigdzie zapisane. Oto polecenie, którego używam w jednym wierszu:

read -s PASS; sshpass -p $PASS ssh <user>@<host adress>

Następnie musisz wprowadzić hasło (nic nie pojawia się na ekranie), a następnie naciśnięcie enter otworzy połączenie.

Burzowy jeździec
źródło
0

Niedawno to zrobiłem, może ci to pomóc:

sshpass -p 'password' username@ipaddress

jeśli to nie zadziała, będziesz musiał wygenerować klucze na innym komputerze, z którym chcesz się połączyć

ssh-keygen

wygeneruje klucze prywatne i publiczne i poprosi o lokalizację, pozostaw puste, domyślnie zapisze klucze w folderze .ssh poprosi o podanie hasła, możesz też pozostawić puste puste w folderze .ssh i zmienić nazwa klucza publicznego na „klucze autoryzowane”

cd .ssh/
mv id_rsa.pub authorized_keys
useradd -d /home/username username

to doda użytkownika do listy, przejdź teraz do katalogu domowego i udziel uprawnienia i zrestartuj usługi sshd

chmod 700 /home/username/.ssh
chmod 644 /home/username/.ssh/authorized_keys
chown root:root /home/dozee
sudo service sshd restart

teraz będziesz musiał przenieść klucz prywatny do systemu w tej lokalizacji, z której chcesz uruchomić polecenie ssh, a następnie możesz połączyć się z

sshpass -p 'password' ssh -i id_rsa username@ip

jeśli nawet to nie działa, wejdź do / etc / ssh otwórz sshd_config z edytorem vim sprawdź, czy pubkeyAuthenticatoin jest ustawiony na tak, czy nie, jeśli nie zmienisz go na tak, zrestartuj usługi sshd, a następnie spróbuj, to na pewno będzie działać .

Utkarsh Gupta
źródło
0

Pierwszy argument to nazwa hosta, a drugi to hasło.

     #!/usr/bin/expect
     set pass [lindex $argv 1]
     set host [lindex $argv 0]
     spawn ssh -t root@$host echo Hello
     expect "*assword: "
     send "$pass\n";
     interact

Wykonanie: ./script.expect

Shivam Mehrotra
źródło