Иначе должен использовать $1
как имя файла, если это было передано, и /dev/stdout
иначе (который является символьной ссылкой на /proc/self/fd/1
в соответствии с Linux и узлом устройства с тем же значением на многих других вариантах Unix). Например, помещенный это наверху сценария:
if [ -e "$1" ]; then
filename=$1
else
filename=/dev/stdout
fi
И затем перенаправьте вывод каждой команды к $filename
Как способ убедить себя это 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
Как это работает?
Программа эха в двойных кавычках работает как корень из-за sudo, но оболочка, это перенаправляет вывод эха в файл только для корня, все еще работает как Вы. Ваша текущая оболочка делает перенаправление прежде sudo
запускается.
$ sudo tee /proc/sys/vm/drop_caches <<<1
Как это работает?
Этот метод работает tee
программа как корень И берет вход от здесь строка который выполнения до 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'