Ausführen von interaktiven Shell-Skript in Namen anderer Benutzer
Frage
In meinem Shell-Skript (bash) Ich möchte andere Shell-Skripten nennen.
Ich betreibe mein Skript als user_a.
Eines dieser Skripte benötigt eine spezielle Behandlung:
- Es muss als verschiedene Benutzer ausgeführt werden (Benutzer_b). Kennwort benötigt hier.
- Es ist interaktiv, aber nicht nur fragt Fragen, sondern läuft ein anderes Skript in Namen eines anderen Benutzers (Benutzer_c) unter Verwendung von su. Ich muss ein Passwort eingeben hier als auch.
kann ich su dieses Skript aufrufen, aber seine Fragen irgendwie beantwortet werden. Ich kann nichts geben, weil es für jeden questons „stty:: Nicht eine Schreibmaschine“ druckt
Ich bin die spezielle Skript Aufruf diese Art und Weise
su user_B << ABC
...
special_script
...
ABC
Lösung
#!/bin/bash
main_for_root(){
:
}
# ------------------------------------------------------------------------------
abs_path="$(readlink -f `dirname $0`)/$(basename $0)"
# if [ `id -u` != 0 ] ; then
if [ `whoami` != 'root' ] ; then
echo "[su -] run as root"
su -c"/bin/bash $abs_path $@"
exit 0
else
main_for_root $@
fi
Es funktioniert für 1 Benutzer, so jetzt hinzufügen 'wenn ...' für die zweiten Benutzer
Andere Tipps
Eine weitere Option für Skripte als anderer Benutzer ist der ‚sudo‘ Befehl ausgeführt wird, betrachten Sie es als ‚Super-User tun:‘ aus Gründen der Lesbarkeit. Der Parameter -u gibt Benutzerinformationen. Also:
sudo -u user_B special_script
Wird das Passwort für Benutzer_b aufzufordern. Ich hatte noch nie ein Problem mit interaktiven Programmen läuft es zu benutzen. Sie können verwalten, wer mit wem über den visudo sudo können.
Sie können sudo verwenden und eine sudoers-Datei erstellen, die user_a das Skript als Benutzer_b ausgeführt werden kann.
eine Zeile wie:
user_A ALL = (user_B) NOPASSWD: /usr/share/stuff/ABC
würde user_a erlauben so etwas wie
zu tunsudo -u user_B /usr/share/stuff/ABC
ohne nach einem Passwort gefragt
su
versucht, ein Passwort aus dem Terminal zu erhalten und braucht eine tty-Gerät, so dass es ioctl
auszuschalten Taste Echo aufrufen können. Da die Standardeingabe von einem „hier Dokument“ (ABC) kommt, ein Versuch, die ioctl auf Dateideskriptor 0 yields „ein tty nicht“ zu nennen.
Wenn Sie ein hier dokumentieren anstelle eines bona fide Skript verwenden müssen, tun:
cat > /tmp/myscript.$$ <<ABC
#!/bin/sh
...
ABC
chmod +x /tmp/myscript.$$
sudo -u user_B /tmp/myscript.$$
Sie können wollen expect
verwenden. Sein für eine Skript-Interaktion entwickelt.