Comando SSH + DIR en una máquina remota con Windows

Comando SSH + DIR en una máquina remota con Windows

Instalé OpenSSH en Windows Server 2008 r2 y exporté mi clave pública allí. Puedo conectarme normalmente sin escribir una contraseña, incluso puedo ejecutar el comando DIR que ya está en el comando que uso para conectarme:

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

Sin embargo, ejecutar el comando DIR en un directorio con espacios en el nombre:

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

No funciona.

¿Alguien sabría cuál es la forma correcta de ejecutar el comando dir en una carpeta con espacios en el nombre? Gracias de antemano.

Respuesta1

un amigo que es programador me enseñó cómo solucionar esto. ¿Cómo necesito que la ruta se imprima en el shell de Windows con comillas dobles como esta?

"c:\teste folder"

Y las comillas dobles ya sirven para enviar el comando a Windows vía SSH, para enviar las comillas dobles al shell de windows necesitas usar la barra invertida con comillas dobles \", el comando quedaría así:

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

Queda como una ayuda para quienes tengan las mismas dudas en el futuro.

Material de referencia

Respuesta2

Primero, asegúrese siempre de verificar las comillas, las reglas vigentes para el shell (el comando se ejecuta en bash localmente, pero el lado remoto puede usar algo más, como cmd.exe en Windows) con respecto a las comillas y cuándo escapar de las comillas. debes transmitirlo explícitamente. Además, el par externo a menudo se elimina durante el análisis.

Con el comando ssh user@ip-address "dir c:\\testfolder", bash ve tres partes del comando:

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

Tenga en cuenta que bash NO incluye las comillas alrededor del último elemento. Esto se debe a que en esta etapa, bash asume que está usando las comillas para indicarle a bash que interprete el texto citado como una parte (almacenado en una cadena en el espacio de memoria de bash).

Cuando bash entrega el comando a ssh, ssh ve las dos últimas partes: user@ip-addressy dir c:\test folder. shh usa la primera parte para determinar dónde conectarse y, una vez conectado, pasa la segunda parte exactamente como está al extremo remoto; recuerde, sin embargo, las comillas ya se han eliminado.

En el extremo remoto, sshd (el demonio/servicio ssh) lo recibe y lo pasa a cmd.exe (ya que este es el lado de Windows), como... No dos, sino tres partes:

dir
c:\test
folder

Que no era lo que se pretendía. Por lo tanto, debe asegurarse de que las comillas se transmitan de un comando a otro, utilizando el sistema de escape según sea necesario. Algunos comandos eliminan las comillas durante el procesamiento, mientras que otros las pasan tal cual.

Entonces, el comando final, correctamente citado y con escape, es:

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

Tenga en cuenta también que en este caso, también cambié c:\ a c:/. El cmd.exe moderno aceptará un / en la mayoría de los lugares, lo que ayuda a evitar el antiguo problema de la necesidad de escapar aún más de cualquier \ en el comando para evitar que se interprete como una secuencia de escape en sí. ("Los piratas informáticos" han utilizado durante mucho tiempo este problema como herramienta para la inyección de código, incrustando un "\n" que se expande a un carácter de nueva línea en aplicaciones mal diseñadas).

Si mantiene "\", probablemente necesitará escaparlo como "\\". (Tenga en cuenta que este es unmuy¡Problema común, de hecho! Tuve que editar esta publicación varias veces para que se mostrara correctamente. Esto también se conoce como "escapar del infierno". Ver elEntrada de Wiki de secuencia de escapepara más detalles.)

En Windows existen otros métodos para manejar el problema base (nombres de archivos con espacios):

  • Puede asignar una letra de unidad a la ruta completa con el substcomando. Esto también se suele utilizar para "acortar" caminos muy largos:

    subst gd:/una/increíblemente/larga/ruta/a/mi/carpeta/personal/de/juegos/favoritos

le permitiría usar "g:" en lugar de escribir siempre la ruta completa.

  • En NTFS en los sistemas Windows modernos, puede usarPuntos de análisis NTFSpara crear puntos de unión y enlaces simbólicos para nombres de archivos (y carpetas) que no tienen espacios en los nombres, pero que apuntan a los que sí los tienen. A veces, este es el único método utilizable si tiene un nombre que requeriría comillas y escapes muy complejos.

información relacionada