A única solução confiável que encontrei foi o método de força bruta descrito na pergunta. Para se conectar a uma tela existente com o nome $exefile
no controle remoto $host
via ssh, ou para criar uma nova se ela não existir, pode-se usar (em um bash shell):
ssh -t $host "
echo \"done.\" &&
echo \"itentifying screen ...\" &&
myscreen=\'screen -list | sed -n \"s/^\s*\s\([0-9]*\.$exefile\)\s\s*.*$/\1/p\"\' &&
if [ "X\$myscreen" = "X" ]; then
echo \"no existing screen session found, creating new\";
screen -S \"$exefile\";
else
echo \"connecting to screen \$myscreen\";
screen -d -r \"\$myscreen\";
fi &&
echo \"finished.\";
exit";
A primeira execução criará uma nova sessão em $host
. Se a tela estiver desanexada com Ctrl+a,d
, o shell de login ssh será fechado. Se o mesmo comando for emitido novamente, ele será reconectado à tela existente. Várias sessões de tela com nomes diferentes $exefile
são possíveis e podem ser reconectadas independentemente. A mágica é feita por sed
, que procura a saída de screen -list
para um nome que corresponda ao padrão [tty].name
. Observe que o nome da tela pode precisar ser escapado se contiver% caracteres especiais emsed
.