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

92464
Manish Mathai

Gibt es eine Möglichkeit, einen Teil eines Skripts als einen anderen Benutzer (nicht als Root) auszuführen? Wenn dies hilfreich ist, wird der Teil, der als anderer Benutzer ausgeführt werden soll, am Ende des Skripts angezeigt

Edit:
OS -> Ubuntu 9.04

29
Mögliches Duplikat von [Howto Switch / Chage-Benutzer-ID mit einem Bash-Skript, um Befehle im selben Skript auszuführen?] (http://superuser.com/questions/468161/howto-switch-chage-user-id-witin-a- bash-script-to-execute-command-in-the-same) Dan Dascalescu vor 9 Jahren 1

6 Antworten auf die Frage

33
pcapademic

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, glaube ich nicht, dass es zur Eingabe eines Kennworts auffordert. Andernfalls beschreibt dieser Artikel, wie Sudo mit Kennwort in einer Befehlszeile verwendet wird. , und dieser Artikel beschreibt, wie Sie Sudo ohne Kennwort verwenden können.

Das ist schön und einfach, aber gibt es eine Möglichkeit, dies für eine Gruppe von Befehlen statt für einen Befehl auszuführen? Andrew vor 10 Jahren 2
Schreiben Sie ein Bash-Skript, machen Sie es ausführbar `chmod + x script.sh` und dann einfach` sudo -u Benutzername script.sh` NiCU vor 9 Jahren 0
@Andrew Ich wunderte mich das selbst und folgendes funktionierte für mich: sudo -u ic sh -c 'cmd1 && cmd2' Karussell vor 6 Jahren 0
Fügen Sie auch die Option "i" hinzu, wenn Sie die Umgebung des Benutzers abrufen möchten neoDev vor 6 Jahren 0
6
DaveParillo

Diese Antwort ist gut, aber der Serverfault-Hinweis ist etwas gefährlich - würde jedem erlauben, irgendetwas als root auszuführen! Deshalb poste ich hier, weil ich den Kommentar nicht formatieren kann.

Ich würde empfehlen, visudo zu verwenden, um die Berechtigungen so genau wie möglich zu vergeben. Geben visudoSie eine Zeile ein und fügen Sie sie hinzu:

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 mit folgendem öffnen:

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

Aber ich würde es auch nicht benutzen:

username ALL=(ALL) NOPASSWD: ALL 

oder Benutzername Hostname = ALL

Die Sudoer-Manpage enthält viele blutige Details

Würde es für einen Befehl funktionieren, der nur einem bestimmten Benutzer zur Verfügung steht? Manish Mathai vor 14 Jahren 0
Sie können angeben, dass nur bestimmte Benutzer den Befehl ausführen können (in den obigen Beispielen ersetzen Sie "username" durch den Benutzernamen, 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 das auch in Ordnung - geben Sie diesen Benutzernamen einfach in die Zeile "sudo -u username commandline" des Skripts ein. James Polley vor 14 Jahren 0
@Manish. Ja. Die Sudoers-Datei besagt "Erlaube, dass dieser Benutzername auf diesem Host command1 ausführt, ohne dass ein Kennwort eingegeben werden muss. DaveParillo vor 14 Jahren 0
5
AXE-Labs

# I = wie:

#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 
Könnten Sie erläuternden Text hinzufügen? Kazark vor 11 Jahren 7
4
burtsevyg

Für Sonarqube:

sudo -u sonar /usr/bin/sonar start

wo sonar- Name des Benutzers, auf den der Befehl ausgeführt wird/usr/bin/sonar start

2
dag729

Nicht so sicher, aber wenn Sie möchten, dass NUR das Ende dieses Skripts als anderer Benutzer ausgeführt wird, können Sie es su someuservor dem Ende des Skripts hinzufügen .

Fehlt mir etwas?

Hoffentlich hilft das,

Grüße

Ich denke, dass dies die am besten geeignete Antwort ist, da alle anderen Antworten auf Sudo schließen lassen, das auf einigen minimalen Linux-Installationen nicht standardmäßig installiert ist. Tim vor 6 Jahren 1
1
dparalen

Auf diese Weise wird das Ende eines Skripts von verschiedenen Benutzern (root) ausgeführt. Bitte beachten Sie die $[LINENO+2]und exit $?Anrufe. Diese sind erforderlich, um das Skriptende nur einmal auszuführen und den Beendigungscode des sudoAufrufs beizubehalten.

#!/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