Відповіді:
Як переконати себе в тому, що 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
), в якій ми "заднім кутом" наш рядок команд для запуску.
Є більше, але я зупинюсь тут. Вони призначені лише для того, щоб показати вам, що ви можете робити, якщо ви все розумієте, але не обов'язково просто з’єднувати барахло разом, оскільки ви можете, ви повинні намагатися підтримувати свої кодові прагми на такому ж логічному рівні, що має сенс, щоб інші могли і розуміти, і підтримувати їх у майбутньому.