SSH: wykonaj polecenie sudo

44

Mam interaktywny skrypt powłoki, który w jednym miejscu musi ssh do innej maszyny (opartej na Ubuntu) i wykonać coś jako root (użytkownik powinien wprowadzić swoje hasło, ale zdalne polecenie powinno działać tak, jak podano w skrypcie):

# ...
ssh remote-machine 'sudo ls'
# ...

Zawsze jednak otrzymuję ten komunikat o błędzie:

sudo: no tty present and no askpass program specified

OK, to całkiem jasne. Ale jak mogę to obejść? Coś takiego powinno się zdarzyć:

$ ssh remote-machine 'sudo ls /'
[sudo] password for user1:

/bin
/etc
/var
Boldewyn
źródło

Odpowiedzi:

52

Cudowne sshma lekarstwo na wszystko. Chodzi o to, aby dodać -tflagę, aby zmusić ssh do przydzielenia pseudo-tty:

ssh -t remote-server 'sudo ls'
Boldewyn
źródło
1
Jednak PTY mogą zepsuć skrypty. lsdane wyjściowe będą zawierać na przykład \ r \ n zakończenia.
Tobu
1
Najłatwiejszym sposobem jest zmusić ls do trybu nieterminalnego. ls | catzrobi - zobaczy, że stdout jest fajką. W tym konkretnym pytaniu nie ma to znaczenia, ponieważ najwyraźniej ma on być uruchamiany interaktywnie z terminala - więc prawdopodobnie chcesz kolumny i kolory i tak dalej.
Gabe
0

Ta metoda uruchomi pojedynczy skrypt używający sudo po ssh:

Załóżmy, że mamy „zdalnego” użytkownika z możliwościami sudo i mamy skrypt, który chcemy, aby był wykonywany jako root.

1) Ustaw skrypt w / etc / passwd, który będzie używany podczas logowania:

remote:x:1100:1100:Some Remote User,,,:/home/remote:/home/remote/login.sh

2) Wewnątrz „login.sh” wykonujemy skrypt, który chcemy uruchomić jako „sudo”:

#!/bin/bash
if [ "$(id -u)" != "0" ]; then
    #Not running as root, so we execute "sudo"
    sudo /usr/local/bin/script.sh
else
    #We are already rooted, so "sudo" is not required.
    /usr/local/bin/script.sh
fi
exit;

Zwykle dwukrotnie poprosi o hasło: ssh login + sudo. Jeśli chcesz wprowadzić go tylko raz, wypróbuj sudo bez hasła (niezalecane). <- przeczytaj komentarz Boldewyn.

Główną zaletą jest to, że „ssh” nie wymaga żadnych innych parametrów (as -t), a sudo jest wymuszane po stronie serwera. Ponadto, po zakończeniu skryptu, użytkownik jest również wylogowany.

Może nie jest tak elegancki, ale jest prosty i działa.

lepe
źródło
O o. Umieszczenie zdalnego użytkownika w sudoerspliku na serwerze takim jak ten jest katastrofą, na którą czeka. Jeśli ktoś uzyska dostęp jako użytkownik (np. Przez serwer WWW), może natychmiast zostać rootem. Dziękuję, ale szukałem rozwiązań, które nie stawiają sprzeczności w konfiguracji serwera. Gdybyś miał rozwiązanie, które w magiczny sposób ponownie wykorzystuje uwierzytelnianie z SSH dla sudopolecenia, byłbym bardziej zainteresowany (i być może zacząłbym szukać zamienników dla SSH ...).
Boldewyn
@Boldewyn: tak, ustawienie „sudo bez hasła” wiąże się z tym ryzykiem bezpieczeństwa ... jest to opcjonalny krok. Zgadzam się z tobą, jeśli SSH może ponownie użyć uwierzytelnienia, tego rodzaju „rozwiązania” nie byłyby wymagane. Dzięki za komentarz.
lepe
-1

Możesz uruchomić następującą komendę, aby uzyskać dostęp do roota bez interakcji:

ssh server " sudo command" < sudopassword.txt
SilentGuy
źródło
1
To nie zadziała, ponieważ stdin nie będzie urządzeniem końcowym (będzie odczytywał z określonego pliku).
Anthony G - sprawiedliwość dla Moniki