При использовании && и sudo в первой команде вторая команда запускается также как sudo?


64

Если я запускаю команду.

sudo some-command && some-other-command

Вторая команда запускается также с sudoпреобладанием?

Ответы:


110

TL; DR: НЕТ


Первая команда

sudo some-command

Вторая команда

some-other-command

Команда sudoпринимает следующую команду и выполняет ее с повышенными привилегиями. &&, Однако, не относится к команде и интерпретатора, перед выполнением первой команды. Он сообщает bash: сначала выполнить первую команду, а в случае успеха - вторую

Так что sudoне знает о && some-other command. Когда процесс с повышенными правами завершается, bash принимает возвращаемое значение, а затем выполняет другую команду, которая снова не знает о первой.

Это можно легко продемонстрировать:

$ sudo whoami && whoami
root
username

Чтобы достичь того, что вы хотите, вы можете запустить повышенный bash и позволить ему выполнить обе команды:

$ sudo bash -c 'whoami && whoami'
root
root

Итак, теперь обе команды выполняются от имени пользователя root, так как весь процесс, описанный выше, выполняется с повышенными правами, т.е. сеанс bash начался с этой командой, которая сразу же завершается после завершения. Тем не менее, оба whoamiне знают о существовании друг друга.

Это не подходит ни для какой цели, но для этой демонстрации проще сделать

sudo some-command && sudo some-other-command

29
+1 за whoamiпример.
Карл Х


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

20

Нет. Некоторые примеры, которые делают это:

sudo some-command && sudo some-other-command 
sudo sh -c "some-command && some-other-command"

или если вы хотите использовать команды nest, вы можете даже выполнить:

sudo bash <<"EOF"
some-command
some-other-command
sudo bash <<"EOF2"
    some-command2
    some-other-command2
EOF2
EOF
  • 2-й использует другую оболочку.
  • Помните, что когда вы используете 'или "во 2-й версии, вам нужно экранировать их в командах или параметрах этой команды (т. Е. \' Или \"), чтобы они могли очень быстро усложниться.

Третий метод не работает: $ sudo -s -- whoami && whoamiдаетroot username
BartekChom

@BartekChom извините, я пропустил цитаты об этом
Rinzwind

sudo -s -- "whoami && whoami"кажется, что команда не найдена, более или менее такая же, как команда "whoami && whoami". Как использовать эту конструкцию с &&? Я вижу, что это не sudo -s cd ..дает ошибки в отличие от sudo cd ...
BartekChom

Я узнал что-то новое сегодня sudo bash <<"EOF"! Спасибо! :-)
Fabby

4

Нет, либо вы должны написать sudo дважды, либо сделать что-то вроде

sudo bash -c 'foo && bar'

2

&&означает , что команда правосторонней (второй) будет работать только , только если чтобы сторонняя команда (первый) успешен т.е. код выхода $?является 0.

Эти две команды отличаются друг от друга и будут выполняться в их собственных средах, поэтому вторая команда не будет выполняться с sudoпривилегиями.

Это прояснит вам:

$ sudo whoami && whoami 
root
foobar

1

НЕТ, и следующее было когда-то очень часто макросов.

sudo reboot && exit

Почти каждый должен был сделать это хотя бы один раз

sudo apt-get update && sudo apt-get upgrade

Таким образом, это отличный вопрос для интервью "Микки Маус".

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


0

В командной строке, когда вы видите

$ command one && command two

типичное намерение состоит в том, чтобы выполнить команду, которая следует за &&, только если первая команда успешна.

Другая команда работает также как sudo?

абсолютно нет, это так же, как написание двух последовательных команд, это && не дает никаких дополнительных привилегий команде. Это просто разделитель .

Чтобы доказать это, давайте возьмем пример.

touch fileA fileB 

Я создал два файла fileA и fileB. Теперь я буду управлять командой

sudo chown test:test fileA && chown test:test fileB

Я меняю пользователя и владельца группы этих файлов на проверку имени пользователя и группы. Теперь первая команда должна быть запущена, а другая?

Выход:

chown: changing ownership of `fileB': Operation not permitted

Таким образом, команда не была запущена, так как она нужна, sudoи хотя мы можем сделать вывод, что && не является заменой второгоsudo

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.