Comando SSH + DIR na máquina Windows remota

Comando SSH + DIR na máquina Windows remota

Instalei o OpenSSH no Windows Server 2008 r2 e exportei minha chave pública para lá. Consigo conectar normalmente sem digitar senha, posso até executar o comando DIR já no comando que utilizo para conectar:

ssh user@ip-address "dir c:\testfolder"

No entanto, executando o comando DIR em um diretório com espaços no nome:

ssh user@ip-address "dir c:\test folder"

Não funciona.

Alguém saberia a maneira correta de executar o comando dir em uma pasta com espaços no nome? Desde já, obrigado.

Responder1

um amigo que é programador me ensinou como resolver isso. Como preciso que o caminho seja impresso no shell do Windows com aspas duplas assim:

"c:\teste folder"

E as aspas duplas já servem para enviar o comando para o Windows via SSH, para enviar as aspas duplas para o shell do windows você precisa usar a barra invertida com aspas duplas \", o comando ficaria assim:

ssh user@ip-address "dir \"c:\teste folder\""

Fica como uma ajuda para quem tiver as mesmas dúvidas no futuro.

Material de referência

Responder2

Primeiro, certifique-se sempre de verificar as cotações, as regras em vigor para o shell (o comando é executado localmente no bash, mas o lado remoto pode usar outra coisa, como cmd.exe no Windows) em relação às cotações e quando escapar das aspas você precisa repassar explicitamente. Além disso, o par externo é frequentemente removido/removido durante a análise.

Com o comando ssh user@ip-address "dir c:\\testfolder", bash vê três partes do comando:

ssh
user@ip-address
dir c:\test folder

Observe especificamente que o bash NÃO inclui as aspas em torno do último item! Isso ocorre porque, neste estágio, o bash está assumindo que você está usando aspas para dizer ao próprio bash para interpretar o texto citado como uma parte (armazenado em uma string no espaço de memória do bash).

Quando o bash transfere o comando para o ssh, o ssh vê as duas últimas partes: user@ip-addresse dir c:\test folder. shh usa a primeira parte para determinar onde se conectar e, uma vez conectado, passa a segunda parte exatamente como está para o final remoto - lembre-se, no entanto, as aspas já foram removidas.

Na extremidade remota, sshd (o daemon/serviço ssh), recebe isso e passa para cmd.exe (já que este é o lado do Windows), como... Não duas, mas três partes:

dir
c:\test
folder

O que não era o que se pretendia. Portanto, você precisa garantir que as aspas sejam transmitidas de comando para comando, usando escape conforme necessário - alguns comandos retiram aspas durante o processamento, enquanto outros as transmitem como estão.

Portanto, o comando final, devidamente citado e escapado, é:

ssh user@ip-address "dir \"c:/test folder\""

Observe também que, neste caso, também alterei c:\ para c:/. O cmd.exe moderno aceitará um / na maioria dos lugares, o que ajuda a evitar o antigo problema de ser necessário escapar ainda mais de qualquer \ no comando para evitar que ele seja interpretado como uma sequência de escape em si. ("Hackers" há muito usam esse problema como uma ferramenta para injeção de código, incorporando um "\n" que é expandido para um caractere de nova linha em aplicativos mal projetados.)

Se você mantiver o "\", provavelmente precisará escapar dele como "\\". (Observe que este é ummuitoproblema comum, de fato! Tive que editar esta postagem várias vezes para que ela fosse exibida corretamente. Isso também é conhecido como "fuga do inferno". Veja oEntrada Wiki da sequência de escapepara mais detalhes.)

Existem outros métodos para lidar com o problema básico (nomes de arquivos com espaços) no Windows:

  • Você pode mapear uma letra de unidade para o caminho completo com o substcomando. Isso também é frequentemente usado para "encurtar" caminhos muito longos:

    subst gd:/an/insanely/long/path/to/my/pessoal/pasta/de/favoritos/jogos

permitiria que você usasse "g:" em vez de sempre digitar o caminho completo.

  • Em NTFS nos sistemas Windows modernos, você pode usarPontos de nova análise NTFSpara criar pontos de junção e links simbólicos para nomes de arquivos (e pastas) que não possuem espaços nos nomes, mas apontam para aqueles que possuem. Às vezes, este é o único método utilizável se você tiver um nome que exigiria citações e escapes muito complexos.

informação relacionada