erro gerado ao usar su -c: bash: nenhum controle de trabalho neste shell

erro gerado ao usar su -c: bash: nenhum controle de trabalho neste shell

Eu escrevi um script que deve executar determinados comandos como outro usuário e após o término da execução (sucesso ou falha) deve sair imediatamente.

Eu li que posso usar -cpara suexecutar comandos. Então, escrevi um script como:

#!/usr/bin/env bash

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

Ele executa o echocomando, mas permanece logado e user2não sai. Até tentei usar logoutem vez de exitmas ele permanece logado. Preciso executar o script as user1que invoca o sucomando e executa como user2e então o controle deve retornar user1após a conclusão.

ATUALIZAR

Tudo bem, consegui sair automaticamente, mas desta vez alguns comandos não estão sendo executados. Por exemplo:

Comando1:

su user2 -c 'echo 1'

Saída1:

1

E então ele sai sozinho.

Comando2:

su user2 -c 'bash some-script.sh'

Saída2:

bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell

Então, sempre que tento executar algum script via -cof su, ele exibe o erro mencionado acima. Eu tentei muitos comandos com -copções como ls, which, bash --version, mkdir, rm, whoamietc. Todos esses comandos produziram a saída correta. Mas qualquer comando que tente executar um script falha com o erro.

su user2 -c 'bash --version'      # Works
su user2 -c 'bash some-script.sh' # Doesn't work

Não consigo entender por que isso está acontecendo. E esse é o motivo pelo qual não consigo corrigir esse erro.

Responder1

O motivo desse comportamento está documentado na página de manual das versões recentes do su:

-c, --command COMANDO

Especifique um comando que será invocado pelo shell usando seu arquivo -c.

O comando executado iránão tem terminal de controle. Esta opção não pode ser usada para executar programas interativos que necessitam de um TTY de controle.

(ênfase minha)


Quando você executa comandos básicos como ls, echoou bash --version, eles simplesmente imprimem sua saída no stdoutstream sem precisar de um terminal de controle.

Suspeito que o caminho bashesteja sendo invocado (como um shell interativo) ou some-script.shcontenha comandos que exigem um dispositivo terminal de controle, portanto, a execução 'bash some-script.sh'gera o cannot set terminal process group (-1): Inappropriate ioctl for deviceerro.

Alguma explicação

Aterminal de controlepara um processo é o dispositivo terminal a partir do qual o processo foi iniciado. Um terminal de controle pode enviar sinais para grupos de processos e é o mecanismo pelo qual o controle de tarefas funciona em sistemas operacionais Unix; o controle de trabalho permite que processos no grupo de processos sejam executados em primeiro ou segundo plano.

A saída do pscomando mostra o terminal de controle para cada processo, por exemplo,

$ ps

  PID TTY          TIME CMD
 3614 pts/5    00:00:00 bash
31628 pts/5    00:00:00 ps

Mudança recente em su

No passado, su -ciniciava um terminal de controle quando não estava executando um shell interativo. A execução apt-get changelog loginno meu sistema Ubuntu mostra que a remoção do terminal de controle foi introduzida em maio de 2012 como medida de segurança:

  • su: Corrija um possível sequestro de tty descartando o terminal de controle ao executar um comando (CVE-2005-4890). Fecha: #628843

informação relacionada