erro lançado ao usar su -c: bash: nenhum controle de tarefa neste shell

2

Eu escrevi um script que deve executar certos comandos como outro usuário e após a conclusão da execução (sucesso ou falha) deve ser feito imediatamente.

Eu li que posso usar -c de su para executar comandos. Então, eu escrevi um script como:

#!/usr/bin/env bash

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

Ele executa o comando echo , mas permanece logado porque user2 não faz logout. Eu até tentei usar logout em vez de exit mas ele permanece logado. Eu preciso executar o script como user1 que invoca o comando su e executa como user2 e então o controle deve retornar para user1 após a conclusão.

UPDATE

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

Command1:

su user2 -c 'echo 1'

Output1:

1

E, então, ele faz o logout sozinho.

Command2:

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

Output2:

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

Portanto, sempre que tento executar algum script por meio de -c de su , ele exibe o erro mencionado acima. Eu tentei muitos comandos com a opção -c como ls , which , bash --version , mkdir , rm , whoami etc. 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 é por isso que não consigo corrigir esse erro.

    
por Abhimanyu Saharan 29.05.2016 / 23:46

1 resposta

3

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

-c, --command COMMAND

Specify a command that will be invoked by the shell using its -c.

The executed command will have no controlling terminal. This option cannot be used to execute interractive programs which need a controlling TTY.

(ênfase minha)

Quando você executa comandos básicos, como ls , echo ou bash --version , eles simplesmente imprimem sua saída para o fluxo stdout sem precisar de um terminal de controle.

Eu suspeito que o caminho bash esteja sendo chamado (como um shell interativo) ou some-script.sh contenha comandos que requerem um dispositivo terminal de controle, portanto, executar 'bash some-script.sh' gera o erro cannot set terminal process group (-1): Inappropriate ioctl for device .

Alguma explicação

Um controlador de terminal para 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 trabalho funciona em sistemas operacionais Unix; O controle de trabalho permite que os processos no grupo de processos sejam executados em primeiro plano ou em segundo plano.

A saída do comando ps mostra o terminal de controle de 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 no su

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

  • su: Fix possible tty hijacking by dropping the controlling terminal when executing a command (CVE-2005-4890). Closes: #628843
    
por 30.05.2016 / 23:30

Tags