Czy mogę automatycznie zalogować się do ssh przy użyciu haseł z pęku kluczy OS X?

9

Muszę zalogować się na serwerze ssh, który nie obsługuje uwierzytelniania na podstawie klucza. I nie chcę za każdym razem wpisywać hasła.

Używam OS X Lion (10.7.2). Dodałem hasła do pęku kluczy OS X [1]. Teraz mogę automatycznie pobrać hasło z pęku kluczy /usr/bin/security, jednak nie mogę znaleźć sposobu na przesłanie tego hasła do monitu ssh.

Też próbowałem sshpass. Jednak gdy próbuję uruchomić, ssh kończy działanie z następującym błędem:

ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied, please try again.
ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied, please try again.
ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied (publickey,password).

Czy w każdym razie mogę zalogować się na ten serwer bez konieczności podawania hasła za każdym razem?

Notatki

  1. Schemat, którego używam w pęku kluczy, wygląda następująco
    • Rodzaj: hasło internetowe
    • Nazwa użytkownika konta
    • Gdzie: ssh: // nazwa-serwera
Chaitanya Gupta
źródło

Odpowiedzi:

11

Nieinteraktywne sesje SSH

Jeśli nie potrzebujesz interaktywnej sesji na zdalnym serwerze, możesz wykonać ją sshw środowisku bez tty, np. W ramach akcji Uruchom skrypt powłoki w Automatorze .

Musisz stworzyć program, który po wywołaniu wypisuje hasło na standardowe wyjście, np. Następujący skrypt bash, który musisz wykonać chmod +x pwd.sh:

#!/usr/bin/env bash
echo "password"

Następnie ustaw SSH_ASKPASSzmienną środowiskową na ścieżkę do tego programu, a następnie uruchom sshakcję Automator w następujący sposób:

export SSH_ASKPASS=/Users/danielbeck/pwd.sh
ssh user@hostname ls

Gdy nie ma tty, ale SSH_ASKPASSi DISPLAY(dla X11, ustawione domyślnie), SSH wykonuje program określony przez SSH_ASKPASSi używa jego danych wyjściowych jako hasła. Jest to przeznaczone do użycia w środowiskach graficznych, dzięki czemu można wyświetlić okno z prośbą o podanie hasła. W tym przypadku po prostu pominęliśmy okno, zwracając hasło z naszego programu. Zamiast tego możesz użyć securitydo odczytu z pęku kluczy:

#!/usr/bin/env bash
security find-generic-password -l password-item-label -g 2>&1 1>/dev/null | cut -d'"' -f2

ls(w sshwierszu poleceń) to polecenie wykonywane po sshzalogowaniu, a jego dane wyjściowe są drukowane w programie Automator. Możesz oczywiście przekierować go do pliku, aby zapisać dane wyjściowe uruchamianego programu.


Interaktywne sesje SSH przy użyciu sshpass

Pobrałem, skompilowałem i zainstalowałem sshpassi działało idealnie. Oto co zrobiłem:

  1. Uzyskaj narzędzia programistyczne Apple
  2. Pobierz i otwórz sshpass-1.05.tar.gz
  3. Otwórz powłokę do katalogu sshpass-1.05
  4. Biegać ./configure
  5. Biegać make
  6. Uruchom make install(możesz tego potrzebować sudo)

Teraz program jest zainstalowany /usr/local/bin/sshpass. Wykonaj używając linii takiej jak poniżej:

sshpass -pYourPassword ssh username@hostname

Możesz przeczytać hasło securitytuż przed zrobieniem tego i użyć go w następujący sposób:

SSHPASSWORD=$( security find-generic-password -l password-item-label -g 2>&1 1>/dev/null | cut -d'"' -f2 )
sshpass -p"$SSHPASSWORD" ssh username@hostname

Zawiń to w funkcję powłoki i możesz po prostu wpisać np., ssh-yourhostnameAby się połączyć, automatycznie pobierając i wprowadzając hasło.

