Mając bardzo dziwny problem. Stworzyłem mały skrypt bash, który uruchamia polecenie na zdalnym hoście za pośrednictwem ssh (przy użyciu uwierzytelniania za pomocą klucza publicznego).
Kiedy uruchamiam ten skrypt ręcznie z wiersza poleceń, działa dobrze, ale po umieszczeniu w /etc/cron.hourly kończy się niepowodzeniem z Permission denied, please try again.
błędem.
- Wyraźnie ustawiam klucz w skrypcie za pomocą
ssh -i /root/.ssh/id_rsa user@remote "command"
; - skrypt działa jako root (dodałem
echo `id` > /tmp/whoami.log
podwójną kontrolę); i - klucz ssh nie jest chroniony hasłem ...
System to serwer Ubuntu 12.04, nie mam dużego dostępu po stronie zdalnej do rozwiązywania problemów, ale jak powiedziałem, ręczne uruchamianie ssh lub tego samego skryptu bash z wiersza poleceń działa.
Każdy pomysł, dlaczego tak się dzieje lub jak to naprawić?
aktualizacja
okazuje się, że się pomyliłem, a klucz ssh był chroniony hasłem (z pękiem kluczy ładującym ssh-agenta), dlatego nie udało mu się to ze skryptu, ale nie podczas uruchamiania z sesji bash. Dodanie . ~/.keychain/$HOSTNAME-sh
do mojego skryptu rozwiązało problem (dzięki @grawity, który wskazał mi właściwy kierunek i udzielił wyczerpującej odpowiedzi).
SSH_AUTH_SOCK
iKRB5CCNAME
zmiennych środowiskowych.SSH_AUTH_SOCK
jest on powiązany (chociaż chętnie próbuję cokolwiek). Uzyskuję bezpośredni dostęp do pliku klucza, a plik klucza nie jest chroniony hasłem. Co doKRB5CCNAME
szybkiego wyszukiwania pokazał to jest coś zrobić z Kerberos. Znowu - nie widzę związku z tym problemem, ale może coś mi tu brakuje ...-v
opcję do tegossh
polecenia ...ssh -i
W obu przypadkach jawnie używam klucza za pomocą polecenia ... Spróbuję usunąć te zmienne w skrypcie i zobaczę. Dobra sugestia do dodania-v
- ja też to dodam.Odpowiedzi:
Polecenia interaktywne i zadania cron działają w różnych środowiskach - w szczególności sesja interaktywna może mieć uruchomionego agenta SSH lub przechowany Kerberos TGT. Ze względu na sposób
ssh
zamawiania metod uwierzytelniania nie można mieć pewności, że klucz zostanie użyty tylko dlatego, że dodano-i
opcję.Jeśli agent SSH jest uruchomiony,
ssh
klient zawsze wypróbowuje klucze agenta przed użyciem jawnie określonych kluczy.Jeśli sieć korzysta z protokołu Kerberos i obecny jest protokół Kerberos TGT, OpenSSH użyje go przed próbą uwierzytelnienia za pomocą klucza publicznego.
Nic nie wiem o twoim środowisku, ale obie z tych możliwości są łatwe do sprawdzenia:
Dodaj
unset SSH_AUTH_SOCK
iunset KRB5CCNAME
przedssh
poleceniem, a następnie ręcznie uruchom zmodyfikowany skrypt.Zapobiegnie to dostrzeżeniu przez skrypt agenta lub biletów Kerberos i będzie używał tylko wyraźnie określonego klucza.
Dodaj
-v
opcję dossh
. Spowoduje to wyświetlenie bardziej szczegółowych informacji o sposobie uwierzytelnienia.Możesz także dodać
-oIdentitiesOnly=yes
dossh
polecenia; to będzie zmusić go do korzystania z określonego klucza .Zasadniczo nie jest to zalecane, ponieważ agent jest zwykle ściśle powiązany z interaktywną sesją logowania. W szczególności jest uruchamiany tylko po zalogowaniu, a zabijany po wylogowaniu - i potrzebuje twojego hasła, aby faktycznie odblokować klucze SSH (zakładając, że były chronione hasłem).
Wspomniałeś o „Keychain” - czy to program OS X, czy skrypt Linux? (Nie wiem dużo o architekturze Mac OS X, ale AFAIK znacznie utrudnia dostęp do ssh-agent użytkownika z cronjob ...)
źródło
Innym obejściem tego problemu jest ustawienie crona na ssh w polu lokalnym, aby z kolei uruchomić polecenie ssh zamiast uruchamiać plik lub polecenie przez jego lokalną, bezwzględną ścieżkę. To buforuje KRB5CCNAME i działa tam, gdzie / ścieżka / polecenie nie.
źródło
Możesz użyć ssh-cron do skonfigurowania zaplanowanych połączeń SSH do bezpiecznych serwerów bez ujawniania kluczy SSH, ale używając agenta SSH.
źródło
możesz uruchomić skrypt lub polecenie w crontab, takim jak:
0 * * * * bash -c -l "/home/user/sshscript.sh"
lub
0 * * * * bash -c -l "ssh root @ yourhost 'echo $ HOSTNAME'"
źródło
cron
; więc tak naprawdę nie wydaje się, że daje odpowiedź.