Führen Sie einen Teil eines Bash-Skripts als anderer Benutzer aus

Antworten:

42

Verwenden Sie den Befehl sudo im Skript.

In der Form:

sudo -u username command

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?

pcapademic
quelle
5
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:

username hostname = NOPASSWD: /full/path/to/command1, full/path/to/command2

Wenn Sie dasselbe auf vielen Hosts ausführen müssen, können Sie es öffnen mit:

username ALL = NOPASSWD: /full/path/to/command1, full/path/to/command2

Aber ich würde auch nicht verwenden:

username ALL=(ALL) NOPASSWD: ALL

oder Benutzername hostname = ALL

Die Sudoer-Manpage enthält viele wichtige Details

DaveParillo
quelle
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

# ./Lauf

1: root
2: nobody
3: root
AX Labs
quelle
10
Könnten Sie einen erläuternden Text hinzufügen?
Kazark
4

Für Sonarqube:

sudo -u sonar /usr/bin/sonar start

Wo sonarist der Name des Benutzers, der zum Ausführen des Befehls verwendet wird?/usr/bin/sonar start

burtsevyg
quelle
2

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 .

Vermisse ich etwas?

Hoffentlich hilft das,

Grüße

dag729
quelle
1
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
dparalen
quelle