Как запустить две команды в sudo?

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

  • db2 подключиться к ttt (обратите внимание, что нам нужно подключить соединение для второй команды
  • db2 UPDATE CONTACT SET EMAIL_ADDRESS = '[email protected]'

    sudo -su db2inst1 db2 подключиться к ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = '[email protected]'

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

Примечание

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

Ответ 1

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

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

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

sudo -u db2inst1 -s -- "db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = '[email protected]'"

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

sudo -- sh -c 'whoami; whoami'

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

Ответ 2

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

sudo sh -c "whoami; whoami"

Ответ 3

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

sudo bash -c 'whoami; whoami'

Ответ 4

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

sudo -s -- <<EOF
id
pwd
echo "Done."
EOF

Ответ 5

Параметр -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;'

Ответ 6

Альтернатива с использованием 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

Ответ 7

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

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

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

Ответ 8

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

$ sudo bash

Затем напишите столько команд, сколько хотите. Введите exit, когда вы закончите.

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

$ sudo ./script.sh