Se produce un error al usar su -c: bash: no hay control de trabajo en este Shell

Se produce un error al usar su -c: bash: no hay control de trabajo en este Shell

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 -cpara suejecutar comandos. Entonces, escribí un guión como:

#!/usr/bin/env bash

su - user2 -c "echo 'hurray' && exit"

Ejecuta el echocomando pero permanece conectado porque user2no cierra la sesión. Incluso intenté usarlo logouten lugar de exitpero permanece conectado. Necesito ejecutar un script que user1invoque el sucomando y se ejecute como user2y luego el control debería regresar user1despué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 -cde su, muestra el error mencionado anteriormente. Probé muchos comandos con -copciones como ls, which, bash --version, mkdir, rmetc. whoamiTodos 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, echoo bash --version, simplemente imprimen su salida en la stdoutsecuencia sin necesidad de una terminal de control.

Sospecho que bashse está invocando la forma (como un shell interactivo) o some-script.shcontiene 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 deviceerror.

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 pscomando 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 -ciniciaba una terminal de control cuando no se ejecutaba un shell interactivo. La ejecución apt-get changelog loginen 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

información relacionada