He escrito un script que debería ejecutar ciertos comandos como otro usuario y, una vez finalizada la ejecución (éxito o fracaso), debería cerrar sesión inmediatamente.
He leído que puedo usar -c
para su
ejecutar comandos. Entonces, escribí un guión como:
#!/usr/bin/env bash
su - user2 -c "echo 'hurray' && exit"
Ejecuta el echo
comando pero permanece conectado porque user2
no cierra la sesión. Incluso intenté usarlo logout
en lugar de exit
pero permanece conectado. Necesito ejecutar un script que user1
invoque el su
comando y se ejecute como user2
y luego el control debería regresar user1
después de completarse.
ACTUALIZAR
Muy bien, pude cerrar sesión automáticamente pero esta vez algunos comandos no se ejecutan. Por ejemplo:
Comando1:
su user2 -c 'echo 1'
Salida1:
1
Y luego cierra la sesión por sí solo.
Comando2:
su user2 -c 'bash some-script.sh'
Salida2:
bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell
Entonces, cada vez que intento ejecutar algún script a través -c
de su
, muestra el error mencionado anteriormente. Probé muchos comandos con -c
opciones como ls
, which
, bash --version
, mkdir
, rm
etc. whoami
Todos estos comandos produjeron el resultado correcto. Pero cualquier comando que intente ejecutar un script falla con el error.
su user2 -c 'bash --version' # Works
su user2 -c 'bash some-script.sh' # Doesn't work
No puedo entender por qué sucede esto. Y esa es la razón por la que no puedo corregir este error.
Respuesta1
El motivo de este comportamiento está documentado en la página del manual de las versiones recientes de su
:
-c, --comando COMANDO
Especifique un comando que será invocado por el shell utilizando su archivo
-c
.El comando ejecutadono tener terminal de control. Esta opción no se puede utilizar para ejecutar programas interactivos que necesitan un TTY de control.
(el énfasis es mío)
Cuando ejecuta comandos básicos como ls
, echo
o bash --version
, simplemente imprimen su salida en la stdout
secuencia sin necesidad de una terminal de control.
Sospecho que bash
se está invocando la forma (como un shell interactivo) o some-script.sh
contiene comandos que requieren un dispositivo terminal de control, por lo que ejecutar 'bash some-script.sh'
arroja el cannot set terminal process group (-1): Inappropriate ioctl for device
error.
Alguna explicación
Aterminal de controlpara un proceso es el dispositivo terminal desde el cual se inició el proceso. Una terminal de control puede enviar señales a grupos de procesos y es el mecanismo mediante el cual funciona el control de trabajos en los sistemas operativos Unix; El control de trabajos permite que los procesos del grupo de procesos se ejecuten en primer plano o en segundo plano.
La salida del ps
comando muestra el terminal de control para cada proceso, por ejemplo,
$ ps
PID TTY TIME CMD
3614 pts/5 00:00:00 bash
31628 pts/5 00:00:00 ps
Cambio reciente en su
En el pasado, su -c
iniciaba una terminal de control cuando no se ejecutaba un shell interactivo. La ejecución apt-get changelog login
en mi sistema Ubuntu muestra que la eliminación del terminal de control se introdujo en mayo de 2012 como medida de seguridad:
- su: corrige el posible secuestro de tty soltando el terminal de control al ejecutar un comando (CVE-2005-4890). Cierra: #628843