it-swarm.com.de

Wie schreibe ich ein Shell-Skript, das einige Befehle als Superuser und einige Befehle nicht als Superuser ausführt, ohne es zu babysitten?

Ich möchte ein Shell-Skript schreiben, um eine Reihe von Befehlen zu automatisieren. Das Problem ist, dass einige Befehle als Superuser ausgeführt werden MÜSSEN und einige Befehle NICHT als Superuser ausgeführt werden dürfen. Was ich bisher gemacht habe, ist ungefähr so:

#!/bin/bash

command1
Sudo command2
command3
Sudo command4

Das Problem ist, dass jemand warten muss, bis befehl1 beendet ist, bevor er zur Eingabe eines Kennworts aufgefordert wird. Wenn befehl3 lange genug dauert, muss er warten, bis befehl3 beendet ist. Es wäre schön, wenn die Person aufstehen und weggehen und dann eine Stunde später zurückkommen und fertig sein könnte. Das folgende Skript weist beispielsweise dieses Problem auf:

#!/bin/bash

sleep 310
Sudo echo "Hi, I'm root"
sleep 310
Sudo echo "I'm still root?"

Wie kann ich dafür sorgen, dass der Benutzer sein Passwort nur einmal ganz am Anfang eingeben und dann gehen kann?

pdate:

Danke für die Antworten. Ich arbeite unter Mac OS X Lion und habe Stephen Ps Skript ausgeführt. Die Ergebnisse waren unterschiedlich: (Ich habe auch $ HOME hinzugefügt.)

[email protected] scratch$ ./test2.sh
uid is 501
user is pair
username is 
home directory is /Users/pair
[email protected] scratch$ Sudo ./test2.sh 
Password:
uid is 0
user is root
username is root
home directory is /Users/pair
56
speedarius

Datei sutest

#!/bin/bash
echo "uid is ${UID}"
echo "user is ${USER}"
echo "username is ${USERNAME}"

führe es aus: `./sutest 'gibt mir

uid is 500
user is stephenp
username is stephenp

aber mit Sudo: Sudo ./sutest gibt

uid is 0
user is root
username is stephenp

Sie behalten also den ursprünglichen Benutzernamen in $ USERNAME bei, wenn Sie als Sudo ausgeführt werden. Dies führt zu einer ähnlichen Lösung wie bei anderen:

#!/bin/bash
Sudo -u ${USERNAME} normal_command_1
root_command_1
root_command_2
Sudo -u ${USERNAME} normal_command_2
# etc.

Wenn Sie Sudo als Erstes zum Aufrufen Ihres Skripts verwenden, werden Sie einmal zur Eingabe des Kennworts aufgefordert.


Ich habe diese Antwort ursprünglich unter Linux geschrieben, das einige Unterschiede zu OS X aufweist

OS X (ich teste dies auf Mountain Lion 10.8.3) hat eine Umgebungsvariable Sudo_USERwenn Sie Sudo ausführen, das anstelle von USERNAME verwendet werden kann, oder um plattformübergreifender zu sein, kann das Skript überprüfen, ob Sudo_USER gesetzt ist und verwendet wird Verwenden Sie in diesem Fall USERNAME.

Wenn Sie das ursprüngliche Skript für OS X ändern, wird es ...

#!/bin/bash
Sudo -u ${Sudo_USER} normal_command_1
root_command_1
root_command_2
Sudo -u ${Sudo_USER} normal_command_2
# etc.

Ein erster Versuch, es plattformübergreifend zu machen, könnte sein ...

#!/bin/bash
#
# set "THE_USER" to Sudo_USER if that's set,
#  else set it to USERNAME if THAT is set,
#   else set it to the string "unknown"
# should probably then test to see if it's "unknown"
#
THE_USER=${Sudo_USER:-${USERNAME:-unknown}}

Sudo -u ${THE_USER} normal_command_1
root_command_1
root_command_2
Sudo -u ${THE_USER} normal_command_2
# etc.
50
Stephen P

Sie sollten Ihr gesamtes Skript als Superuser ausführen. Wenn Sie einen Befehl als Nicht-Superuser ausführen möchten, verwenden Sie die Option "-u" von Sudo:

#!/bin/bash

Sudo -u username command1
command2
Sudo -u username command3
command4

Bei der Ausführung als root fragt Sudo nicht nach einem Passwort.

9
Pavel Strakhov

Wenn Sie dies verwenden, aktivieren Sie man Sudo auch:

#!/bin/bash

Sudo echo "Hi, I'm root"

Sudo -u nobody echo "I'm nobody"

Sudo -u 1000 touch /test_user
3
Sampo Sarrala

Nun, Sie haben einige Möglichkeiten.

Sie können Sudo so konfigurieren, dass kein Kennwort abgefragt wird. Dies wird aus Sicherheitsgründen nicht empfohlen.

Sie könnten ein Expect-Skript schreiben, um das Kennwort zu lesen und es bei Bedarf an Sudo weiterzuleiten, aber das ist klobig und zerbrechlich.

Ich würde empfehlen, das Skript so zu gestalten, dass es als Root ausgeführt wird und seine Berechtigungen fallengelassen werden, wenn sie nicht benötigt werden. Einfach haben es Sudo -u someotheruser command für die Befehle, für die kein root erforderlich ist.

(Wenn sie speziell als Benutzer ausgeführt werden müssen, der das Skript aufruft, kann das Skript die UID speichern und über Sudo ein zweites Skript mit der ID als Argument aufrufen, damit es weiß, an wen es sich richtet.)

3
Mark Reed