Jak SSH w jednej linii

26

Jak połączyć się z innym komputerem za pośrednictwem SSH w jednej linii? Gdybym miał to zrobić ssh host@IP, wymagałoby to wpisania hasła w drugiej linii. Myślałem, że mogę zrobić coś takiego:, ssh host@IP | echo passwordale to wstawia hasło przed zapytaniem o hasło.

Ben A.
źródło
3
Tego rodzaju myślenie wywodzi się z czasów telnetu i spodziewaj się, że Internet był bezpieczniejszym miejscem. Odpowiedź Allena jest prawidłowa, odpowiedź Jakuje jest prawdą techniczną, ale w większości miejsc nie jest narzędziem do pracy.
Criggie
3
To dobre pytanie dotyczące konfiguracji logowania bez hasła. Poproszę o ponowne sprawdzenie zaakceptowanej odpowiedzi. Która odpowiedź Jakuje - jest poprawna i zadziała, właściwym sposobem jest użycie kluczy SSH, opisanych w odpowiedzi Allana.
Scot
Gdyby sshodczytał hasło ze standardowego wejścia, echo password | ssh host@IPdziałałoby, ale zwykle SSH próbuje odczytać bezpośrednio z terminala.
Paŭlo Ebermann

Odpowiedzi:

82

Powinieneś używać kluczy SSH do uwierzytelniania, zamiast umieszczać hasło w linii poleceń, ponieważ jest to bardzo niebezpieczne.

Działa to po skonfigurowaniu kluczy SSH, wystarczy wydać polecenie:

ssh user@host

i bez wpisywania innej rzeczy, zostaniesz automatycznie zalogowany.


Skopiuj klucz publiczny SSH na Mac / FreeBSD / Linux z macOS

Zakłada się, że masz dostęp do zdalnego serwera za pomocą uwierzytelniania opartego na haśle (wpisując hasło) i że już wygenerowałeś klucz prywatny / publiczny (jeśli nie, patrz poniżej). W poniższym przykładzie używamy RSA. Na początek skopiujmy klucz (pamiętaj, że katalog „home” różni się między macOS, Linux, BSD itp.):

Za pomocą SCP:

scp ~/.ssh/id_rsa.pub username@hostname:/Users/username/.ssh/

Lub po prostu cat-plik do authorized_keys(wolę tę metodę):

cat id_rsa.pub | ssh username@hostname ' cat >>.ssh/authorized_keys'

(Twoja nazwa klucza może się różnić) Jeśli katalog .ssh nie istnieje na serwerze zdalnym, musisz się zalogować i utworzyć.

Teraz klucz został skopiowany z komputera Mac na zdalny serwer. Ustaw prawidłowe uprawnienia do klucza publicznego SSH na zdalnym serwerze:

chmod 600  ~/.ssh/id_rsa.pub

Następnie dodaj klucz do pliku autoryzowanych kluczy SSH, jeśli plik nie istnieje, utwórz go.

Jeśli plik authorized_keysjuż istnieje, ~/.sshużyj następującego polecenia:

cat id_rsa.pub >> authorized_keys

Jeśli plik nie istnieje, wprowadź następujące polecenia:

cat id_rsa.pub > authorized_keys

chmod 600 authorized_keys
chown user:group authorized_keys


Wygeneruj klucz publiczny / prywatny SSH na macOS

Otwórz Terminal, przechodząc do Aplikacje -> Narzędzia -> Terminal

W terminalu użyj następującego polecenia, aby rozpocząć generowanie klucza

ssh-keygen -t rsa

Następnie zostaniesz poproszony o podanie lokalizacji, w której chcesz utworzyć plik klucza prywatnego:

Wprowadź plik, w którym chcesz zapisać klucz ( /Users/username/.ssh/id_rsa):

Pozostaw to puste, aby utworzyć klucz w domyślnej lokalizacji, czyli /Users/username/.ssh/id_rsa. Plik klucza publicznego zostanie utworzony w tej samej lokalizacji i pod tą samą nazwą, ale z rozszerzeniem .PUB.

Po pojawieniu się monitu o wybranie hasła. To hasło jest opcjonalne, aby użyć klucza prywatnego.

