¿Cómo usar PSCP para copiar archivos de la máquina Unix a la máquina Windows donde la ruta de destino tiene espacios?

14

Tengo un problema al usar PSCP en un programa C # para copiar un archivo de una máquina Unix a una máquina Windows. El problema solo ocurre cuando la carpeta de destino en la máquina Windows tiene un espacio en ella. Por ejemplo, lo siguiente funciona bien: (NOTA: la dirección IP y la contraseña se han cambiado para este ejemplo)

pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt C:\download

Pero cuando lo cambio a esto:

pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt C:\download files

Me sale el siguiente error: no se admite más de una fuente remota.

Me doy cuenta de que es porque PSCP interpreta el espacio como otro objetivo. ¿Pero cómo puedo hacerlo? He intentado todo tipo de cosas como ponerlo entre comillas y escapar del espacio. He intentado todo lo siguiente y nada funciona:

pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt "C:\download files"
pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt C:\"download files"
pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt C:\download\\ files

¿Algunas ideas?

Corey Burnett
fuente

Respuestas:

18

Aunque la respuesta correcta es probablemente usar WinSCP y su biblioteca C #, encontré una manera de hacer que PSCP funcione cuando la carpeta de destino tiene un espacio en ella.

La respuesta correcta es hacer esto:

pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt "C:\download files"

Resulta que estaba teniendo otro problema que me hacía pensar que lo anterior no estaba funcionando. Originalmente estaba usando la ruta completa al ejecutable PSCP.EXE. El camino completo incluía espacios. Entonces estaba tratando de hacer lo siguiente:

"C:\My PSCP Folder\pscp.exe" -pw MyPassword [email protected]:/etc/myfolder/myfile.opt "C:\download files"

Y estaba tratando de llamar eso desde C # usando Process.Start () y estaba fallando. Parecía que podría manejarlo si hubiera un espacio en la ruta de PSCP o en la ruta de destino, pero no en ambos. Lo arreglé al incluir la ruta al ejecutable de PSCP en mis variables de entorno de Windows. Ahora puedo llamar a PSCP.EXE y funciona con las comillas alrededor de la carpeta de destino.

Corey Burnett
fuente
10

No utilice pscp.

El cliente WinSCP (que se basa en PuTTY) proporciona un ensamblado .NET . Aquí hay un ejemplo .

usuario1686
fuente
Bueno, miré eso y me encontré con un problema diferente. Aparentemente, WinSCP requiere la clave de host SSH (que no tengo). Cuando estaba usando PSCP había una manera de automatizar la aceptación de la clave de host. Pero por lo que puedo decir al leer la documentación de WinSCP C #, no parece haber ninguna forma de aceptar automáticamente la clave de host. ¿Algunas ideas?
Corey Burnett
1
@CoreyBurnett: ¿Te estás conectando siempre al mismo servidor?
user1686
Estoy creando una aplicación que se instalará en una máquina Windows y se conectará potencialmente a varios servidores Linux diferentes. Cuando estaba usando PSCP, encontré una manera de decirle a la línea de comando que aceptara automáticamente la clave de host. De esa manera no necesitaba saber cuál era la clave de host antes de tiempo. Sin embargo, parece que no puedo encontrar esa opción usando C # y WinSCP.
Corey Burnett
Personalmente, consideraría un problema grave de seguridad si un cliente SSH aceptara claves de host sin verificación o confirmación del usuario.
user1686
Estoy de acuerdo. Sin embargo, esta es una situación muy específica en la que estamos creando una aplicación que se instalará en una computadora portátil y luego esa computadora portátil se conectará a una caja Unix en un entorno controlado. Esta configuración se venderá a los clientes. Ni siquiera está conectado a Internet. Solo estoy tratando de simplificar la instalación y el uso para que el operador de la aplicación no tenga que saber o preocuparse por las cosas de la clave de host. Simplemente debería funcionar.
Corey Burnett el
1

Agregue un punto a la carpeta de destino. Lo siguiente debería funcionar con el anexo . en tu ejemplo:

"C:\My PSCP Folder\pscp.exe" -pw MyPassword [email protected]:/etc/myfolder/myfile.opt "C:\download files\."
Mate
fuente
0
pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt "C:\download files"

bueno, primero, como ya mencionaste, tienes espacios en tu camino. Por lo tanto, sería aconsejable utilizar comillas "C: \ descargar archivos". En segundo lugar, como ya señaló, debe agregar su aplicación a su RUTA para llamar a pscp sin ninguna ruta extraña. y tercero. Use convenciones de nomenclatura que eviten este desastre causado por citar todo.

camelCaseNaming
underscore_naming

Ambos resuelven el problema y te ves 100500 veces más genial.

Anton Stafeyev
fuente