Wie kann ich einen Teil eines Skripts als anderer Benutzer ausführen?

Wie kann ich einen Teil eines Skripts als anderer Benutzer ausführen?
#!/bin/ksh
(some code)
Log=~/my.log
chown USER1 filename

su - USER1 -c "
date | tee -a ${Log} 2>&1; 
cd /blah/blah
if [ SOMECONDITION ]
then
sh ./somescript.ksh > logfile
fi
exit" | tee -a ${Log} 2>&1;

Das Skript neigt dazu, anzuhalten, wenn es zu USER1 wechselt, und wird dann erneut ausgeführt, wenn wir es manuell beenden müssen.

Antwort1

Ich würde erwarten, dass das Skript beim Befehl „su“ anhält, weil es zur Eingabe eines Kennworts auffordert, aber keins erhält.

Wie so oft gibt es dafür mehrere Lösungen :)

Anstelle von „su“ verwenden Sie „sudo“, das über den Schalter -S verfügt, um ein Kennwort von der Standardeingabe zu akzeptieren:

echo "password" | sudo -S -u USER1 sh -c "...

Alternativ können Sie den Abschnitt Ihrer Anwendung/Ihres Skripts, der als anderer Benutzer ausgeführt werden muss, in eine Hilfsanwendung verschieben. Sie können dann das Skripting mit einem gespeicherten Klartextkennwort (das einige Sicherheitsbedenken mit sich bringt) vermeiden, indem Sie die set-uid und set-gid in dieser Hilfsanwendung verwenden:

chown USER1.GRP1 helperapp
chmod 6755 helperapp

Das Risiko dabei ist, dass nun jeder im System Helperapp als USER1 ausführen kann. Anstatt set-uid/gid zu verwenden, können Sie configure sudo verwenden, um einem bestimmten Benutzer zu erlauben, Helperapp als USER1 auszuführen, ohne dass eine Kennwortabfrage erfolgt (dafür sind Administrator-/Root-Berechtigungen erforderlich):

# /etc/sudoers
# Allow USER2 to run helperapp as USER1 without prompting for a password
USER2 ALL=(USER1) NOPASSWD:/path/to/helperapp

Ihr Code kann dann ungefähr so ​​aussehen:

#!/bin/ksh
(some code)
Log=~/my.log
chown USER1 filename

sudo -u USER1  /path/to/helperapp |  tee -a ${Log} 2>&1;

Nichts davon wurde getestet und die Verwendung erfolgt auf eigene Gefahr ...

Antwort2

Da Sie ausführen su -, weisen Sie an, sueine Login-Shell auszuführen. Eine Login-Shell ignoriert ihr -cArgument und liest stattdessen Befehle interaktiv. Die Lösung besteht darin, nicht zu übergeben -.

Wenn Sie die Startdatei des Zielbenutzers lesen möchten, tun Sie dies explizit.

su - USER1 <<EOF
date
if [ -e ~/.profile ]; then . ~/.profile; fi
EOF 2>&1 | tee -a -- "$LOG"

verwandte Informationen