Jeśli wpiszesz „sudo” na początku jednej linijki, czy dotyczy to pozostałych poleceń?

10

Jeśli piszę sudona początku jednej linijki w bash, czy dotyczy to pozostałych poleceń?

Innymi słowy, jest to:

sudo foo | foo2 | foo3

równoważne z tym:

sudo foo | sudo foo2 | sudo foo3
Mike B.
źródło

Odpowiedzi:

11

Aby przekonać się, że sudodziała tylko przy użyciu pierwszego polecenia, pod warunkiem, że wszystko inne po pierwszym potoku jest uruchamiany jako oryginalny identyfikator użytkownika, możesz użyć tego niepotrzebnego łańcucha poleceń, aby go zobaczyć.

Przykład 1

$ sudo whoami > file1 | whoami > file2 | whoami > file3

Następnie, kiedy catte pliki zobaczysz następujące nazwy użytkowników:

$ cat file{1..3}
root
saml
saml

Przykład nr 2

Jeśli jednak uruchomisz podpowłokę:

$ sudo sh -c 'whoami > file4 | whoami > file5 | whoami > file6'

Następnie, kiedy catte pliki zobaczysz następujące nazwy użytkowników:

$ cat file{4..6}
root
root
root

Przykład nr 3

Twój komentarz na temat sudo foo1 | sudo foo2 ...nigdy nie zadziała, ponieważ dane wyjściowe sudo foo1zostaną przekazane do sudo foo2. Na podstawie moich whoamiprzykładów pokazuje to, że ten łańcuch poleceń nic nie robi.

$ sudo whoami | sudo whoami | sudo whoami
root

Pierwszy działał, ale drugi i trzeci nic nie robią, ponieważ nie są przygotowani do przyjmowania danych. Myślę, że chciałeś napisać coś takiego:

$ sudo whoami;sudo whoami;sudo whoami
root
root
root

Co jest równoważne z uruchomieniem go 3 razy w 3 różnych wierszach poleceń. Albo to:

$ sudo whoami && sudo whoami && sudo whoami
root
root
root

Ale nigdy nie rób tego ostatniego. Należy do następnej sekcji.

Niewyraźne sposoby dzwonienia do sudo

To nie są moje najlepsze prace, ale są inne sposoby, w jakie widziałeś, jak wykonuję wiele poleceń sudo. Pokazuję je tutaj tylko po to, aby nie uczyć , aby inni musieli to zrobić !

Sposób nr 1

$ echo "echo 1 > /proc/sys/vm/drop_caches" | sudo sh

Jak to działa?

Program echa w podwójnych cudzysłowach działa jako root z powodu sudo, ale powłoka przekierowująca wyjście echa do pliku tylko do roota nadal działa jako ty. Twoja bieżąca powłoka dokonuje przekierowania przed uruchomieniem sudo.

Sposób nr 2

$ sudo tee /proc/sys/vm/drop_caches <<<1

Jak to działa?

Ta metoda uruchamia teeprogram jako root AND pobiera dane wejściowe z ciąg tutaj, który działa przed sudowywołaniem teepolecenia.

Sposób nr 3

# this way
$ sudo -s -- 'whoami'

# or this way
sudo -s -- sh -c 'whoami;whoami'

Jak to działa?

Mogą wyglądać inaczej, ale naprawdę robią to samo. Podczas korzystania z -sprzełącznika sudouruchomi jedno polecenie. Nigdy nie mogłem dowiedzieć się, czy istnieje sposób, by uciec. Nic takiego nie działałoby.

# this
$ sudo -s -- 'whoami;whoami'

# or this
$ sudo -s -- 'whoami\;whoami'

Ale patrząc na stronę podręcznika, -sprzełącznik mówi, że przekaże pojedyncze polecenie powłoce zdefiniowanej we wpisie /etc/passwdpliku użytkownika. sh -cUżywamy sztuczki w drugiej formie, głównie przekazując powłokę, kolejną powłokę ( ), w której „backdoor” nasz ciąg poleceń do uruchomienia.

Jest ich więcej, ale zatrzymam się tutaj. Mają one jedynie na celu pokazanie, co możesz zrobić, jeśli rozumiesz rzeczy, ale niekoniecznie powinny po prostu łączyć ze sobą śmieci, ponieważ możesz, powinieneś starać się utrzymać pragmy kodu na poziomie logicznym, który ma sens, aby inni mogli zarówno zrozumieć, jak i wspierać je w przyszłości.

slm
źródło
6

Nie, w twoim przykładzie foojest wykonywany tylko przez sudo. Jeśli chcesz uruchomić wszystkie polecenia z eskalowanymi uprawnieniami, możesz spawnować powłokę:

sudo sh -c 'foo | foo2 | foo3'
Jordan
źródło