su options - Befehl als anderer Benutzer ausführen

75

Ich habe mich gefragt, wie ich einen Befehl als ein anderer Benutzer aus einem Skript ausführen soll.

Ich habe den Eigentümer des Skripts als root festgelegt. Ich habe auch den folgenden Befehl im Skript ausgeführt, um den Befehl als Hudson-Benutzer auszuführen:

su -c command hudson

Ist das die richtige Syntax?

Müllabfuhr
quelle
Für andere Googler: Einige Benutzer haben diese Funktion möglicherweise absichtlich deaktiviert. Du kannst rennen sudo cat /etc/passwd | grep user-abc. Wenn Sie so etwas sehen: user-abc:x:994:994::/home/user-abc:/bin/falsedann wird es nicht funktionieren. Das liegt daran, dass der letzte Teil " /bin/false" bedeutet, dass es für diesen Benutzer keine Shell gibt.
Alexander Bird

Antworten:

78

Ja. Hier ist der --help:

$ su --help
Usage: su [options] [LOGIN]

Options:
  -c, --command COMMAND         pass COMMAND to the invoked shell
  -h, --help                    display this help message and exit
  -, -l, --login                make the shell a login shell
  -m, -p,
  --preserve-environment        do not reset environment variables, and
                                keep the same shell
  -s, --shell SHELL             use SHELL instead of the default in passwd

Und einige Tests (ich habe sudodas Passwort für den nobodyAccount verwendet, da ich es nicht kenne )

$ sudo su -c whoami nobody
[sudo] password for oli: 
nobody

Wenn Ihr Befehl Argumente akzeptiert, müssen Sie sie in Anführungszeichen setzen. Wenn Sie dies nicht tun, werden seltsame Dinge passieren. Hier bin ich als Root und versuche, ein Verzeichnis in / home / oli (als oli) zu erstellen, ohne den vollständigen Befehl anzugeben :

# su -c mkdir /home/oli/java oli
No passwd entry for user '/home/oli/java'

Es wird nur mkdirals Wert für das -cFlag gelesen und versucht, es /home/oli/javaals Benutzername zu verwenden. Wenn wir es zitieren, funktioniert es einfach:

# su -c "mkdir /home/oli/java" oli
# stat /home/oli/java
  File: ‘/home/oli/java
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 811h/2065d  Inode: 5817025     Links: 2
Access: (0775/drwxrwxr-x)  Uid: ( 1000/     oli)   Gid: ( 1000/     oli)
Access: 2016-02-16 10:49:15.467375905 +0000
Modify: 2016-02-16 10:49:15.467375905 +0000
Change: 2016-02-16 10:49:15.467375905 +0000
 Birth: -
Oli
quelle
52

Hinweis: "Ich habe den Eigentümer des Skripts als root festgelegt" führt keine Aktionen aus. Auch wenn Sie das setuid-Bit gesetzt haben, funktioniert es immer noch nicht


Angenommen, Sie führen das Skript tatsächlich als root aus, können Sie es jedoch verwenden sudo. sudient in erster Linie dem Benutzerwechsel, während sudoBefehle wie andere Benutzer ausgeführt werden. Mit dem -uFlag können Sie angeben, welcher Benutzer den Befehl ausführen soll:

sudo -u hudson command
Michael Mrozek
quelle
1
Viele Male habe ich konfrontiert (auf den Systemen , in denen sudoers gut verwaltet wird) , dass der Versuch zu verwenden , sudokönnen Sie dies nur erhalten: root is not in the sudoers file. Welches macht su - <username> -c "command to run"die einzige Option.
RAM237
Anführungszeichen nicht erforderlich, wenn ein nicht trivialer Befehl ausgeführt wird. (ZB sudo -u kilgore mv this that)
toraritte