Відповіді:
Як переконати себе в тому, що sudoзапускається лише за допомогою першої команди, що надала її, а все інше після запуску першої труби як оригінального ідентифікатора користувача, ви можете використовувати цю марну ланцюжок команд, щоб побачити її.
$ sudo whoami > file1 | whoami > file2 | whoami > file3
Потім, коли ви отримаєте catці файли, ви побачите такі імена користувачів:
$ cat file{1..3}
root
saml
saml
Однак якщо ви запускаєте передплату:
$ sudo sh -c 'whoami > file4 | whoami > file5 | whoami > file6'
Потім, коли ви catстворюєте ці файли, ви побачите такі імена користувачів:
$ cat file{4..6}
root
root
root
Ваш коментар про 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. Я показую їх тут лише для того, щоб навчати не так, щоб інші обов’язково їх робили !
$ echo "echo 1 > /proc/sys/vm/drop_caches" | sudo sh
Як це працює?
Програма echo всередині подвійних лапок працює як root через sudo, але оболонка, яка перенаправляє висновок echo до файлу, що працює лише для root, як і раніше працює. Ваша поточна оболонка виконує перенаправлення перед sudoзапуском.
$ sudo tee /proc/sys/vm/drop_caches <<<1
Як це працює?
Цей метод запускає teeпрограму як корінь І приймає введення з рядка Here, який працює до sudoвиклику teeкоманди.
# 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), в якій ми "заднім кутом" наш рядок команд для запуску.
Є більше, але я зупинюсь тут. Вони призначені лише для того, щоб показати вам, що ви можете робити, якщо ви все розумієте, але не обов'язково просто з’єднувати барахло разом, оскільки ви можете, ви повинні намагатися підтримувати свої кодові прагми на такому ж логічному рівні, що має сенс, щоб інші могли і розуміти, і підтримувати їх у майбутньому.