Enter passphrase (empty for no passphrase):

Twój klucz SSH został wygenerowany.

Pamiętaj, że jeśli wpiszesz hasło, będziesz musiał je wprowadzić przy każdym połączeniu. Narzędzie ssh-agentzachowa hasło w pamięci, eliminując potrzebę ręcznego wprowadzania go za każdym razem, gdy łączysz się podczas tej samej sesji. Aby uzyskać więcej informacji zobaczman ssh-agent

Allan
źródło
6
Absolutnie to - klucze mogą i powinny całkowicie zastąpić hasła dostępu do ssh przez Internet. Sugeruję, abyś rozwinął potrzebę bezpieczeństwa klucza prywatnego, który nie jest czymś, na czym można polegać na wszystkich twoich komputerach.
Criggie
+1 To jest naprawdę dobra odpowiedź, nie tylko z powodu tego, co mówi, ale także z powodu tego, jak to wyjaśniłeś. Wszystko, co użytkownicy mogą łatwiej obserwować i które pomaga im być bezpieczniejszym, to plus w moich książkach!
Monomeeth
7
Świetna odpowiedź. Chciałem tylko dodać, że ssh-copy-idto miłe narzędzie do automatyzacji niektórych z powyższych.
Scot
Pomocna może być również wzmianka o ssh-agent . Większość (wszystkich?) Wersji systemu OS X / macOS jest dostarczanych wraz z nim i umożliwia logowanie bez hasła, nawet gdy klucz jest chroniony hasłem.
Qsigma,
1
@Scot - domyślnie nie jest częścią macOS i musi być zainstalowany przez Homebrew lub MacPorts . Nie jestem fanem instalowania oprogramowania, ponieważ można to zrobić w jednym wierszu lub w krótkim, napisanym przez siebie skrypcie iz tych powodów myślałem, że wykracza to poza zakres odpowiedzi. Jest to jednak dobra mała użyteczność i warto o tym wspomnieć.
Allan
13

Istnieje kilka możliwości. Twój przykład oczywiście nie zadziała, ale możesz osiągnąć coś podobnego za pomocą sshpassnarzędzia:

sshpass -p password ssh host@IP

Uwaga: nie jest to zalecane, ponieważ passwordbędzie widoczne dla innych procesów lub w historii powłoki.

Znacznie lepszym sposobem na zrobienie tego samego jest skonfigurowanie uwierzytelniania bez hasła przy użyciu kluczy SSH. W skrócie:

ssh-keygen -t rsa -f ~/.ssh/id_rsa
ssh-copy-id IP
Jakuje
źródło
Próbowałem sshpasszgodnie z zaleceniami, ale napisano, że polecenie nie zostało znalezione.
Ben A.
8
Cóż ... Prawdopodobnie będziesz musiał go zainstalować. I nie, nie polecam tego. Skonfiguruj uwierzytelnianie bez hasła za pomocą kluczy SSH.
Jakuje
4
@BenA. skonfiguruj uwierzytelnianie bez hasła, definiując publiczną / prywatną klawiaturę i konfigurując ją na obu zaangażowanych komputerach. To o wiele łatwiejsze (i faktycznie bezpieczniejsze) niż jakiekolwiek hasło
nohillside
8
Tysiąc razy nie. sshpass to brudny hack używany do łączenia się z urządzeniami, które mówią ssh, ale nie robią poprawnie klawiszy, a jego głównym zastosowaniem są skrypty instalacyjne. Nie użyjesz sshpass na maszynie wielu użytkowników ps auxw | grep sshpass , powie innym użytkownikom hasło ssh.
Criggie
1
@ Criggie, nie do końca. Chociaż jestem w 100% za rozwiązaniem opartym na kluczach, mam sshpass na kilku wewnętrznych Raspberry Pis (do losowych zadań i dostępnych przez losowych klientów; przekazywanie kluczy tylko do użytku wewnętrznego jest kłopotliwe). Uruchamiając polecenie daje następujący wynik: pi@sshbox:~ $ ps auxw | grep sshpass pi 4891 0.0 0.3 2256 1560 pts/0 S+ 06:29 0:00 sshpass -p zzzzzzzz ssh [email protected]. To zzzzzzzzjest dosłowne; sshpass maskuje treść hasła. Być może wcześniejsze iteracje były mniej świadome prywatności.
flith
3

