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

152

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

  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как пользователь php дает мне правильный вывод.

Радек
источник
Пожалуйста, оставьте комментарий, почему вы хотите закрыть этот вопрос. Спасибо.
Радек
1
Близкий голос за переход на серверный сбой, так как это вопрос системного администрирования, а не программирования.
bdonlan

Ответы:

157

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

$ sudo -s - 'whoami; кто я'
корень
корень

Ваша команда будет что-то вроде:

sudo -u db2inst1 -s - "db2 подключиться к ttt; db2 ОБНОВИТЬ КОНТАКТ НАБОР EMAIL_ADDRESS = 'mytestaccount@gmail.com'"

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

судо - sh-c 'whoami; кто я'

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

WJL
источник
12
это не работает в последней стабильной (сжатой) версии Debian:sudo -s -- '/usr/bin/whoami; /usr/bin/whoami' /bin/bash: /usr/bin/whoami; /usr/bin/whoami: No such file or directory
Доблесть
11
@Valor вы можете использовать sudo -- sh -c 'whoami; whoami;как обходной путь, когда "sudo -s" не работает. Я также обновил ответ.
2012 года
6
+1 для отредактированной версии, которая показывает пример "- sh -c". Спасибо!
JD.
4
Можете ли вы объяснить, почему вам нужно "-"?
Вик Seedoubleyew
7
@VicSeedoubleyew The --указывает конец параметров для sudo, поэтому все остальное является частью команды; без этого аргументы вроде -cмогут быть интерпретированы как аргумент sudo. Это работает для большинства (но не всех) программ командной строки. В другом (не sudo) примере, удалить файл с именем, который -fвы не можете просто запустить rm -f, верно ?! Но вы можете запустить, rm -- -fчтобы удалить файл с именем -f.
июля
176

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

sudo sh -c 'whoami; whoami'

Джейсон
источник
14
Я нашел это более надежной альтернативой.
Ник
44

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

sudo bash -c 'whoami; whoami'
Самер Атани
источник
42

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

sudo -s -- <<EOF
id
pwd
echo "Done."
EOF
Nebojša
источник
4
Это самый чистый ответ здесь, спасибо. Может быть , добавить примечание «Вы не можете запустить несколько команд из sudo- вы всегда должны обмануть его в выполнении оболочки , которая может принимать несколько команд для запуска в качестве параметров»
ТРС
8

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

sudo -s eval 'whoami; whoami'

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

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

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

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

$ sudo -s eval 'whoami && whoamit && echo "end;"'
root
/bin/bash: whoamit: command not found
Cas
источник
3

-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;'
user2597485
источник
1

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

$ sudo bash

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

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

$ sudo ./script.sh
Моше Симантов
источник
1

В немного связанной теме я хотел сделать то же самое 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, сделает лучший выбор.

Юджин Чоу
источник
1

Если вы знаете пароль пользователя root, вы можете попробовать

su -c "<command1> ; <command2>"  
осколки
источник
Если вы не знаете пароль root, используйте sudo su -c "<command1> ; <command2>" .
Даг Хайдал
0

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

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

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

Арберг
источник
Вы можете использовать одинарные и двойные кавычки и избежать их.
Радек
Хорошо, так почему же, теперь независимо от того, на что я установил значение umask в этой команде, это не имеет никакого эффекта?
Майкл