Если я ввожу “sudo” в начале одного лайнера, он относится к остальной части команд?

Иначе должен использовать $1 как имя файла, если это было передано, и /dev/stdout иначе (который является символьной ссылкой на /proc/self/fd/1 в соответствии с Linux и узлом устройства с тем же значением на многих других вариантах Unix). Например, помещенный это наверху сценария:

if [ -e "$1" ]; then
    filename=$1
else
    filename=/dev/stdout
fi

И затем перенаправьте вывод каждой команды к $filename

10
11.09.2013, 09:42
2 ответа

Как способ убедить себя это 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

Как это работает?

Программа эха в двойных кавычках работает как корень из-за sudo, но оболочка, это перенаправляет вывод эха в файл только для корня, все еще работает как Вы. Ваша текущая оболочка делает перенаправление прежде sudo запускается.

Способом № 2

$ sudo tee /proc/sys/vm/drop_caches <<<1

Как это работает?

Этот метод работает tee программа как корень И берет вход от здесь строка который выполнения до 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) в котором мы "бэкдор" наша строка команд для выполнения.

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

11
27.01.2020, 20:01

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

sudo sh -c 'foo | foo2 | foo3'
6
27.01.2020, 20:01

Теги

Похожие вопросы