Führen Sie das Skript als Benutzer mit einer Nologin-Shell aus

87

Alles, was ich tun muss, ist, ein bestimmtes Skript als ein bestimmter Benutzer auszuführen, der die in nologin/falseangegebene Shell hat /etc/passwd.

Ich würde das Skript als root ausführen und dies sollte als ein anderer Benutzer ausgeführt werden. Laufen:

~# su -c "/bin/touch /tmp/test" testuser

würde funktionieren, aber ich brauche eine gültige Shell für den Testbenutzer. Ich weiß, dass ich das Passwort mit deaktivieren kann passwd -d testuserund die Shell auf /bin/bashdiese Weise etwas sicherer machen würde, aber ich brauche eine nologin/falseShell.

Grundsätzlich brauche ich eine Funktion, crontabwenn Jobs als bestimmter Benutzer ausgeführt werden sollen, unabhängig davon, ob dieser Benutzer eine nologin/falseShell hat.

ps Ich habe diesen Thread gefunden. Einen Befehl als Nologin-Benutzer ausführen , aber ich habe keine Ahnung, wie concatenateder Befehl su -s /bin/sh $userfür das Skript ausgeführt werden soll.

Tommaso
quelle

Antworten:

119

Sie können die Option -s verwenden, um eine bestimmte Shell auszuführen

su -s /bin/bash -c '/path/to/your/script' testuser

( sudoWenn Sie testuserkein Passwort haben, gehen Sie wie oben beschrieben vor .)

Iain
quelle
Was ist, wenn su ist root:root -rwsr-x---?
Patryk
1
Was ist, wenn der Benutzer kein Passwort hat?
CMCDragonkai
3
@Wesley Es wurde festgestellt, dass Sie root sein müssen, um diesen Befehl für kennwortlose Benutzer auszuführen.
CMCDragonkai
1
@lain, Wenn der Benutzer keine Shell haben soll, sollte der mit dem Befehl verbundene Prozess kein Kind eines Bash-Prozesses sein. Daher sollten Sie auch exec verwenden, um die Shell durch das Skript zu ersetzen. Und wenn Sie das Skript zu einem Kind von init machen möchten, verwenden Sie einfach & als Beispielsu -s /bin/bash -c 'exec /path/to/your/script &' test
Facundo Victor
1
Da ich die letzten 20 Minuten damit verbracht habe, herauszufinden, wie das gleiche Ergebnis mit erzielt werden kann runuser, möchte ich darauf hinweisen, dass der su -s SHELLParameter den Befehl runuser so gut wie unbrauchbar macht :) Danke Jan!
Jirka
12

Sie können dies tun, sudo -uwenn Sie es installiert haben:

# whoami
root
# sudo -u apache whoami
apache
# getent passwd apache
apache:x:48:48:Apache:/var/www:/sbin/nologin
Heimwerker5
quelle
Wie übergeben Sie Parameter an sudo -u apache whoami?
CMCDragonkai
@CMCDragonkai Alle Parameter nach dem Befehl werden weitergegeben. Sie können es sich wie "sudo [-u apache] [whoami <param1> <param2>]" vorstellen.
Handwerker5
Ich denke, die Verwendung von sudo -uist wahrscheinlich keine gute Idee für das Ausführen von Befehlen als Nologin-Benutzer, da dadurch SUDO_USERdie Umgebung offengelegt wird, in der der eigentliche Benutzer den Befehl aufruft. Vielleicht überdenke ich es nur.
Miau
5

Indem Sie das Skript als Argument für die Ausführung von / bin / sh angeben:

su -s "/bin/sh /your/script/location" username
adaptr
quelle
2

gerade realisiert :

su -s "/ bin / bash" -c "/ bin / touch / tmp / testuser" testuser

Vielleicht gibt es einen besseren Weg?!

Tommaso
quelle
0

Tatsächlich ist der beste Weg, dies zu tun, über runuser

Einzelheiten finden Sie auf der Manpage

Dieses Tool wird verwendet, um mit der Situation umzugehen, wie der Entwickler in seinem Bolg sagte

Wann immer ein Dienst als root ausgeführt wird und die UID mithilfe der Shell ändern möchte, sollte er runuser verwenden.

http://danwalsh.livejournal.com/55588.html

Ich habe diese Antwort in vielen Palästen veröffentlicht. Verzeihen Sie mir, wenn Sie das ärgerlich finden

Z-Y00
quelle
Bitte posten Sie keine Nur-Link-Antworten, um ein Verrotten des Links zu verhindern. Fügen Sie stattdessen die relevantesten Informationen aus dem Link zu Ihrer Antwort hinzu oder posten Sie den Link als Kommentar anstelle einer Antwort. Weitere Informationen finden Sie in diesem Hilfeartikel zu serverfault.com/help/how-to-answer .
Federico Galli
@ FedericoGalli die relevantesten Informationen sind bereits hinzugefügt, es besteht keine Notwendigkeit, die Verwendung zu kopieren und
einzufügen
-1

Verwenden Sie sudo -u, um den Benutzer anzugeben. Verwenden Sie das Flag -i auch, um Umgebungsvariablen des Zielbenutzers festzulegen.

sudo -i -u user command
Wayne Shelley
quelle
1
das gibtThis account is currently not available.
knocte
-3

Verwenden Sie den Befehl su mit den Befehlen -s und -c. Wie nachfolgend dargestellt

 su  exec -l -c '/bin/bash /etc/update_conf.sh' -s /bin/bash
Chetan
quelle
2
Das ist genau die Lösung aus der bestbewerteten Antwort.
Gerald Schneider