Do czego służy polecenie „sudo -s” i jak zostało użyte w tym przykładzie?

8

Mam następujące wątpliwości. W samouczku związanym z instalacją oprogramowania, którą obserwuję, powiedz, że muszę wykonać następujące polecenia (robię to w powłoce ssh , więc ta lista kroków kończy się exitpoleceniem):

sudo -s
apt-get update
apt-get install -y build-essential libtool libcurl4-openssl-dev libncurses5-dev libudev-dev autoconf automake screen
exit

Moje wątpliwości to:

Co dokładnie robi -sparametr po sudokomendzie?

Podczas wyszukiwania w Internecie odkryłem, że:

‑S [polecenie] Opcja ‑s (powłoka) uruchamia powłokę określoną przez zmienną środowiskową SHELL, jeśli jest ustawiona, lub powłokę określoną w bazie danych haseł. Jeśli podano polecenie, jest ono przekazywane do powłoki w celu wykonania za pomocą opcji ‑c powłoki. Jeśli nie podano żadnego polecenia, wykonywana jest powłoka interaktywna

Wydaje mi się, że sudo -swykonać polecenie przy użyciu zmiennej środowiskowej powłoki.

Ale nie jest to dla mnie jasne: w tym przypadku jakie polecenie jest wykonywane ze zmienną środowiskową? (to tylko wykonuje, sudo -sa nie sudo -s [command]).

AndreaNobili
źródło

Odpowiedzi:

7

Prosta odpowiedź jest taka, że ​​daje powłokę root. Właśnie do tego służy. Jest to dobre porównanie technicznej pomiędzy su, sudo -i, sudo -si sudo susposoby na Unix.SE ale to naprawdę nie ma znaczenia tutaj. Kod mógł użyć dowolnego i działałby.

Samorodek pomocy oznacza kilka rzeczy:

  • Poszukuje polecenia w $SHELLzmiennej środowiskowej. Jeśli uruchomisz echo $SHELL, prawdopodobnie zobaczysz /bin/bash. Oznacza to, że otrzymasz główną instancję Bash. Jestem pewien, że gdybyś tam był zsh, oznaczałoby to, że masz root zsh.

  • Jeśli $SHELLjest pusty, wraca do domyślnej powłoki zdefiniowanej /etc/passwddla tego użytkownika.

  • Jeśli podasz polecenie (np. sudo -s whoami), Faktycznie działa:sudo /bin/bash -c "whoami"

  • Jeśli nie przekażesz polecenia, nie zostanie on przesłany, -cwięc otrzymasz interaktywną powłokę.

Użyłem frazy „root” kilka razy. Przez domyślnie sudo jest o rzeczy działa jako root, ale sudo(i su) można uruchomić rzeczy jak innych użytkowników (jeśli masz na to zgody). Mówię to tylko dla pedantów, którzy będą krzyczeć, sudo -s -u $USERco nie daje im skorupy korzenia, jak obiecałem -spowyżej.


I według moich najskromniejszych opinii, to naprawdę głupie stać się rootem tylko dla dwóch poleceń, nie wspominając już o tym, że może to spowodować, że użytkownik przypadkowo uruchomi kolejne polecenia jako root. Jeśli chcesz lub musisz uruchomić coś jako root, po prostu zastosuj polecenie za pomocą sudo:

sudo apt-get update
sudo apt-get install -y build-essential libtool libcurl4-openssl-dev libncurses5-dev libudev-dev autoconf automake screen

Byłbym wątpliwy w stosunku do jakiegokolwiek samouczka, który sugerowałby uzyskanie powłoki roota, z wyjątkiem przypadków, w których masz mnóstwo poleceń do uruchomienia ... A nawet wtedy istnieje skrypt.

Oli
źródło
Idealne wyjaśnienie. Teraz wszystko jest bardziej jasne. Ostatnia wątpliwość. Jeśli dołączę sudo do wszystkich poprzednich poleceń, uzyskam ten sam końcowy wynik? czy to prawda czy coś mi brakuje?
AndreaNobili
@Oli masz 100% rację co do Zsh, „sudo -s” loguje się do powłoki „root” jako „root”, a nie superużytkownik.
RCF
@AndreaNobili Tak, po to właśnie sudojest; uruchomienie polecenia jako root bez konieczności ręcznego logowania jako root.
Oli
Do Twojej wiadomości wysłałem odpowiedź poniżej twojej, a moje podejście sudo -sjest drastycznie różne z powodu mojej ograniczonej wiedzy i przypadkowego zdarzenia. Nadal możesz chcieć przeczytać moją „pokorną” odpowiedź i być może odświeżyć starą odpowiedź sprzed ponad dekady.
WinEunuuchs2Unix,
0

sudo -suruchomi polecenie w bieżącym katalogu, tak jak zwykły użytkownik. Na przykład:

rick@alien:~/askubuntu$ suspendtime
Nov 12 14:06:27 to Nov 12 17:22:21 lasting 11,754 seconds
Nov 12 22:23:37 to Nov 13 04:24:37 lasting 21,660 seconds
(... SNIP ...)
Dec 02 21:58:49 to Dec 03 04:20:52 lasting 22,923 seconds
Dec 03 05:52:43 to Dec 03 16:37:44 lasting 38,701 seconds

Linux uptime 1,859,356 seconds (21 days, 12 hours, 29 minutes, 16 seconds)
45 Suspends 1,173,341 seconds (13 days, 13 hours, 55 minutes, 41 seconds)
Real uptime 686,015 seconds (7 days, 22 hours, 33 minutes, 35 seconds)

rick@alien:~/askubuntu$ sudo suspendtime
sudo: suspendtime: command not found

rick@alien:~/askubuntu$ sudo -H suspendtime
sudo: suspendtime: command not found

rick@alien:~/askubuntu$ sudo -s suspendtime
Nov 12 14:06:27 to Nov 12 17:22:21 lasting 11,754 seconds
(...SNIP...)
Dec 03 05:52:43 to Dec 03 16:37:44 lasting 38,701 seconds

Linux uptime 1,859,431 seconds (21 days, 12 hours, 30 minutes, 31 seconds)
45 Suspends 1,173,341 seconds (13 days, 13 hours, 55 minutes, 41 seconds)
Real uptime 686,090 seconds (7 days, 22 hours, 34 minutes, 50 seconds)

Oczywiście użycie -szamiast prefiksu polecenia ./może nie być świetną oszczędnością czasu.

WinEunuuchs2Unix
źródło