sudo z hasłem w jednym wierszu poleceń?

115

W pracowite dni chciałbym biegać

$ ./configure && make && sudo make install && halt

w nocy i idź spać, mając nadzieję, że aplikacja zostanie automatycznie zainstalowana. Ale następnego dnia widzę ekran, na którym sudo prosi mnie o hasło. Jak więc mogę uruchomić sudo z hasłem w jednym wierszu poleceń, czy też istnieje inna metoda?

Jichao
źródło
Musisz halturuchomić jako root.
Keith Thompson
1
Nie sudoma 15-minutowego limitu czasu? Czy nie możesz uruchomić, powiedzieć sudo lslub coś podobnego, wprowadzić hasło, a następnie uruchomić powyższe polecenie, mając sudonadal aktywne uprawnienia? (Obecnie nie mogę tego przetestować, w przeciwnym razie opublikowałbym to jako odpowiedź.)
Matt
1
Limit czasu na sudojest konfigurowalny. Ludzie świadomi bezpieczeństwa (paranoiczni, tacy jak ja) ustawili ją na zero ... :-)
dda

Odpowiedzi:

173

Tak, użyj -Sprzełącznika, który odczytuje hasło ze STDIN:

$echo <password> | sudo -S <command>

W twoim przypadku wyglądałoby to tak:

$./configure && make && echo <password> | sudo -S make install && halt

oczywiście zamień na <password>swoje hasło.

John T.
źródło
42
Oczywiście nie można tego uruchamiać, jeśli istnieje jakiekolwiek niebezpieczeństwo, że ktoś zobaczy hasło w historii powłoki.
Brett Daniel,
szukam szybkich sposobów uruchamiania uprzywilejowanych poleceń na zdalnym hoście, a to działa dzięki.
nelaaro
13
Jeśli zdecydowałeś się użyć „echo <hasło> | sudo -S ', ​​aby uniknąć ujawnienia hasła w historii poleceń, uruchom polecenie ze znakiem SPACJI. Oczywiście najlepszą opcją jest przesłanie hasła z bezpiecznego pliku.
Shannon Haworth
Możesz go użyć, jeśli masz hasło w
zmiennej
9 lat później i nadal działa jak urok :)
WinEunuuchs2Unix
10

Możesz zastąpić swój wiersz poleceń tym:

$sudo su

$./configure && make && make install && halt

Natychmiast pojawi się monit o podanie hasła, a następnie pozostałe polecenia będą działać jako administrator.

CarlF
źródło
8
alternatywna (i prawdopodobnie preferowana) wersja tego:sudo sh -c "./configure && make && make install && halt"
quack quixote
2
Ale czy wszystkie wygenerowane pliki kompilacji nie miałyby uprawnień administratora? Uniemożliwi to później uruchomienie ./configure && make jako zwykły użytkownik.
user45909
Tak, user45909, masz całkowitą rację. Osobiście nigdy nie uruchomiłem ponownie ./configure && make, chyba że mimo to pobrałem aktualizację pakietu głównego, ale prawdopodobnie nie jestem typowy.
CarlF,
10

Kilka innych rozwiązań mają tę wadę, że niepotrzebnie uruchomić ./configurei makejako root.

Jest to nieco skomplikowane, ale powinno działać:

sudo sh -c "su $USER -c ./configure && su $USER -c make && make install && halt"

Zwróć uwagę na użycie podwójnych cudzysłowów, aby umożliwić $USERrozszerzenie przez powłokę (inną niż root).

Mogę również dodać sleep 60przed haltpoleceniem. Czasami robiłem takie rzeczy, spodziewając się, że polecenie będzie działać przez długi czas, ale coś idzie nie tak i natychmiast się kończy; sleeppozwala mi zabić komendy zanim system zostanie zamknięty. Lub możesz użyć shutdownargumentu czasowego.

Keith Thompson
źródło
9

Możesz również skonfigurować sudo za pomocą, visudoaby użytkownik mógł używać make jako sudo bez hasła.

User_Alias USERS = your_user
Cmnd_Alias CMDS = /usr/bin/make
USERS ALL = (ALL) NOPASSWD: CMDS
Natim
źródło
9

Ustaw HISTIGNORE na „ sudo -S

$ export HISTIGNORE='*sudo -S*'

Następnie przekaż swoje hasło bezpiecznie do sudo:

$ echo "your_password" | sudo -S -k <command>

„HISTIGNORE” oznacza, że ​​nie zapisujesz tego polecenia w historii. To jest historia w pamięci lub plik „~ / .bash_history”.

Na przykład poniżej bezpiecznie potokuje twoje hasło do polecenia sudo, bez przechowywania historii twojego hasła.

„-S” oznacza użycie stdin jako hasła,

„-K” oznacza ignorowanie buforowanych danych uwierzytelniających, aby zmusić sudo, by zawsze pytało. Służy to spójnemu zachowaniu.

$ export HISTIGNORE='*sudo -S*'
$ echo "<your_password>" | sudo -S -k whoami
$ echo "<your_password>" | sudo -S -k cat /etc/shadow
$ echo "<your_password>" | sudo -S -k bash /tmp/myscript.sh

Wadą powyższej metody jest to, że jeśli chcesz zobaczyć polecenia uruchomione w historii później, nie będą one dostępne. Inną metodą jest aktualizacja pamięci podręcznej uwierzytelniania sudo (domyślnie jest włączona z 5-minutowym limitem czasu), a następnie osobne uruchomienie sudo. Ale wadą tego jest to, że musisz być świadomy 5-minutowej pamięci podręcznej.

Na przykład:

$ export HISTIGNORE='*sudo -S*'
$ echo "<your_password>" | sudo -S -v
$ sudo whoami
$ echo "<your_password>" | sudo -S -v
$ sudo cat /etc/shadow
$ echo "<your_password>" | sudo -S -v
$ sudo /tmp/myscript.sh

