O ssh não permite que você especifique um comando com precisão, como você fez, como uma série de argumentos a serem passados para o execvp no host remoto. Em vez disso, ele concatena todos os argumentos em uma string e os executa por meio de um shell remoto. Isso se destaca como uma grande falha de design em ssh na minha opinião ... é uma ferramenta unix bem comportada na maioria das formas, mas quando chega a hora de especificar um comando ele escolheu usar uma única string monolítica em vez de uma argv, como foi projetado para MSDOS ou algo assim!
Como o ssh passará seu comando como uma única string para sh -c
, você não precisa fornecer seu próprio sh -c
. Quando você faz, o resultado é
sh -c '/bin/sh -c cd /boot && ls -l'
com a citação original perdida. Então os comandos separados por &&
são:
'/bin/sh -c cd /boot'
'ls -l'
O primeiro deles executa um shell com o texto de comando "cd" e $0
= "boot"
. O comando "cd" é concluído com sucesso, o $0
é irrelevante e o /bin/sh -c
indica sucesso, então o ls -l
acontece.