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"'