Jak przekazać hasło do su / sudo / ssh bez nadpisywania TTY?

148

Piszę program powłoki C, który będzie robił sulub sudolub ssh. Wszyscy chcą, aby ich hasła były podawane na wejściu konsoli (TTY), a nie na stdin lub w wierszu poleceń.

Czy ktoś zna rozwiązanie?

Konfiguracja bez hasła sudonie jest opcją.

może być opcją, ale nie ma jej w moim okrojonym systemie.

Aleksander
źródło
SSH: serverfault.com/questions/241588/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Odpowiedzi:

215

W przypadku sudo istnieje opcja -S do akceptowania hasła ze standardowego wejścia. Oto wpis mężczyzny:

    -S          The -S (stdin) option causes sudo to read the password from
                the standard input instead of the terminal device.

Umożliwi to uruchomienie polecenia takiego jak:

echo myPassword | sudo -S ls /tmp

Jeśli chodzi o ssh, podejmowałem wiele prób zautomatyzowania / skryptu jego użycia bez powodzenia. Wydaje się, że nie ma żadnego wbudowanego sposobu na przekazanie hasła do polecenia bez pytania. Jak wspominali inni, narzędzie „ oczekiwać ” wydaje się być ukierunkowane na rozwiązanie tego dylematu, ale ostatecznie ustawienie prawidłowej autoryzacji klucza prywatnego jest właściwą drogą do podjęcia próby zautomatyzowania tego.

Jesse Webb
źródło
2
Na szczęście Ruby ma wbudowanego klienta SSH, który pozwala określić hasło. Możesz spróbować ruby ​​-e "require 'net / ssh'; Net :: SSH.start ('example.com', 'test_user',: password => 'secret') do | ssh | puts 'Zalogowano pomyślnie'; while cmd = gets; puts ssh.exec! (cmd); end end "
user1158559
13
Nienawidzę być tu imprezowiczem, ale zrobienie tego może spowodować, że twoje hasło pojawi się na liście procesów. Próbowałem znaleźć lepszy sposób i natknąłem się na ten artykuł i byłem zaskoczony, że nikt go nie wskazał. Świetne rozwiązanie, ale uważaj na ryzyko.
Matt,
O ssh, czy próbowałeś przekazać hasło w ciągu połączenia? jak nonroot:[email protected]? Oczywiście rzeczy są znacznie łatwiejsze, jeśli używasz uwierzytelniania klucza i menedżera kluczy.
Killah
12
Unikaj pojawiania się hasła na liście procesów lub plikach dziennika, umieszczając je w pliku i używając cat; 'cat pw | sudo -S <command>i później rm pw.
CAB,
Innym sposobem byłoby użycie netcata i przesłanie hasła przez gniazdo - nc -l 12345 | sudo -S <command>. Po stronie wysyłającej; echo myPassord | nc <target> 12345. To po prostu przenosi problem z obsługą hasła, ale prawdopodobnie na konsolę główną, gdzie masz więcej opcji.
CAB
36

Napisałem kilka skryptów Applescript, które pytają o hasło w oknie dialogowym, a następnie budują niestandardowe polecenie bash, na przykład:

echo <password> | sudo -S <command>

Nie jestem pewien, czy to pomoże.

Byłoby miło, gdyby sudo zaakceptowało wstępnie zaszyfrowane hasło, więc mógłbym je zaszyfrować w swoim skrypcie i nie martwić się powtarzaniem haseł w postaci czystego tekstu. Jednak to działa dla mnie i mojej sytuacji.

mlambie
źródło
27

Dla sshmożna użyć sshpass: sshpass -p yourpassphrase ssh user@host.

Musisz tylko najpierw pobrać sshpass :)

$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server
Edward
źródło
12

Mam:

ssh user@host bash -c "echo mypass | sudo -S mycommand"

Pracuje dla mnie.

