jak uruchomić dwie komendy w sudo?


152

Czy istnieje sposób, w jaki mogę uruchomić dwa polecenia Db2 z wiersza poleceń? (Będą wywoływane z PHPexec polecenia ).

  1. db2 connect to ttt (zauważ, że musimy mieć aktywne połączenie dla drugiego polecenia
  2. db2 UPDATE CONTACT SET EMAIL_ADDRESS = 'mytestaccount@gmail.com'

Próbowałem tego:

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

Pierwsza komenda kończy się poprawnie, ale druga kończy się niepowodzeniem z komunikatem o błędzie SQL1024N A database connection does not exist. SQLSTATE=08003

Zauważ, że muszę to uruchomić jako użytkownik php. Polecenie sudo -u db2inst1 idjako użytkownik php daje mi poprawne wyjście.


zostaw komentarz, dlaczego chcesz zamknąć to pytanie. Dziękuję Ci.
Radek,

1
Końcowe głosowanie dotyczy migracji do awarii serwera, ponieważ jest to kwestia administracyjna systemu, a nie programowania.
bdonlan,

Odpowiedzi:


157

sudo może uruchamiać wiele poleceń za pośrednictwem powłoki, na przykład:

$ sudo -s - 'whoami; kim jestem'
korzeń
korzeń

Twoje polecenie wyglądałoby mniej więcej tak:

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

Jeśli twoja wersja sudo nie działa ze średnikami z -s (najwyraźniej nie działa, jeśli jest skompilowana z określonymi opcjami), możesz użyć

sudo - sh -c 'whoami; kim jestem'

zamiast tego, co zasadniczo robi to samo, ale sprawia, że ​​jawnie nazywasz powłokę.


12
to nie działa na najnowszej stabilnej debianie (squeeze) bash:sudo -s -- '/usr/bin/whoami; /usr/bin/whoami' /bin/bash: /usr/bin/whoami; /usr/bin/whoami: No such file or directory
Valor

11
@Valor, którego możesz użyć sudo -- sh -c 'whoami; whoami;jako obejścia, gdy „sudo -s” jest zepsute. Zaktualizowałem również odpowiedź.
wjl

6
+1 dla edytowanej wersji, która pokazuje przykład „- sh -c”. Dzięki!
JD.

4
Czy możesz wyjaśnić, dlaczego potrzebujesz znaku „-”?
Vic Seedoubleyew

7
@VicSeedoubleyew --Wskazuje koniec parametrów sudo, więc wszystko inne jest częścią polecenia; bez tego argumenty takie jak -cmogłyby być interpretowane jako argument do sudo. Działa to w przypadku większości (ale nie wszystkich) programów wiersza poleceń. Na inny (nie sudo) przykład, aby usunąć plik o nazwie -fnie możesz po prostu uruchomić rm -f, prawda ?! Ale możesz uruchomić, rm -- -faby usunąć plik o nazwie -f.
wjl

176

Jako polecenie możesz również odnieść się do następującego przykładu:

sudo sh -c 'whoami; whoami'


14
Uważam, że jest to bardziej niezawodna alternatywa.
Nick


42

Jeśli chcesz obsługiwać cytaty:

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

4
To najczystsza odpowiedź, dzięki. Może dodaj notatkę „Nie możesz uruchomić wielu poleceń z sudo- zawsze musisz nakłonić go do wykonania powłoki, która może akceptować wiele poleceń do uruchomienia jako parametry”
trs

8

Alternatywne użycie, evalaby uniknąć użycia podpowłoki:

sudo -s eval 'whoami; whoami'

Uwaga: Inne odpowiedzi używające sudo -szawodzą, ponieważ cudzysłowy są przekazywane do bash i uruchamiane jako jedno polecenie, więc należy usunąć cudzysłowy za pomocą funkcji eval. evallepiej wyjaśnione jest to TAK odpowiedź

Cytowanie w poleceniach jest również łatwiejsze:

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

A jeśli komendy muszą przestać działać, jeśli jedno się nie powiedzie, użyj podwójnych ampersandów zamiast średników:

$ sudo -s eval 'whoami && whoamit && echo "end;"'
root
/bin/bash: whoamit: command not found

3

Ta -sopcja nie zadziałała dla mnie -i.

Oto przykład, jak mogę zaktualizować rozmiar dziennika z mojego basha:

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

Na terminalu wpisz:

$ sudo bash

Następnie napisz tyle poleceń, ile chcesz. Wpisz, exitkiedy skończysz.

Jeśli chcesz to zautomatyzować, utwórz script.shplik i uruchom go:

$ sudo ./script.sh

1

Jeśli chodzi o nieco powiązany temat, chciałem zrobić to samo sudo z wieloma poleceniami przez SSH, ale żadne z powyższych nie działało.

Na przykład w Ubuntu,

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

Odkryta tutaj sztuczka polega na dwukrotnym zacytowaniu polecenia.

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

Inne opcje, które również działają:

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

Zasadniczo potrzebne są podwójne cudzysłowy, ponieważ myślę, że powłoka klienta, w której działa SSH, usuwa najbardziej zewnętrzny zestaw cudzysłowów. Mieszaj i dopasowuj cytaty do swoich potrzeb (np. Zmienne muszą zostać przekazane). Jednak YMMV z cudzysłowami, zwłaszcza jeśli polecenia zdalne są złożone. W takim przypadku narzędzie takie jak Ansible dokona lepszego wyboru.


1

Jeśli znasz hasło roota, możesz spróbować

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

Jeśli nie znasz hasła roota, użyj sudo su -c "<command1> ; <command2>" .
Dag Høidahl

0

Powyższe odpowiedzi nie pozwolą ci cytować w cudzysłowie. To rozwiązanie:

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

Zarówno komenda umask, jak i komenda mkdir-komenda są uruchamiane z użytkownikiem „nobody”.


Możesz używać pojedynczych i podwójnych cudzysłowów i zmieniać ich znaczenie.
Radek

Ok, więc jak to się stało, teraz ważne na co ustawię umask w tym poleceniu, to nie ma efektu?
Michael,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.