Perto, mas não exatamente.
Independentemente de qualquer terminal
ssh root@remoteserver '/root/backup.sh </dev/null >/var/log/root-backup.log 2>&1 &'
Você precisa fechar todos os descritores de arquivo conectados ao soquete ssh, porque a sessão ssh não será fechada enquanto algum processo remoto tiver o soquete aberto. Se você não estiver interessado na saída do script (presumivelmente porque o próprio script cuida da gravação em um arquivo de log), redirecione-o para /dev/null
(mas observe que isso ocultará erros como não conseguir iniciar o script).
O uso nohup
não tem efeito útil aqui. nohup
organiza o programa que é executado para não receber um sinal HUP se o terminal de controle do programa desaparecer, mas aqui não há terminal em primeiro lugar, então nada enviará um SIGHUP para o processo do nada. Além disso, nohup
redireciona a saída padrão e o erro padrão (mas não a entrada padrão) para um arquivo, mas apenas se eles estiverem conectados a um terminal, o que, novamente, não estão.
Desconectando de um terminal
aaron@localpc$ ssh root@remoteserver
root@remoteserver# nohup /root/backup.sh </dev/null &
nohup: appending output to `nohup.out'
[1] 12345
root@remoteserver# exit
aaron@localpc$
Use nohup
para desanexar o script de seu terminal de controle para que ele não receba um SIGHUP quando o terminal desaparecer. nohup
também redireciona a saída padrão do script e o erro padrão para um arquivo chamado nohup.out
se estiver conectado ao terminal; você mesmo deve cuidar da entrada padrão.
Mantendo um terminal remoto
Se você deseja manter o comando em execução em um terminal remoto, mas não o anexa à sessão SSH, execute-o em um multiplexador de terminal, como Screen ou Tmux .
ssh root@remoteserver 'screen -S backup -d -m /root/backup.sh'
Posteriormente, você pode reconectar-se ao terminal em que o script está executando, invocando screen -S backup -rd
como root nessa máquina.
Automatizando um Comando Remoto
Para uma segurança um pouco melhor, não abra logins remotos remotos diretos demais. Crie um par de chaves para fins especiais e dê a ele um comando forçado /root/.ssh/authorized_keys
. O conteúdo do arquivo de chave pública é AAAA…== wibble@example.com
; adicione uma lista de opções separadas por vírgula, incluindo as command="…"
que especificam que a chave pode ser usada apenas para executar este comando específico. Certifique-se de manter as opções e a chave em uma linha.
command="/root/backup.sh </dev/null >/dev/null 2>/dev/null &",no-port-forwarding,no-agent-forwarding,no-x11-forwarding,no-pty,no-user-rc AAAA…== wibble@example.com