Długo też szukałem odpowiedzi na to pytanie. Mimo że jest to niepewne i wszystkie te osoby mówią ci, abyś używał kluczy RSA ( co jest bezpieczniejszym i niezawodnym pomysłem ), jest całkiem możliwe.

Użyj expectdo tego programu. Spodziewaj się, że obejrzy dla ciebie stdout (i myślę, że stderr, jeśli poprawnie skonfigurowany), czekając na pewne wiadomości i odpowiadając na nie za pomocą wyjścia. Spodziewaj się, że sam jest językiem skryptowym, a kiedy robiłem to samo, bardzo ciężko mi było uruchomić mój własny skrypt ze względu na czas. Spodziewaj się jednak również przydatnego narzędzia o nazwie autoexpect.

Dzięki autoexpect będzie cię obserwować i wygenerować dla Ciebie skrypt oczekiwań. Po prostu uruchom autoexpect i odpowiednie polecenie:

autoexpect ssh host@ip 

i rób to, co normalnie. Po wyjściu z programu (przez wpisanie exitpowłoki ssh'd) wygeneruje on skrypt. Jeśli nie chcesz, aby cały skrypt, który piszesz, był skryptem oczekiwanym, możesz edytować skrypt z autoexpect (wywoływany script.exp), aby wyjść przed wpisaniem exitpolecenia w powłoce. Linia, którą chcesz przenieść, aby zmienić zakończenie skryptu, to:

expect eof

co oznacza oczekiwanie końca pliku. Mam nadzieję że to pomoże!

Allan
źródło
1
W przypadku, gdy nikt inny tego jeszcze nie powiedział: Witamy w Zapytaj Innego!
Synoli
2

Używanie expectjest po prostu niewłaściwe, aby zalogować się do połączenia ssh dla czegokolwiek innego niż w zestawie testowym.

To, czego szuka @ ben-a, jest już zaimplementowane w ssh. Sztuka polega na tym, jak go używać. Więc oto idzie:

  1. Wygeneruj klucz publiczny / prywatny za pomocą ssh-keygen. Użyj ECDSA lub RSA jako -t(lub typu), a dla RSA użyj 2048 lub 4096 jako -b(lub długości BITS). To powinno wystarczyć w momencie pisania. ZAWSZE używaj HASŁA!
  2. Skorzystaj z ssh-copy-idwyżej wymienionej metodologii, aby utworzyć na komputerze, na którym logujesz się (inaczej serwer) ~/.ssh/authorized_keysplik. Wewnątrz znajduje się kopia właśnie wygenerowanego klucza publicznego.
  3. Teraz na komputerze, którego używasz do logowania się na „serwerze” (lub kliencie), otwierasz plik ~/.ssh/config. Jeśli nie istnieje, możesz go utworzyć.
  4. W tym pliku dodajesz następujące dla swoich potrzeb

    host <name you want to use for this connection>
        Hostname <DNS or IP of the server>
        user <user name you want to use>
        identitiesonly yes
        identityfile <path to the private key>
    
  5. Możesz teraz użyć tylko ssh <name>do skonfigurowania połączenia, ale nadal będzie ono wymagało hasła do twojego klucza. Aby rozwiązać ten problem, użyj opracowanego do tego celu i dołączonego ssh-agent. Aby dodać swój klucz do agenta, po prostu użyj ssh-add <path to keyfile>. Zostaniesz poproszony o podanie hasła, które bezpiecznie zapisze klucz dla ciebie w tej sesji. Jeśli pojawi się błąd „nie można znaleźć agenta ssh” (lub podobnego), oznacza to, że prawdopodobnie agent nie został uruchomiony. Możesz rozpocząć dla tej sesji za pomocą ssh-agent bash. Spowoduje to uruchomienie nowej powłoki z aktywnym agentem.

Wykonując te kroki, nie tylko utrudniasz podszywanie się pod Ciebie przez przechwycenie twoich poświadczeń, ale także utrzymujesz porządek w użyteczności (jest łatwiejszy w użyciu niż zwykłe hasła).

LvB
źródło