как запустить две команды в sudo? - PullRequest
142 голосов
/ 06 апреля 2011

Есть ли способ, как я могу запустить две команды Db2 из командной строки? (Они будут вызваны из команды PHP exec.)

  1. db2 connect to ttt (обратите внимание, что для второй команды нам нужно установить соединение в реальном времени
  2. db2 UPDATE CONTACT SET EMAIL_ADDRESS = 'mytestaccount@gmail.com'

Я пробовал это:

sudo -su db2inst1 db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = 'mytestaccount@gmail.com'

Первая команда завершается правильно, но вторая завершается неудачно с сообщением об ошибке SQL1024N A database connection does not exist. SQLSTATE=08003

Обратите внимание, что мне нужно запустить это как пользователь php. Команда sudo -u db2inst1 id as php дает мне правильный вывод.

Ответы [ 9 ]

165 голосов
/ 06 апреля 2011

Для вашей команды вы также можете обратиться к следующему примеру:

sudo sh -c "whoami; whoami"

146 голосов
/ 06 апреля 2011

sudo может запускать несколько команд через оболочку, например:

$ sudo -s -- 'whoami; whoami'
root
root

Ваша команда будет выглядеть примерно так:

sudo -u db2inst1 -s -- "db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = 'mytestaccount@gmail.com'"

Если ваша версия sudo не работает с точками с запятой с -s (очевидно, это не работает, если скомпилированы с определенными параметрами), вы можете использовать

sudo -- sh -c 'whoami; whoami'

вместо этого, что в основном делает то же самое, но заставляет вас явно назвать оболочку.

42 голосов
/ 14 августа 2013

Я обычно делаю:

sudo bash -c 'whoami; whoami'
39 голосов
/ 24 января 2013

Если вы хотите обработать кавычки:

sudo -s -- <<EOF
id
pwd
echo "Done."
EOF
7 голосов
/ 10 марта 2017

Альтернатива с использованием eval, поэтому следует избегать использования подоболочки:

sudo -s eval 'whoami; whoami'

Примечание. Другие ответы, использующие sudo -s, не выполняются, поскольку кавычки передаются в bash и выполняются какединственная команда, поэтому нужно удалить кавычки с помощью eval.eval лучше объяснить, это SO ответ

Цитировать внутри команд тоже проще:

$ sudo -s eval 'whoami; whoami; echo "end;"'
root
root
end;

И если команды должны прекратить работув случае неудачи используйте двойные амперсанды вместо точек с запятой:

$ sudo -s eval 'whoami && whoamit && echo "end;"'
root
/bin/bash: whoamit: command not found
3 голосов
/ 19 июля 2013

Опция -s у меня не сработала, -i сработала.

Вот пример того, как я могу обновить размер журнала из моего bash:

sudo -u [user] -i -- sh -c 'db2 connect to [database name];db2 update db cfg for [database name] using logsecond 20;db2 update db cfg for [database name] using logprimary 20;'
1 голос
/ 05 апреля 2017

На терминале введите:

$ sudo bash

Затем напишите столько команд, сколько хотите. Когда закончите, наберите exit.

Если вам нужно его автоматизировать, создайте файл script.sh и запустите его:

$ sudo ./script.sh
0 голосов
/ 29 мая 2019

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

Например, в Ubuntu,

$ ssh host.name sudo sh -c "whoami; whoami"
[sudo] password for ubuntu:
root
ubuntu

хитрость обнаруженная здесь заключается в двойной кавычке команды.

$ ssh host.name sudo sh -c '"whoami; whoami"'
[sudo] password for ubuntu:
root
root

Другие опции, которые также работают:

ssh host.name sudo sh -c "\"whoami; whoami\""
ssh host.name 'sudo sh -c "whoami; whoami"'

В принципе, двойные кавычки необходимы, потому чтоЯ думаю, что клиентская оболочка, в которой запускается SSH, удаляет самый внешний набор кавычек.Смешайте и сопоставьте кавычки с вашими потребностями (например, переменные должны быть переданы в).Однако YMMV с кавычками, особенно если удаленные команды являются сложными.В таком случае такой инструмент, как Ansible, сделает лучший выбор.

0 голосов
/ 14 сентября 2012

Приведенные выше ответы не позволят вам цитировать внутри кавычек. Это решение будет:

sudo -su nobody umask 0000 \; mkdir -p "$targetdir"

И команда umask, и команда mkdir работают с пользователем nobody.

...