Uwaga: Uruchomiłem sudo przed każdą komendą, aby upewnić się, że pamięć podręczna sudo jest aktualizowana, ponieważ domyślnie jest to 5 minut. Tak, whoami nie powinno zająć 5 minut, ale myślę, że równie dobrze mógłbym uruchomić go przed każdym poleceniem dla zachowania spójności. Możesz także wpisać „export HISTIGNORE = ' sudo -S„” w pliku ~ / .bashrc, a następnie załaduj go za pomocą „. ~ / .bashrc "lub wyloguj się, a następnie zaloguj. Jednak myślę, że wykorzystam to do celów skryptowych, więc będę trzymać go na szczycie wszystkich moich skryptów dla najlepszych praktyk bezpieczeństwa. Ustawienie" echo "" | sudo -S -v zamiast tego może być dobrym pomysłem, a następnie po prostu uruchom zmienną przed każdą komendą, która wymaga uprawnień roota, patrz komentarz Janara. Komentarz „John T” powinien również zawierać parametr „-k” , tak jakbyś uruchomił „sudo -S” bez „-k”, a pamięć podręczna uwierzytelniania sudo ma już poświadczenia (i nadal jest ważna, domyślna pamięć podręczna uwierzytelniania sudo wynosi 5 minut), wówczas bash uruchomi hasło jako polecenie, czyli zły.

użytkownik393365
źródło
1
Podobnie jak mała uwaga na temat udostępniania rzeczy w historii, uruchom swoje polecenie z pojedynczym spacją z przodu. Z jakiegoś powodu powoduje to, że historia go ignoruje.
Matt Fletcher
4

Zauważyłem, że ta metoda nie działa na starszej wersji sudo, w szczególności „Sudo wersja 1.6.7p5”:

$ echo "<your_password>" | sudo -S -k whoami

Gdzie jak ta metoda działa na starszych i nowych wersjach sudo:

$ echo "<your_password>" | sudo -S -v
$ sudo whoami
Darren DeHaven
źródło
To nie jest odpowiedź na pierwotne pytanie. Aby skrytykować lub poprosić autora o wyjaśnienie, zostaw komentarz pod jego postem - zawsze możesz komentować własne posty, a gdy będziesz mieć wystarczającą reputację , będziesz mógł komentować każdy post .
DavidPostill
@Darren DeHaven: Czy możesz wyjaśnić, w jaki sposób stała się odpowiedzią na zadane tutaj pytanie?
Renju Chandran chingath,
4

Możesz to również zrobić:

sudo -S <<< "password" command
Jahid
źródło
tylko ten działa dla mnie w systemie Mac OS.
Mehdico,
2

Jeśli chcesz zachować większą ostrożność, możesz utworzyć skrypt, zmienić uprawnienia do pliku, aby tylko root mógł czytać i edytować, a następnie po prostu go uruchomić.

Przykład:
1) Utwórz plik:

gedit ~/.easy.install  

2) Wklej to i zapisz:

./configure && make && echo <password> | sudo -S make install && halt  

3) Spraw, by był wykonywalny:

sudo chmod +x ~/.easy.install  

4) Zmień uprawnienia do pliku, aby tylko root mógł go czytać i edytować:

sudo chmod 700 ~/.easy.install  

5) Uruchom:

~/.easy.install  

Cieszyć się ;-)

desgua
źródło
echo <hasło> nadal będzie się wyświetlać na liście procesów i jeśli ktoś będzie miał szczęście z ps aux we właściwym momencie, może zobaczyć hasło w postaci czystego tekstu. Lepiej zapisać hasło do pliku i użyć <, aby przekierować z pliku do sudo.
bobpaul,
1

Konfigurowanie takiego sudo jest niebezpieczne, jeśli ktoś zobaczy, że sudo nie wymaga hasła do twojego konta. Jeśli nie wiesz, co robisz, nie rób tego. Zdarzyło mi się to w moim lokalnym programie szkoleniowym A + z moim eksperymentalnym komputerem zbyt wiele razy ... -_-

To, co powiedział John T., brzmi dobrze, ale nadal istnieje ryzyko znalezienia hasła w historii powłoki. To, co powiedział CarlF, brzmi lepiej, ale jeśli jedno polecenie nie powiedzie się, komputer będzie nadal działał z uprawnieniami administratora.

Czas.
źródło
0

Osobiście robię to samo, co John T. odpowiedział 9 listopada 09 o 2:47, poprawiłem też mój zgodnie z wytycznymi jego odpowiedzi, dzięki.

Różnica polega na tym, że zwykle używam zmiennych, takich jak:

AutoSuDo=$" $echo pass | sudo -S";
# Change AutoSuDo to something else.
# Note that string starts with space,
# useful only if used as first command in line

W ten sposób mogę łatwo użyć mojej zmiennej zamiast sudo,

$AutoSuDo apt-get update;

Przydaje się to w przypadku dłuższych skryptów. Używam ich głównie do komputerów osobistych innych osób, które muszę utrzymywać.

Polecam również zwrócić uwagę na:

  • odpowiedź desgua 19 kwietnia o 23:56
  • komentarz user224306 z 14 maja 13 o 17:38 do odpowiedzi Johna T. z 9 listopada 09 o 2:47
Janar
źródło
0

Problem został rozwiązany. Na przykład do użytkownika root:

echo -e 'password\npassword\n' | sudo passwd root
Jerson Martínez
źródło
Co robi flaga -e, @jerson Martinez?
user674669
1
Opcja -e dla echa pozwala mu interpretować niektóre sekwencje jako mające specjalne znaczenie.
Jerson Martínez