як запустити дві команди в судо?


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 (мабуть, це не, якщо компільовано з певними параметрами), ви можете використовувати

sudo - sh -c 'whoami; хто я'

натомість, що в основному робить те саме, але змушує вас чітко називати оболонку.


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" порушено. Я також оновив відповідь.
wjl

6
+1 для відредагованої версії, яка показує приклад "- sh -c". Дякую!
JD.

4
Чи можете ви поясніть, навіщо вам потрібно "-"?
Вік Седублеєв

7
@VicSeedoubleyew --Позначає кінець параметрів для sudo, тому все інше є частиною команди; без цього аргументи на зразок -cможна інтерпретувати як аргумент sudo. Це працює для більшості (але не для всіх) програм командного рядка. Для іншого (не sudo) прикладу, щоб видалити файл, який називається, -fви не можете просто запустити rm -f, правда ?! Але ви можете запустити, rm -- -fщоб видалити названий файл -f.
wjl

176

Для своєї команди ви також можете звернутися до наступного прикладу:

sudo sh -c 'whoami; whoami'


14
Я знайшов це більш надійною альтернативою.
Нік


42

Якщо ви хочете обробити цитати:

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

4
Тут найчистіша відповідь, дякую. Можливо, додайте примітку "Ви не можете запускати декілька команд з sudo- вам завжди потрібно ввести її в виконання оболонки, яка може приймати декілька команд для виконання як параметрів"
trs

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

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;'

1

На терміналі введіть:

$ sudo bash

Потім запишіть стільки команд, скільки вам потрібно. Введіть, exitколи ви зробили.

Якщо вам потрібно автоматизувати його, створіть script.shфайл і запустіть його:

$ sudo ./script.sh

1

У дещо пов'язаній темі я хотів зробити те ж саме багатокомандне судо через 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

Якщо ви знаєте кореневий пароль, можете спробувати

su -c "<command1> ; <command2>"  

Якщо ви не знаєте корінний пароль, використовуйте sudo su -c "<command1> ; <command2>" .
Dag Høidahl

0

Наведені вище відповіді не дозволять вам цитувати всередині цитат. Це рішення:

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

І команда umask, і команда mkdir працює з користувачем "ніхто".


Ви можете використовувати одинарні та подвійні лапки і уникати їх.
Радек

Ок, так як тепер, незалежно від того, на що я поставив umask у цій команді, це не має ефекту?
Майкл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.