Veja os subsistemas ssh. Eu faço algo semelhante, mas não com um script (ou seja, eu uso programas compilados a.out / elf.) Mas eu apenas testei com um script bash e funciona.
Da página de manual do ssh:
-s May be used to request invocation of a subsystem on the remote
system. Subsystems are a feature of the SSH2 protocol which
facilitate the use of SSH as a secure transport for other appli-
cations (eg. sftp(1)). The subsystem is specified as the remote
command.
Use -s (minúsculas) no cliente para especificar o subsistema
Adicione outra entrada do subsistema ao sshd_config no servidor que aponta para o seu script.
# override default of no subsystems
Subsystem logger /usr/local/libexec/my-logger.sh
Subsystem sftp /usr/libexec/sftp-server
Seu script deve ser iniciado como qualquer outro arquivo com permissões de execução. Meu exemplo:
#! /usr/local/bin/bash
logger "testing 1.2.3"
echo "return text from my-logger"
exec 0>&- # close stdin
exec 0<&-
exec 1>&- # close stdout
exec 1<&-
exec 2>&- # close stderr
exec 2<&-
logger "subsystem: nohup new script"
nohup /path/to/another/script/logger2.sh &
logger "subsystem: the subsystem started script is now done"
exit 0
Você deve poder retornar um texto de erro útil para sucesso ou falha. A conexão ssh (e, portanto, stdin, stdout e stderr) é até o subsistema terminar. O subsistema pode continuar sendo executado ou não.
Faça com que seu outro script (logger2.sh acima) durma por 5-10 minutos para que você possa usar o netstat para ver a conexão ssh desaparecer, o cliente ssh voltar para o shell e, por exemplo, ps ax mostra que o script ainda está sendo executado em segundo plano. Este script também pode precisar fechar o fd etc. É apenas um exemplo rápido. Boa sorte.