SSH no servidor, iniciar sessão de tela, alterar o diretório?

1

Eu quero o SSH em um servidor, inicie uma sessão de tela, cd em path/to/my/script/ e execute test.sh lá.

Como entrada, eu tentei

ssh [email protected] screen -dm bash -c 'cd  path/to/my/script/; pwd > ~/output.txt'

e espera-se ver path/to/my/script/ em output.txt , mas vejo meu diretório pessoal lá. Isso significa que o comando cd realmente não funciona, então o bash não poderá executar test.sh .

Como posso resolver isso?

    
por Sibbs Gambling 02.01.2017 / 08:43

2 respostas

2

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.

    
por 02.01.2017 / 13:49
2

O comentário do @brm é a resposta certa. Basta adicionar as aspas duplas extras e isso funcionará:

ssh [email protected] "screen -dm bash -c 'cd path/to/my/script/; pwd > ~/output.txt'"
    
por 02.01.2017 / 12:26

Tags