Czy istnieje sposób, w jaki mogę uruchomić dwa polecenia Db2 z wiersza poleceń? (Będą wywoływane z PHPexec
polecenia ).
db2 connect to ttt
(zauważ, że musimy mieć aktywne połączenie dla drugiego poleceniadb2 UPDATE CONTACT SET EMAIL_ADDRESS = '[email protected]'
Próbowałem tego:
sudo -su db2inst1 db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = '[email protected]'
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 id
jako użytkownik php daje mi poprawne wyjście.
Odpowiedzi:
sudo może uruchamiać wiele poleceń za pośrednictwem powłoki, na przykład:
Twoje polecenie wyglądałoby mniej więcej tak:
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ć
zamiast tego, co zasadniczo robi to samo, ale sprawia, że jawnie nazywasz powłokę.
źródło
sudo -s -- '/usr/bin/whoami; /usr/bin/whoami' /bin/bash: /usr/bin/whoami; /usr/bin/whoami: No such file or directory
sudo -- sh -c 'whoami; whoami;
jako obejścia, gdy „sudo -s” jest zepsute. Zaktualizowałem również odpowiedź.--
Wskazuje koniec parametrówsudo
, więc wszystko inne jest częścią polecenia; bez tego argumenty takie jak-c
mogłyby być interpretowane jako argument dosudo
. Działa to w przypadku większości (ale nie wszystkich) programów wiersza poleceń. Na inny (niesudo
) przykład, aby usunąć plik o nazwie-f
nie możesz po prostu uruchomićrm -f
, prawda ?! Ale możesz uruchomić,rm -- -f
aby usunąć plik o nazwie-f
.Jako polecenie możesz również odnieść się do następującego przykładu:
sudo sh -c 'whoami; whoami'
źródło
Zwyklę robię:
źródło
Jeśli chcesz obsługiwać cytaty:
źródło
sudo
- zawsze musisz nakłonić go do wykonania powłoki, która może akceptować wiele poleceń do uruchomienia jako parametry”Alternatywne użycie,
eval
aby uniknąć użycia podpowłoki:Uwaga: Inne odpowiedzi używające
sudo -s
zawodzą, ponieważ cudzysłowy są przekazywane do bash i uruchamiane jako jedno polecenie, więc należy usunąć cudzysłowy za pomocą funkcji eval.eval
lepiej wyjaśnione jest to TAK odpowiedźCytowanie w poleceniach jest również łatwiejsze:
A jeśli komendy muszą przestać działać, jeśli jedno się nie powiedzie, użyj podwójnych ampersandów zamiast średników:
źródło
Ta
-s
opcja nie zadziałała dla mnie-i
.Oto przykład, jak mogę zaktualizować rozmiar dziennika z mojego basha:
źródło
Na terminalu wpisz:
Następnie napisz tyle poleceń, ile chcesz. Wpisz,
exit
kiedy skończysz.Jeśli chcesz to zautomatyzować, utwórz
script.sh
plik i uruchom go:źródło
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,
Odkryta tutaj sztuczka polega na dwukrotnym zacytowaniu polecenia.
Inne opcje, które również działają:
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.
źródło
Jeśli znasz hasło roota, możesz spróbować
źródło
sudo su -c "<command1> ; <command2>"
.Powyższe odpowiedzi nie pozwolą ci cytować w cudzysłowie. To rozwiązanie:
Zarówno komenda umask, jak i komenda mkdir-komenda są uruchamiane z użytkownikiem „nobody”.
źródło