Führen Sie einen Teil eines Bash-Skripts als anderer Benutzer aus
33
Gibt es eine Möglichkeit, einen Teil eines Skripts als ein anderer (Nicht-Root-) Benutzer auszuführen? Wenn dies hilft, wird der Teil, der als anderer Benutzer ausgeführt werden soll, am Ende des Skripts angezeigt
Das ist schön und einfach, aber gibt es eine Möglichkeit, dies für eine Gruppe von Befehlen zu tun, anstatt für eine nach der anderen?
Andrew
Schreiben Sie ein Bash-Skript, machen Sie es ausführbar chmod +x script.shund dann einfachsudo -u username script.sh
NiCU
@ Andrew Ich habe mich das selbst gefragt und folgendes hat für mich funktioniert: sudo -u ic sh -c 'cmd1 && cmd2'
Karussell
i
Fügen
6
Diese Antwort ist gut, aber der Hinweis zu Serverfehlern ist etwas gefährlich - kann jeder als root ausführen! Ich poste hier, weil ich den Kommentar nicht formatieren kann.
Ich würde empfehlen, visudo zu verwenden, um die erforderlichen Berechtigungen so genau wie möglich zu erteilen. Tippe visudound füge eine Zeile hinzu wie:
Würde es für einen Befehl funktionieren, der nur einem bestimmten Benutzer zur Verfügung steht?
Manish Mathai
Sie können festlegen, dass nur bestimmte Benutzer den Befehl ausführen können (in den obigen Beispielen durch usernameden Benutzernamen ersetzen, der den Befehl ausführen kann). Wenn die ausführbare Datei, die Sie ausführen möchten, nur von einem bestimmten Benutzer ausgeführt werden kann, ist dies auch in Ordnung - übergeben Sie diesen Benutzernamen einfach in der sudo -u username commandlineZeile des Skripts.
James Polley
@Manish. Ja. In der sudoers-Datei heißt es: "Erlaube diesem Benutzernamen auf diesem Host, command1 auszuführen, ohne ein Kennwort
anzugeben
6
Ich mag:
#test if running bash as a different user works
sudo -u nobody bash -c :&& RUNAS="sudo -u nobody"
echo 1: $USER
#Runs bash with commands between '_' as nobody if possible
$RUNAS bash<<_
echo 2: \$USER
_
echo 3: $USER
Ich bin mir nicht sicher, aber wenn Sie möchten, dass NUR das Ende dieses Skripts als ein anderer Benutzer ausgeführt wird, können Sie dies su someuservor dem Ende des Skripts hinzufügen .
Ich denke, dies ist die am besten geeignete Antwort, da alle anderen Antworten auf sudo hindeuten, was bei einigen minimalen Linux-Installationen häufig nicht standardmäßig installiert ist.
Tim
1
Auf diese Weise wird das Ende eines Skripts von einem anderen Benutzer (root) ausgeführt. Bitte beachten Sie die $[LINENO+2]und exit $?Anrufe. Diese sind erforderlich, damit das Ende des Skripts nur einmal ausgeführt wird und der Beendigungscode des sudoAufrufs erhalten bleibt .
#!/bin/bash
echo $USER
# pipe the rest of this script via a sudo call
tail -n +$[LINENO+2] $0 | exec sudo bash
exit $?
echo $USER
exit 1
Antworten:
Verwenden Sie den Befehl sudo im Skript.
In der Form:
Der Befehl sudo führt den Befehl als Benutzernamen aus .
Wenn das Skript als root ausgeführt wird, werden Sie meines Erachtens nicht zur Eingabe eines Kennworts aufgefordert. Andernfalls wird in diesem Artikel die Verwendung von sudo mit Kennwort in einer Befehlszeile beschrieben. , und dieser Artikel beschreibt, wie man sudo ohne Passwort benutzt?
quelle
chmod +x script.sh
und dann einfachsudo -u username script.sh
i
Diese Antwort ist gut, aber der Hinweis zu Serverfehlern ist etwas gefährlich - kann jeder als root ausführen! Ich poste hier, weil ich den Kommentar nicht formatieren kann.
Ich würde empfehlen, visudo zu verwenden, um die erforderlichen Berechtigungen so genau wie möglich zu erteilen. Tippe
visudo
und füge eine Zeile hinzu wie:Wenn Sie dasselbe auf vielen Hosts ausführen müssen, können Sie es öffnen mit:
Aber ich würde auch nicht verwenden:
oder Benutzername hostname = ALL
Die Sudoer-Manpage enthält viele wichtige Details
quelle
username
den Benutzernamen ersetzen, der den Befehl ausführen kann). Wenn die ausführbare Datei, die Sie ausführen möchten, nur von einem bestimmten Benutzer ausgeführt werden kann, ist dies auch in Ordnung - übergeben Sie diesen Benutzernamen einfach in dersudo -u username commandline
Zeile des Skripts.Ich mag:
# ./Lauf
quelle
Für Sonarqube:
sudo -u sonar /usr/bin/sonar start
Wo
sonar
ist der Name des Benutzers, der zum Ausführen des Befehls verwendet wird?/usr/bin/sonar start
quelle
Ich bin mir nicht sicher, aber wenn Sie möchten, dass NUR das Ende dieses Skripts als ein anderer Benutzer ausgeführt wird, können Sie dies
su someuser
vor dem Ende des Skripts hinzufügen .Vermisse ich etwas?
Hoffentlich hilft das,
Grüße
quelle
Auf diese Weise wird das Ende eines Skripts von einem anderen Benutzer (root) ausgeführt. Bitte beachten Sie die
$[LINENO+2]
undexit $?
Anrufe. Diese sind erforderlich, damit das Ende des Skripts nur einmal ausgeführt wird und der Beendigungscode dessudo
Aufrufs erhalten bleibt .quelle