Якщо я набираю "sudo" на початку одного вкладиша, чи застосовується це до решти команд?


10

Якщо я набираю sudoна початку одного вкладиша в bash, чи це стосується решти команд?

Іншими словами, це:

sudo foo | foo2 | foo3

рівнозначно цьому:

sudo foo | sudo foo2 | sudo foo3

Відповіді:


11

Як переконати себе в тому, що sudoзапускається лише за допомогою першої команди, що надала її, а все інше після запуску першої труби як оригінального ідентифікатора користувача, ви можете використовувати цю марну ланцюжок команд, щоб побачити її.

Приклад №1

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

Потім, коли ви отримаєте catці файли, ви побачите такі імена користувачів:

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

Приклад №2

Однак якщо ви запускаєте передплату:

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

Потім, коли ви catстворюєте ці файли, ви побачите такі імена користувачів:

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

Приклад №3

Ваш коментар про sudo foo1 | sudo foo2 ...ніколи не буде спрацьовувати, оскільки вихід із нього sudo foo1буде наданий sudo foo2. Використовуючи мої whoamiприклади, це показує, що цей ланцюжок команд нічого не робить.

$ sudo whoami | sudo whoami | sudo whoami
root

Перший біг, але 2-й і 3-й нічого не роблять, оскільки вони не облаштовані приймати вклад. Швидше я думаю, ви мали намір написати щось подібне:

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

Що еквівалентно виконувати його 3 рази на 3 різних командних підказках. Або це:

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

Але ніколи не роби цього останнього. Він належить до наступного розділу.

Неясні способи викликати судо

Це не моя найкраща робота, але це інші способи, ви могли бачити, як я виконую кілька команд, використовуючи sudo. Я показую їх тут лише для того, щоб навчати не так, щоб інші обов’язково їх робили !

Шлях №1

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

Як це працює?

Програма echo всередині подвійних лапок працює як root через sudo, але оболонка, яка перенаправляє висновок echo до файлу, що працює лише для root, як і раніше працює. Ваша поточна оболонка виконує перенаправлення перед sudoзапуском.

Шлях №2

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

Як це працює?

Цей метод запускає teeпрограму як корінь І приймає введення з рядка Here, який працює до sudoвиклику teeкоманди.

Шлях №3

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

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

Як це працює?

Вони можуть виглядати інакше, але вони дійсно роблять те саме. При використанні -sперемикача sudoбуде виконувати одну команду. Я ніколи не міг зрозуміти, чи є спосіб уникнути цього. Нічого подібного не буде працювати.

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

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

Але дивлячись на сторінку man, -sперемикач говорить, що передасть одну команду оболонці, визначеній у введенні користувачем /etc/passwdфайлу. Таким чином, ми використовуємо трюк у другій формі, в основному передаючи оболонку, іншу оболонку ( sh -c), в якій ми "заднім кутом" наш рядок команд для запуску.

Є більше, але я зупинюсь тут. Вони призначені лише для того, щоб показати вам, що ви можете робити, якщо ви все розумієте, але не обов'язково просто з’єднувати барахло разом, оскільки ви можете, ви повинні намагатися підтримувати свої кодові прагми на такому ж логічному рівні, що має сенс, щоб інші могли і розуміти, і підтримувати їх у майбутньому.


6

Ні, у вашому прикладі fooвиконується лише sudo. Якщо ви хочете запустити всі команди з ескалаційними привілеями, ви можете породити оболонку:

sudo sh -c 'foo | foo2 | foo3'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.