Se não houver uma sessão existente para se conectar, a tela usará o comando que você fornecer após o sinalizador -R
. Então, isso deve fazer o que você quiser (sem ter que tocar em .screenrc):
$ ssh [...]@127.0.0.1 screen -R bash -l
(Esta é certamente a maneira mais simples de fazer o que você originalmente pretendia fazer.)
Mas desde que você perguntou, eu também mencionarei porque sua abordagem bash -l
não funcionou. Foi tão perto!
bash -c
leva apenas o próximo argumento como um comando. Argumentos depois disso vão para $0
, $1
, etc.
$ bash -c echo bar
[just a blank line]
$ bash -c 'echo foo'
foo
$ bash -c 'echo $1' foo bar baz
bar
Isso faz o que você queria que bash -l -c screen -R
fizesse:
$ ssh [...]@127.0.0.1 bash -l -c "'screen -R'"
Sim, excitantemente você precisa de dois níveis de cotação para que isso funcione: as aspas externas dizem ao seu shell local para preservar as aspas internas, e as aspas internas são necessárias porque o ssh envia o comando resultante, bash -l -c 'screen -R'
, como um string com quatro espaços, não como uma lista de quatro palavras. Com um nível de aspas, o shell remoto ainda veria bash -l -c screen -R
.
Isso também seria feito, com o shell remoto recebendo a string de comando bash -l -c screen\ -R
:
$ ssh [...]@127.0.0.1 bash -l -c 'screen\ -R'
Ou isso, para fornecer o shell remoto bash -l -c "screen -R"
:
$ ssh [...]@127.0.0.1 bash -l -c \"screen -R\"