A resposta curta: adicione algumas citações extras ao redor do comando, assim:
ssh [email protected] "screen -dm bash -c 'cd path/to/my/script/; pwd > ~/output.txt'"
Para ver o que está acontecendo, você pode especificar a opção -v
para ssh
para obter algumas informações de depuração. Nesse caso, você verá uma linha como a seguinte para o comando original
debug1: Sending command: screen -dm bash -c cd path/to/my/script/; pwd > ~/output.txt
enquanto as citações extras mudam isso para
debug1: Sending command: screen -dm bash -c 'cd path/to/my/script/; pwd > ~/output.txt'
Portanto, parece que o ssh apenas pega os argumentos que foram passados para ele, concatena todos eles e deixa o lado remoto dividir a lista de argumentos concatenados novamente em argumentos individuais. Chamando a lista de argumentos argv
(como em C), você tem algo como o seguinte na versão original:
argv[0] = ssh
argv[1] = [email protected]
argv[2] = screen
argv[3] = -dm
argv[4] = bash
argv[5] = -c
argv[6] = cd path/to/my/script/; pwd > ~/output.txt
Agora, em princípio, teria sido possível para ssh
passar argv[2]
para argv[6]
como argumentos separados para o outro lado, caso em que provavelmente teria funcionado como esperado. Mas, como mostra a linha de depuração (e também parece que isso é baseado no código-fonte), esses argumentos são concatenados à string
screen -dm bash -c cd path/to/my/script/; pwd > ~/output.txt
que é então interpretado no final remoto. A partir disso, também fica claro por que ele não faz o que você gostaria: agora você está executando duas coisas em sequência, primeiro screen -dm bash -c cd path/to/my/script/
(então é iniciada uma screen
sessão na qual somente o diretório é alterado) a partir do diretório inicial e, em seguida, pwd > ~/output.txt
é executado, também a partir do diretório inicial.
Para completar, os argumentos para o comando com aspas duplas são
argv[0] = ssh
argv[1] = [email protected]
argv[2] = screen -dm bash -c 'cd path/to/my/script/; pwd > ~/output.txt'
fazendo com que screen -dm bash -c 'cd path/to/my/script/; pwd > ~/output.txt'
seja enviado para o outro lado (conforme mostrado pela linha de depuração), o que funciona como esperado.