Gibt es eine Möglichkeit, wie ich zwei Db2-Befehle über eine Befehlszeile ausführen kann? (Sie werden von einem PHP- exec
Befehl aufgerufen .)
db2 connect to ttt
(Beachten Sie, dass die Verbindung für den zweiten Befehl aktiv sein mussdb2 UPDATE CONTACT SET EMAIL_ADDRESS = '[email protected]'
Ich habe es versucht:
sudo -su db2inst1 db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = '[email protected]'
Der erste Befehl wird korrekt beendet, der zweite schlägt jedoch mit der Fehlermeldung fehl SQL1024N A database connection does not exist. SQLSTATE=08003
Beachten Sie, dass ich dies als PHP-Benutzer ausführen muss. Der Befehl sudo -u db2inst1 id
als PHP- Benutzer gibt mir die richtige Ausgabe.
Antworten:
sudo kann mehrere Befehle über eine Shell ausführen, zum Beispiel:
Ihr Befehl wäre so etwas wie:
Wenn Ihre Sudo-Version nicht mit Semikolons mit -s funktioniert (anscheinend nicht, wenn sie mit bestimmten Optionen kompiliert wurde), können Sie sie verwenden
Stattdessen wird im Grunde das Gleiche getan, aber Sie müssen die Shell explizit benennen.
quelle
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;
als Problemumgehung verwenden, wenn "sudo -s" fehlerhaft ist. Ich habe die Antwort ebenfalls aktualisiert.--
gibt das Ende der Parameter ansudo
, sodass alles andere Teil des Befehls ist. ohne sie-c
könnten Argumente wie als Argument für interpretiert werdensudo
. Dies funktioniert für die meisten (aber nicht alle) Befehlszeilenprogramme. Für ein anderes (Nicht-sudo
) Beispiel, um eine Datei namens zu entfernen-f
, können Sie nicht einfach ausführenrm -f
, oder?! Sie können jedoch ausführenrm -- -f
, um die aufgerufene Datei zu löschen-f
.Für Ihren Befehl können Sie sich auch auf das folgende Beispiel beziehen:
sudo sh -c 'whoami; whoami'
quelle
Normalerweise mache ich:
quelle
Wenn Sie Angebote bearbeiten möchten:
quelle
sudo
- Sie müssen ihn immer dazuEine Alternative, bei der
eval
die Verwendung einer Unterschale vermieden wird:Hinweis: Die anderen Antworten mit "
sudo -s
fehlschlagen", da die Anführungszeichen an bash weitergeleitet und als einzelner Befehl ausgeführt werden. Daher müssen Anführungszeichen mit "eval" entfernt werden.eval
Besser erklärt ist diese SO AntwortDas Zitieren innerhalb der Befehle ist ebenfalls einfacher:
Und wenn die Befehle nicht mehr ausgeführt werden müssen, wenn einer fehlschlägt, verwenden Sie Doppel-Et-Zeichen anstelle von Semikolons:
quelle
Die
-s
Option hat bei mir nicht funktioniert-i
.Hier ist ein Beispiel, wie ich die Protokollgröße aus meiner Bash aktualisieren kann:
quelle
Geben Sie auf dem Terminal Folgendes ein:
Schreiben Sie dann so viele Befehle, wie Sie möchten. Geben
exit
Sie ein, wenn Sie fertig sind.Wenn Sie es automatisieren müssen, erstellen Sie eine
script.sh
Datei und führen Sie sie aus:quelle
Bei einem etwas verwandten Thema wollte ich das gleiche Multi-Command-Sudo über SSH ausführen, aber keines der oben genannten Verfahren hat funktioniert.
Zum Beispiel unter Ubuntu,
Der hier entdeckte Trick besteht darin, den Befehl in doppelte Anführungszeichen zu setzen.
Andere Optionen, die auch funktionieren:
Im Prinzip sind doppelte Anführungszeichen erforderlich, da ich denke, dass die Client-Shell, in 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. müssen Variablen übergeben werden). Allerdings YMMV mit den Anführungszeichen, insbesondere wenn die Remote-Befehle komplex sind. In diesem Fall trifft ein Tool wie Ansible eine bessere Wahl.
quelle
Wenn Sie das Root-Passwort kennen, können Sie es versuchen
quelle
sudo su -c "<command1> ; <command2>"
.Mit den obigen Antworten können Sie nicht innerhalb der Anführungszeichen zitieren. Diese Lösung wird:
Sowohl der Befehl umask als auch der Befehl mkdir werden mit dem Benutzer 'Nobody' ausgeführt.
quelle