Jeśli piszę sudo
na 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
Aby przekonać się, że sudo
dział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ć.
$ sudo whoami > file1 | whoami > file2 | whoami > file3
Następnie, kiedy cat
te pliki zobaczysz następujące nazwy użytkowników:
$ cat file{1..3}
root
saml
saml
Jeśli jednak uruchomisz podpowłokę:
$ sudo sh -c 'whoami > file4 | whoami > file5 | whoami > file6'
Następnie, kiedy cat
te pliki zobaczysz następujące nazwy użytkowników:
$ cat file{4..6}
root
root
root
Twój komentarz na temat sudo foo1 | sudo foo2 ...
nigdy nie zadziała, ponieważ dane wyjściowe sudo foo1
zostaną przekazane do sudo foo2
. Na podstawie moich whoami
przykł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.
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ć !
$ 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
.
$ sudo tee /proc/sys/vm/drop_caches <<<1
Jak to działa?
Ta metoda uruchamia tee
program jako root AND pobiera dane wejściowe z ciąg tutaj, który działa przed sudo
wywołaniem tee
polecenia.
# 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 -s
przełącznika sudo
uruchomi 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, -s
przełącznik mówi, że przekaże pojedyncze polecenie powłoce zdefiniowanej we wpisie /etc/passwd
pliku użytkownika. sh -c
Uż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.
Nie, w twoim przykładzie foo
jest wykonywany tylko przez sudo
. Jeśli chcesz uruchomić wszystkie polecenia z eskalowanymi uprawnieniami, możesz spawnować powłokę:
sudo sh -c 'foo | foo2 | foo3'