Em
ssh [email protected] "sudo /etc/init.d/smokeping reload"
Seu escudo
(1) (ou, no seu exemplo, o shell iniciado pelo exec()
do PHP) irá analisar essa linha de comando e, se for encontrado, executar um ssh
(2) Comando que contatará um sshd
(3) Servidor no xxx.xxx.xxx.xx
que, após autenticação bem-sucedida, chamará shell
(4) Que interpretará essa linha de comando sudo
e executará o sudo
(5) Comando que depois de verificar as permissões será executado /etc/init.d/smokeping
(6) Que provavelmente é um script de shell que executa vários comandos.
Várias coisas podem falhar lá. Se todas as etapas de 1 a 5 forem bem-sucedidas, o status de saída de /etc/init.d/smokeping
será relatado para o seu shell porque sudo
reporta o status de saída do comando executado e o shell remoto sai com o status de saída do último comando executado e ssh
informa o status de saída do shell remoto.
Agora, os comandos retornam um status de saída diferente de zero, por convenção, para informar ao chamador que eles não conseguiram fazer o que foi solicitado a fazer.
No seu caso, /etc/init.d/smokeping
decidiu que qualquer erro que ocorreu não foi suficiente para garantir um status de saída diferente de zero, ou que o script não está escrito corretamente e não retorna com um status de saída diferente de zero após uma falha (ou algum caso patológico envolvendo mau comportamento ou configuração incorreta de ssh
, sudo
ou o shell remoto).
Os scripts
/etc/init.d
geralmente são escritos com set -e
. Com esse sinalizador ativado, o shell interpretando o script por padrão sairá quando um comando executado falhar (com o status de saída diferente de zero do comando com falha), o que me faz pensar que podemos estar na primeira situação: "smokeping" decide informar que foi recarregado com sucesso.
Um exemplo de um caso patológico poderia ser, por exemplo: bash
usado como o shell remoto ( bash
lê o ~/.bashrc
quando invocado sobre ssh
mesmo que não sejam shells interativos), e o ~/.bashrc
tem algo como:
trap 'whatever...; exit 0' EXIT
O que faria com que o status de saída de shells interativos ou shells iniciados acima de ssh
ou rsh
sempre fosse 0
.