David Dawson
źródło
Nie działa dla mnie. ssh nadal pyta o hasło.
AKS
Świetnie, wreszcie coś, czego mogę użyć! Dzięki. Używam tego w skrypcie bash, który uruchamia sesję ssh i przekazuje polecenia sudo do klienta. Mój skrypt zawiera wiersze rozwiązania: ssh -t nazwa_użytkownika @ nazwa_hosta bash -c "sudo echo fartjuice"
James T Snell
12

W przypadku sudo możesz to również zrobić:

sudo -S <<< "password" command
Jahid
źródło
10

Typowym rozwiązaniem tego problemu jest ustawienie aplikacji pomocniczej, która wykonuje zadanie wymagające dostępu administratora: http://en.wikipedia.org/wiki/Setuid

Sudo nie jest przeznaczone do użytku w trybie offline.

Późniejsza edycja: SSH może być używane z uwierzytelnianiem za pomocą klucza prywatnego i publicznego. Jeśli klucz prywatny nie ma hasła, można użyć ssh bez pytania o hasło.

diciu
źródło
10

Można to zrobić, ustawiając klucze publiczne / prywatne na hostach docelowych, z którymi będziesz się łączyć. Pierwszym krokiem byłoby wygenerowanie klucza ssh dla użytkownika uruchamiającego skrypt na hoście lokalnym, wykonując:

ssh-keygen
Enter file in which to save the key (/home/myuser/.ssh/id_rsa): <Hit enter for default>
Overwrite (y/n)? y

Następnie wprowadź puste hasło. Następnie skopiuj swój klucz ssh na docelowy host, z którym będziesz się łączyć.

ssh-copy-id <remote_user>@<other_host>
remote_user@other_host's password: <Enter remote user's password here>

Po zarejestrowaniu kluczy ssh, możesz wykonać wyciszenie ssh remote_user@other_hostz lokalnego hosta.

Byob
źródło
7

Może możesz użyć expectpolecenia ?:

expect -c 'spawn ssh [email protected];expect password;send "your-password\n";interact

To polecenie automatycznie podaje hasło.

adhown
źródło
Wygląda ładnie, ale jak mogę włączyć polecenie oczekiwania na maszynie bez uprawnień roota?
Radon8472
1
@ Radon8472 Plik wykonywalny może zostać dodany do ~ / bin, jeśli nie masz uprawnień do jego instalacji. Jeśli twój system nie dodaje automatycznie ~ / bin do twojej PATH, możesz to zrobić ręcznie poprzez export PATH = "$ PATH: ~ / bin" lub dodać to polecenie do swojego profilu, aby zrobić to automatycznie. Jeśli nie chcesz zmieniać swojej PATH, możesz zamiast tego wykonać polecenie, używając jego ścieżki bezwzględnej: ~ / bin / exp [argumenty] Pamiętaj, aby ustawić jego wykonywalny bit: chmod + x ~ / bin /
exp
6

Kiedy nie ma lepszego wyboru (jak sugerują inni), wtedy man socat może pomóc:

   (sleep 5; echo PASSWORD; sleep 5; echo ls; sleep 1) |
   socat - EXEC:'ssh -l user server',pty,setsid,ctty

          EXEC’utes an ssh session to server. Uses a pty for communication
          between socat and ssh, makes it ssh’s  controlling  tty  (ctty),
          and makes this pty the owner of a new process group (setsid), so
          ssh accepts the password from socat.

Cała złożoność pty, setid, ctty jest konieczna i chociaż możesz nie potrzebować spać tak długo, będziesz musiał spać. Warto też przyjrzeć się opcji echo = 0, podobnie jak przekazywaniu zdalnego polecenia w wierszu poleceń ssh.

Martin Dorey
źródło
1
To również zadziała su. sunie ma opcji -S (stdin).
aus
Czy można uniknąć snu i zamiast tego użyć czegoś bardziej niezawodnego?
Michael Pankov
6

