Esecuzione di script di shell interattiva in nome di un altro utente
Domanda
Nel mio script di shell (bash) Voglio chiamare altri script di shell.
eseguo il mio script come user_a.
Uno di questi script richieda un trattamento speciale:
- Deve essere eseguito come utente diverso (User_b). Password necessaria qui.
- E 'interattivo, ma non chiede solo domande, ma viene eseguito in un altro script nome di un altro utente (user_c) utilizzando su. Devo inserire una password qui pure.
posso usare su chiamare questo script, ma le sue questioni devono essere risolte in qualche modo. Io non posso entrare nulla perché stampe per ogni questons "stty:: Non una macchina da scrivere"
sto chiamando lo script speciale in questo modo
su user_B << ABC
...
special_script
...
ABC
Soluzione
#!/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
Si lavora per 1 utente, così ora aggiungere 'se ...' per il secondo utente
Altri suggerimenti
Un'altra opzione per l'esecuzione di script da altri utenti è il comando 'sudo', pensare ad esso come 'superuser fare:' per scopi di leggibilità. Il parametro -u fornisce informazioni nome utente. Quindi:
sudo -u user_B special_script
richiederà la password per user_b. Non ho mai avuto un problema con l'esecuzione di programmi interattivi che lo utilizzano. È possibile gestire chi può sudo per i quali tramite il comando visudo.
È possibile utilizzare sudo e creare un file sudoers che permette user_a per eseguire lo script come user_b.
una linea simile a:
user_A ALL = (user_B) NOPASSWD: /usr/share/stuff/ABC
permetterebbe user_a fare qualcosa di simile
sudo -u user_B /usr/share/stuff/ABC
senza richiedere una password
tentativi su
di ottenere una password dal terminale e ha bisogno di un dispositivo tty in modo che possa chiamare ioctl
per spegnere eco chiave. Dal momento che lo standard input proviene da un "here document" (ABC), un tentativo di chiamare l'ioctl sul descrittore di file 0 rendimenti "Non una tty".
Se è necessario utilizzare una qui documentare invece di un bona fide di script, fare:
cat > /tmp/myscript.$$ <<ABC
#!/bin/sh
...
ABC
chmod +x /tmp/myscript.$$
sudo -u user_B /tmp/myscript.$$
Si consiglia di utilizzare expect
. La sua progettata per l'interazione script.