wake-up-neo.net

Wechsel zum Root-Benutzer im Shell-Skript

Ich habe ein Shell-Skript, das ein Nicht-Root-Benutzerkonto benötigt, um bestimmte Befehle auszuführen und dann den Benutzer in Root zu ändern, um den Rest des Skripts auszuführen. Ich verwende SUSE11 . Ich habe erwartet, die Kennwortabfrage zu automatisieren. Wenn ich jedoch Spawn su - Verwende und der Befehl ausgeführt wird, wird die Eingabeaufforderung mit root zurückgegeben und der Rest des Skripts wird nicht ausgeführt.

Z.B.

< non-root commands>
 spawn su -
<root commands>

Nach su - kehrt die Eingabeaufforderung mit Benutzer als root ..__ zurück. Wie wird der Rest des Skripts ausgeführt?.

Die Sudo-Option hilft nicht, da sie den Sudo-Befehl ifconfig nicht ausführt, den ich benötige, um die IP-Adresse der Maschine zu finden.

Ich habe diese Links bereits durchlaufen, konnte aber keine Lösung finden: Skriptverzeichnis in Homedir des Benutzers in einem Shell-Skript ändern

Unix-Benutzer in einem Shell-Skript ändern

14
Deepti Jain

Sudo wird hier funktionieren, aber Sie müssen Ihr Skript ein wenig ändern:

$ cat 1.sh 
id 
Sudo -s <<EOF
echo Now i am root
id
echo "yes!"
EOF

$ bash 1.sh
uid=1000(igor) gid=1000(igor) groups=1000(igor),29(audio),44(video),124(Fuse)
Now i am root
uid=0(root) gid=0(root) groups=0(root)
yes!

Sie müssen Ihren Befehl im <<EOF-Block ausführen und den Block an Sudo übergeben.

Wenn Sie möchten, können Sie natürlich su verwenden. Sie müssen es jedoch mit expect/pexpect ausführen, um das Passwort für Sie einzugeben.

Aber selbst wenn Sie es schaffen könnten, das Passwort automatisch einzugeben (oder es auszuschalten), würde diese Konstruktion nicht funktionieren:

user-command
su 
root-command

In diesem Fall wird root-command mit Benutzer ausgeführt, nicht mit Root-Rechten, da er ausgeführt wird, nachdem su beendet ist (su öffnet eine neue Shell, ändert jedoch keine UID der aktuellen Shell). Sie können den gleichen Trick natürlich hier verwenden:

su -c 'sh -s' <<EOF
# list of root commands
EOF

Aber jetzt haben Sie dasselbe wie mit Sudo.

18
Igor Chubin

Es gibt eine einfache Möglichkeit, dies ohne ein zweites Skript zu tun. Setzen Sie dies einfach an den Anfang Ihrer Datei:

if [ "$(whoami)" != "root" ]
then
    Sudo su -s "$0"
    exit
fi

Dann wird es automatisch als root ausgeführt. Dies setzt natürlich voraus, dass Sie Sudo su ohne ein Kennwort eingeben können. Dies ist jedoch nicht in dieser Antwort enthalten. Weitere Informationen zur Verwendung von Sudo in Shell-Skripts finden Sie in der Anleitung.

9
Benubird

Der einfachste Weg wäre, mindestens zwei Skripte zu erstellen.

Der erste sollte den zweiten mit Root-Berechtigungen aufrufen. Jeder Befehl, den Sie im zweiten Skript ausführen, wird also als root ausgeführt.

Zum Beispiel:

runasroot.sh

Sudo su-c'./scriptname.sh'

scriptname.sh

apt-get install mysql-server-5.5

oder was auch immer du brauchst.

1
Josh

Kurzversion: Erstellen Sie einen Block, der alle Befehle einschließt, die als root ausgeführt werden sollen.

Zum Beispiel habe ich ein Skript erstellt, um einen Befehl von einem Root-Unterverzeichnis aus auszuführen.

Sudo su - <<EOF
cd rootSubFolder/subfolder
./commandtoRun
EOF
0
Juan T