Existe sempre um shell remoto. No protocolo SSH, o cliente envia ao servidor uma string para executar. O cliente de linha de comando SSH obtém seus argumentos de linha de comando e concatena-os com um espaço entre os argumentos. O servidor pega essa string, executa o shell de login do usuário e passa para ela aquela string.
É impossível contornar o shell remoto. O protocolo não tem nada como enviar uma matriz de cadeias de caracteres que pode ser analisada como uma matriz argv no servidor. E o servidor SSH não ignorará o shell remoto porque pode ser uma restrição de segurança: usar um programa restrito como o shell do usuário é uma forma de fornecer uma conta restrita que só pode executar determinados comandos (por exemplo, uma conta somente rsync ou uma conta somente de git).
Você pode não ver o shell em pstree
, porque ele já pode ter desaparecido. Muitos shells têm uma otimização onde se eles detectarem que estão prestes a executar “execute este comando externo, espere que ele seja concluído e saia com o status do comando”, então o shell executa “ execve
deste comando externo". Isto é o que está acontecendo no seu primeiro exemplo. Contraste os seguintes três comandos:
ssh otherhost pstree -a -p
ssh otherhost 'pstree -a -p'
ssh otherhost 'pstree -a -p; true'
Os dois primeiros são idênticos: o cliente envia exatamente os mesmos dados para o servidor. O terceiro envia um comando shell que anula a otimização exec do shell.