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 -c
para su
executar comandos. Então, escrevi um script como:
#!/usr/bin/env bash
su - user2 -c "echo 'hurray' && exit"
Ele executa o echo
comando, mas permanece logado e user2
não sai. Até tentei usar logout
em vez de exit
mas ele permanece logado. Preciso executar o script as user1
que invoca o su
comando e executa como user2
e então o controle deve retornar user1
apó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 -c
of su
, ele exibe o erro mencionado acima. Eu tentei muitos comandos com -c
opções 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 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
, echo
ou bash --version
, eles simplesmente imprimem sua saída no stdout
stream sem precisar de um terminal de controle.
Suspeito que o caminho bash
esteja sendo invocado (como um shell interativo) ou some-script.sh
contenha 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 device
erro.
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 ps
comando 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 -c
iniciava um terminal de controle quando não estava executando um shell interativo. A execução apt-get changelog login
no 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