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:

  1. Se ha de ejecutarse como un usuario diferente (Usuario_B). Contraseña necesaria aquí.
  2. 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
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top