Если я наберу «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

1-й бежал, но 2-й и 3-й ничего не делают, так как они не оснащены для ввода. Скорее я думаю, что вы хотели написать что-то вроде этого:

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

Что эквивалентно запуску его 3 раза в 3 различных командных приглашениях. Или это:

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

Но никогда не делай этого в последний раз. Это относится к следующему разделу.

Неясные способы вызова sudo

Это не моя лучшая работа, но вы могли бы увидеть, как я выполняю несколько команд с помощью 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программу от имени пользователя root и получает входные данные из строки 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'

Но при просмотре справочной страницы -sкоммутатор говорит, что он передаст единственную команду оболочке, определенной в пользовательской записи /etc/passwdфайла. Таким образом, мы используем трюк во второй форме, главным образом передавая оболочку, другую оболочку ( sh -c), в которой мы «закуливаем» нашу строку команд для запуска.

Есть еще, но я остановлюсь здесь. Это только для того, чтобы показать вам, что вы можете сделать, если вы понимаете вещи, но не обязательно должны просто соединять мусор в цепочку, потому что вы можете, вы должны попытаться сохранить прагмы кода на логическом уровне, который имеет смысл, чтобы другие могли и понимать, и поддерживать их в будущем.

SLM
источник
6

Нет, в вашем примере только fooвыполняется sudo. Если вы хотите запустить все команды с повышенными привилегиями, вы можете создать оболочку:

sudo sh -c 'foo | foo2 | foo3'
jordanm
источник