it-swarm.com.de

wie führe ich zwei Befehle in Sudo aus?

Gibt es eine Möglichkeit, wie ich zwei Db2-Befehle von einer Befehlszeile aus ausführen kann? (Sie werden von einem PHP exec-Befehl aus aufgerufen.)

  1. db2 connect to ttt (Beachten Sie, dass die Verbindung für den zweiten Befehl live sein muss
  2. db2 UPDATE CONTACT SET EMAIL_ADDRESS = '[email protected]'

Ich habe das versucht:

Sudo -su db2inst1 db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = '[email protected]'

Der erste Befehl wird korrekt beendet, der zweite Befehl schlägt jedoch mit der Fehlermeldung SQL1024N A database connection does not exist. SQLSTATE=08003 fehl.

Beachten Sie, dass ich dies als PHP-Benutzer ausführen muss. Der Befehl Sudo -u db2inst1 id als php user liefert eine korrekte Ausgabe.

135
Radek

Sudo kann mehrere Befehle über eine Shell ausführen, zum Beispiel:

 $ Sudo -s - 'whoami; whoami '
 root 
 root 

Ihr Befehl wäre ungefähr so:

 Sudo -u db2inst1 -s - "db2 stellt eine Verbindung zu ttt her; db2 UPDATE CONTACT SET EMAIL_ADDRESS = '[email protected]'" 

Wenn Ihre Sudo-Version nicht mit Semikola mit -s funktioniert (anscheinend nicht mit bestimmten Optionen kompiliert), können Sie dies verwenden

 Sudo - sh -c 'whoami; Wer bin ich'

was im Grunde das Gleiche tut, aber die Shell explizit benennt.

141
wjl

Für Ihren Befehl können Sie auch auf folgendes Beispiel verweisen:

Sudo sh -c "whoami; whoami"

160
Jason

Normalerweise mache ich:

Sudo bash -c 'whoami; whoami'
42
Samer Atiani

Wenn Sie mit Zitaten umgehen möchten:

Sudo -s -- <<EOF
id
pwd
echo "Done."
EOF
37
Nebojša

Eine Alternative, die eval verwendet, um die Verwendung einer Subshell zu vermeiden:

Sudo -s eval 'whoami; whoami'

Hinweis: Die anderen Antworten, die Sudo -s verwenden, schlagen fehl, da die Anführungszeichen an die Bash übergeben werden und als einzelner Befehl ausgeführt werden. Daher müssen Anführungszeichen mit eval entfernt werden. eval ist besser erklärt diese SO Antwort

Das Zitieren innerhalb der Befehle ist auch einfacher:

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

Und wenn die Befehle nicht mehr ausgeführt werden müssen, wenn ein Fehler auftritt, verwenden Sie Doppel-Ampersand-Zeichen anstelle von Semikolons:

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

Die -s-Option hat für mich nicht funktioniert, -i hat funktioniert.

Hier ein Beispiel, wie ich die Protokollgröße von meiner Bash aus aktualisieren könnte:

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

Bei einem etwas verwandten Thema wollte ich dasselbe Sudo mit mehreren Befehlen über SSH ausführen, aber keines der oben genannten hat funktioniert.

Zum Beispiel auf Ubuntu,

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

Der Trick hier entdeckt besteht darin, den Befehl in doppelte Anführungszeichen zu setzen.

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

Andere Optionen, die auch funktionieren:

ssh Host.name Sudo sh -c "\"whoami; whoami\""
ssh Host.name 'Sudo sh -c "whoami; whoami"'

Im Prinzip werden doppelte Anführungszeichen benötigt, da die Client-Shell, auf der SSH ausgeführt wird, die äußersten Anführungszeichen entfernt. Mischen Sie die Anführungszeichen und passen Sie sie an Ihre Bedürfnisse an (z. B. Variablen müssen übergeben werden). Allerdings YMMV mit den Anführungszeichen vor allem, wenn die Remote-Befehle komplex sind. In diesem Fall ist ein Tool wie Ansible die bessere Wahl.

0
Eugene Chow

Die obigen Antworten lassen Sie nicht in die Anführungszeichen zitieren. Diese Lösung wird:

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

Sowohl der Befehl umask als auch der Befehl mkdir werden mit dem Benutzer "nobody" ausgeführt.

0
arberg

Geben Sie im Terminal Folgendes ein:

$ Sudo bash

Dann schreiben Sie so viele Befehle, wie Sie möchten. Geben Sie exit ein, wenn Sie fertig sind.

Wenn Sie es automatisieren müssen, erstellen Sie eine script.sh-Datei und führen Sie sie aus:

$ Sudo ./script.sh
0
Moshe Simantov