Daniel Beck
źródło
Cześć, głosowałem za odpowiedzią, ponieważ doprowadziło mnie to do rozwiązania. Jednak to, co tu opisałeś, nie do końca działało (może to być specyficzne dla wersji Lion's ssh) 1) W przypadku sesji nieinteraktywnych ssh wciąż prosił mnie o hasło, a po wprowadzeniu go dostałem STDIN is not a terminal. 2) W przypadku interaktywnych sesji z sshpassThe -popcja widocznie nie robić nic. Ale uruchamianie, sshpassgdy SSH_ASKPASSjest ustawiony, działa!
Chaitanya Gupta
@ChaitanyaGupta Odd. Działa dla mnie nieinteraktywnie z poziomu Automatora na Lionie. Jeśli chodzi o ten drugi problem, możliwe, że miałem wtedy brudną sesję powłoki, nie jestem już pewien. +1 dla Ciebie i dziękuję za dodanie Twojego rozwiązania do witryny.
Daniel Beck
Mój zły (dotyczy 1) - Próbowałem uruchomić nieinteraktywną sesję w terminalu, a nie w Automatorze. Wypróbowałem to teraz w Automatorze i nadal pojawia się STDIN is not a terminalbłąd. Tym razem jednak nie otrzymałem żadnego hasła; Wierzę, że SSH_ASKPASSdziała w Automatorze, ponieważ jeśli zrobię w SSH_ASKPASSzamian niepoprawne hasło, otrzymam Permission denied, please try again.błąd.
Chaitanya Gupta
1
W przypadku ostatnich przykładów zauważ, że w systemach uniksowych, takich jak OS, argumenty wiersza poleceń i zmienne środowiskowe mogą być widoczne dla innych użytkowników w systemie, więc nie jest to bezpieczne w wrażliwym środowisku wielu użytkowników.
Jürgen Strobel
@DanielBeck jakikolwiek pomysł, jak to zrobić, aby działałomacOs >= 10.13
nbari
7

Znalazłem rozwiązanie (dzięki Danielowi Beck za dostarczenie kluczowych informacji potrzebnych do tego). Pamiętaj, że testowałem to tylko z systemem OS X Lion 10.7.2. Jeśli to nie zadziała, wypróbuj rozwiązanie Daniela.

Najpierw musimy ustawić SSH_ASKPASSzmienną środowiskową - jej wartością powinna być ścieżka do programu, który wypisuje hasło na standardowe wyjście. Aby uzyskać hasło z pęku kluczy, musi wyglądać tak (nazywam to get-ssh-password.sh):

#!/bin/bash

/usr/bin/security find-internet-password -a "$SSH_PASSWORD_USER" -s "$SSH_PASSWORD_HOSTNAME" -r "ssh " -g 2>&1 1>/dev/null | cut -d\" -f2

Kilka punktów do zapamiętania:

  1. Zakłada się, że hasło zostało zapisane w pęku kluczy w sposób opisany w pytaniu

  2. Podany program SSH_ASKPASSzostanie wywołany bez żadnych argumentów; dlatego używamy zmiennych środowiskowych do przekazania nazwy użytkownika i hosta.

Teraz możemy ustawić SSH_PASSWORD_USERi SSH_PASSWORD_HOSTNAMEuruchomić, sshpassaby zalogować się do naszego serwera.

Stworzyłem inny skrypt ssh-kcpass, aby to zrobić:

#!/bin/bash

export SSH_ASKPASS=~/bin/get-ssh-password.sh
export SSH_PASSWORD_USER=$(echo "$1" | cut -d@ -f1)
export SSH_PASSWORD_HOSTNAME=$(echo "$1" | cut -d@ -f2)

sshpass ssh "$1"

Aby zalogować się do serwera ssh bez wpisywania hasła, wystarczy uruchomić ssh-kcpass user@hostname.

Chaitanya Gupta
źródło
Jak to zrobić, aby działałomacOS >= 10.13
nbari
-3

Cześć, ludzie. Natknąłem się na ten temat, szukając czegoś innego, ale ... Nie wiem, czy coś mi tu brakuje ... ale twoje podejście wydaje mi się dziwne. dlaczego nie użyć uwierzytelnienia klucza publicznego ... Wygeneruj klucz rsa $ ssh-keygen -t rsa -b 2048 -C 'email / id'

Najlepiej byłoby użyć raz ssh-copy-id użytkownik @ host i raz uwierzytelnić się przy użyciu hasła, aby zainstalować klucz na innym serwerze, lub użyć dowolnego narzędzia skryptowego lub narzędzia do autoryzacji, aby wdrożyć klucz do ~ / .ssh / Author_keys na drugi host (dla użytkownika, do którego chcesz się zalogować) Jeśli zrobisz to ręcznie, musisz odpowiednio edytować / etc / ssh / sshd_config i zautomatyzować (szef kuchni, ansible), byś wcisnął pełną condiga do pożądanego stanu.

Kluczem, który ma znaczenie przy dystrybucji, jest id_rsa.pub, zachowaj bezpieczeństwo klucza prywatnego

Aby użyć pęku kluczy do uwierzytelnienia hostów w automatycznej, prostej edycji na komputerze ~ / .ssh / config i dodaj:

Host * Użyj klucza kluczy tak

Poszukaj więcej informacji na temat opcji pliku konfiguracyjnego ssh, mając nadzieję, że coś z tego się przyda

Ricardo Mendes
źródło
1
Przeczytaj pierwsze zdanie treści pytania: „Muszę zalogować się na serwerze ssh, który nie obsługuje uwierzytelniania na podstawie klucza. ''
Scott
Cześć Scott. Myślę, że przegapiłeś także tę część, w której mówi, że nie chce wpisywać hasła za każdym razem, co oznacza, że ​​to robi.
Ricardo Mendes
Nie, nie tęskniłem za tym. Dlaczego miałbyś wierzyć, że ja wierzyłem?
Scott
BC wciąż mówisz
Ricardo Mendes