Spójrz na expectnarzędzie linux.

Umożliwia wysyłanie danych wyjściowych do stdio w oparciu o proste dopasowywanie wzorców na stdin.

Marko
źródło
1

Skonfiguruj protokół SSH do uwierzytelniania za pomocą klucza publicznego, bez hasła w kluczu. Mnóstwo prowadnic w sieci. Nie będziesz wtedy potrzebować hasła do logowania. Następnie można ograniczyć połączenia dla klucza na podstawie nazwy hosta klienta. Zapewnia rozsądne bezpieczeństwo i doskonale nadaje się do automatycznego logowania.


źródło
1
ssh -t -t [email protected] << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF
Ed Bishop
źródło
Jeśli możesz zalogować się jako użytkownik za pomocą klucza ssh, dostęp do sudo jest w porządku: ssh -t user @ host "echo mypassword | sudo -S sudocommand"
Jack
0

Miałem ten sam problem. skrypt dialogowy do tworzenia katalogu na zdalnym komputerze. dialog z ssh jest łatwy. Używam sshpass (wcześniej zainstalowanego).

   dialog --inputbox "Enter IP" 8 78 2> /tmp/ip

   IP=$(cat /tmp/ip)


   dialog --inputbox "Please enter username" 8 78 2> /tmp/user

   US=$(cat /tmp/user)


   dialog --passwordbox "enter password for \"$US\" 8 78 2> /tmp/pass

   PASSWORD = $(cat /tmp/pass)


   sshpass -p "$PASSWORD" ssh $US@$IP mkdir -p /home/$US/TARGET-FOLDER


   rm /tmp/ip

   rm /tmp/user

   rm /tmp/pass

pozdrowienia z Niemiec

Titus

Titus
źródło
0

Opierając się na odpowiedzi @ Jahid, działało to dla mnie w systemie macOS 10.13:

ssh <remote_username>@<remote_server> sudo -S <<< <remote_password> cat /etc/sudoers
JS.
źródło
0

lepszą sshpassalternatywą jest: passh https://github.com/clarkwang/passh

Zaloguj się do zdalnego serwera

 $ passh -p password ssh user@host

Uruchom polecenie na serwerze zdalnym

 $ passh -p password ssh user@host date

inne metody przekazywania hasła

-p Hasło (Domyślnie: `hasło ')

-p env: Odczytaj hasło z env var

-p plik: Odczytaj hasło z pliku

tutaj wyjaśniłem, dlaczego jest lepszy niż sshpass i inne rozwiązania.

Badr Elmers
źródło
-1
echo <password> | su -c <command> <user> 

To działa.

DevOz
źródło
1
To jedyne, które działa dla mnie w Fedorze. Ludzie odrzucają odpowiedzi tylko dlatego, że nie działają w ich sytuacji?
Hangchen Yu
2
„su: musi być uruchamiany z terminala” (RPi1B, Raspbian)
notme1560
Niestety tak się nie dzieje w najnowszych wersjach programu su, który zamiast tego odczytuje hasło ze stdio .
moutonjr
-1

Zakodowanie hasła na sztywno w skrypcie oczekiwania jest takie samo jak posiadanie sudo bez hasła, a właściwie gorzej, ponieważ sudo przynajmniej rejestruje swoje polecenia.

Aleksandar Ivanisevic
źródło
-1

POSŁUGIWAĆ SIĘ:

echo password | sudo command

Przykład:

echo password | sudo apt-get update; whoami

Mam nadzieję, że to pomoże..

Sarat Chandra
źródło
-2

Możesz podać hasło jako parametr, aby oczekiwać skryptu.

Marko
źródło
-11
su -c "Command" < "Password"

Mam nadzieję, że to jest pomocne.

Shankar
źródło
1
To nie jest. Odpowiedzią na to jest „su: musi być uruchamiany z terminala”.
thelogix