Если я наберу sudo
в начале строки в Bash, это относится к остальным командам?
Другими словами, это:
sudo foo | foo2 | foo3
эквивалентно этому:
sudo foo | sudo foo2 | sudo foo3
В качестве способа убедить себя, что он 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
1-й бежал, но 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
программу от имени пользователя root и получает входные данные из строки 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'
Но при просмотре справочной страницы -s
коммутатор говорит, что он передаст единственную команду оболочке, определенной в пользовательской записи /etc/passwd
файла. Таким образом, мы используем трюк во второй форме, главным образом передавая оболочку, другую оболочку ( sh -c
), в которой мы «закуливаем» нашу строку команд для запуска.
Есть еще, но я остановлюсь здесь. Это только для того, чтобы показать вам, что вы можете сделать, если вы понимаете вещи, но не обязательно должны просто соединять мусор в цепочку, потому что вы можете, вы должны попытаться сохранить прагмы кода на логическом уровне, который имеет смысл, чтобы другие могли и понимать, и поддерживать их в будущем.
Нет, в вашем примере только foo
выполняется sudo
. Если вы хотите запустить все команды с повышенными привилегиями, вы можете создать оболочку:
sudo sh -c 'foo | foo2 | foo3'