Inconsistente comportamento de redirecionamento ssh interativa vs comandos

4

Esses trabalhos

ssh remote 'echo hi > hi.txt'
echo hi | ssh remote 'cat > hi.txt'

mas isso não funciona

ssh remote sh -c 'echo hi > hi.txt'

Eu esperava produzir um arquivo no remoto chamado hi.txt contendo "oi". Em vez disso eu recebo um arquivo vazio chamado hi.txt.

A seguir, o comportamento esperado se executado a partir de uma sessão ssh interativa.

sh -c 'echo hi > hi.txt'

O que eu não compreendo sobre ssh e redirecionamento?

    
por Praxeolitic 14.08.2014 / 04:27

2 respostas

3

Eu acho que o seu escudo local está tirando suas cotações. Você poderia tentar

ssh remote sh -c '"echo hi > hi.txt"'

Quando você envia comandos remotos com o ssh, há dois shells envolvidos na leitura de cada linha enviada. Seu shell local e seu shell remoto.

Uma boa explicação para isso pode ser encontrada em Cotação em Shell Unix / Linux para shells remotas

    
por 14.08.2014 / 04:49
2

Esta é provavelmente a coisa mais confusa e irritante quando se trabalha com o ssh (pelo menos na minha opinião).

A razão para este comportamento é que o ssh não preserva argumentos ao executar um comando remoto. Leva todos os seus argumentos e concatena-os juntos separados por espaços.

Então, quando você corre

ssh remote sh -c 'echo hi > hi.txt'

Com efeito, o que você está executando é:

ssh remote 'sh -c echo hi > hi.txt'

Isso executa sh -c echo , passa o shell ( não echo ) um argumento de hi (que não é usado) e redireciona a saída para hi.txt .

A solução oferecida pelo quântico (nested quoting) é uma maneira de abordar isso. Vamos ver:

ssh remote sh -c '"echo hi > hi.txt"'

O que está acontecendo aqui é que o ssh está concatenando todos os argumentos, então você efetivamente termina com:

ssh remote 'sh -c "echo hi > hi.txt"'
    
por 14.08.2014 / 05:18