Ejecución de script de shell interactiva en nombre de otro usuario
Pregunta
En mi script de shell (bash) Quiero llamar a otros scripts de shell.
dirigir mi script como user_a.
Una de estas secuencias de comandos necesita un tratamiento especial:
- Se ha de ejecutarse como un usuario diferente (Usuario_B). Contraseña necesaria aquí.
- Es interactivo, pero no sólo pide preguntas, pero se ejecuta en otro script nombre de otro usuario (usuario_c) usando Su. Tengo que introducir una contraseña aquí también.
Me puede usar su llamar a este guión, pero sus preguntas tienen que ser contestadas de alguna manera. No puedo entrar en nada porque se imprime para cada questons "stty:: No es una máquina de escribir"
Voy a llamar a la secuencia de comandos especiales de esta manera
su user_B << ABC
...
special_script
...
ABC
Solución
#!/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
Funciona para 1 usuario, por lo que ahora añadir 'si ...' para el segundo usuario
Otros consejos
Otra opción para ejecutar secuencias de comandos que otros usuarios es el comando 'sudo', piensa en él como 'superusuario hacer:' por motivos de legibilidad. El parámetro -u da información de nombre de usuario. Por lo tanto:
sudo -u user_B special_script
pedirá la contraseña para USER_B. Nunca he tenido un problema con el funcionamiento de los programas interactivos con él. Puede administrar quién puede sudo a los que a través del comando visudo.
Se puede usar sudo y crear un archivo sudoers que permite user_a para ejecutar el script como USER_B.
una línea como:
user_A ALL = (user_B) NOPASSWD: /usr/share/stuff/ABC
permitiría user_a a hacer algo como
sudo -u user_B /usr/share/stuff/ABC
sin pedir una contraseña
su
intentos para obtener una contraseña de la terminal y necesita un dispositivo TTY para que pueda llamar ioctl
para apagar el eco llave. Desde la entrada estándar viene de un "documento de aquí" (ABC), un intento de llamar la ioctl el descriptor de archivo 0 rendimientos "no es una tty".
Si tiene que usar una documentar aquí en lugar de un de buena fe guión, hacer:
cat > /tmp/myscript.$$ <<ABC
#!/bin/sh
...
ABC
chmod +x /tmp/myscript.$$
sudo -u user_B /tmp/myscript.$$
Es posible que desee utilizar expect
. Su diseñado para la interacción con guión.