Come utilizzare PSCP per copiare il file dalla macchina Unix alla macchina Windows in cui il percorso di destinazione ha spazi?


14

Sto riscontrando un problema con l'utilizzo di PSCP in un programma C # per copiare un file da una macchina Unix a una macchina Windows. Il problema si verifica solo quando nella cartella di destinazione sul computer Windows è presente uno spazio. Ad esempio, il seguente funziona correttamente: (NOTA: l'indirizzo IP e la password sono stati modificati per questo esempio)

pscp.exe -pw MyPassword root@127.0.0.1:/etc/myfolder/myfile.opt C:\download

Ma quando lo cambio in questo:

pscp.exe -pw MyPassword root@127.0.0.1:/etc/myfolder/myfile.opt C:\download files

Ottengo il seguente errore: Più di una fonte remota non supportata.

Mi rendo conto che PSCP integra lo spazio come un altro obiettivo. Ma come posso farlo? Ho provato tutti i tipi di cose come metterlo tra virgolette e sfuggire allo spazio. Ho provato tutto quanto segue e niente funziona:

pscp.exe -pw MyPassword root@127.0.0.1:/etc/myfolder/myfile.opt "C:\download files"
pscp.exe -pw MyPassword root@127.0.0.1:/etc/myfolder/myfile.opt C:\"download files"
pscp.exe -pw MyPassword root@127.0.0.1:/etc/myfolder/myfile.opt C:\download\\ files

Qualche idea?

Risposte:


18

Sebbene la risposta corretta sia probabilmente utilizzare WinSCP e la loro libreria C #, ho trovato un modo per far funzionare PSCP quando la cartella di destinazione ha uno spazio al suo interno.

La risposta corretta è fare questo:

pscp.exe -pw MyPassword root@127.0.0.1:/etc/myfolder/myfile.opt "C:\download files"

Si scopre che stavo avendo un altro problema che mi stava facendo pensare che quanto sopra non funzionava. Inizialmente stavo usando il percorso completo dell'eseguibile PSCP.EXE. Il percorso completo includeva spazi. Quindi stavo provando a fare quanto segue:

"C:\My PSCP Folder\pscp.exe" -pw MyPassword root@127.0.0.1:/etc/myfolder/myfile.opt "C:\download files"

E stavo provando a chiamarlo da C # usando Process.Start () e non ci riuscivo. Sembrava in grado di gestirlo se fosse presente uno spazio nel percorso PSCP o nel percorso target, ma non in entrambi. L'ho risolto includendo il percorso dell'eseguibile PSCP nelle mie variabili di ambiente Windows. Ora sono in grado di chiamare solo PSCP.EXE e funziona con le virgolette intorno alla cartella di destinazione.


10

Non usare pscp.

Il client WinSCP (che si basa su PuTTY) fornisce un assembly .NET . Ecco un esempio .


Bene, l'ho guardato e ho riscontrato un problema diverso. Apparentemente WinSCP richiede la chiave host SSH (che non ho). Quando stavo usando PSCP c'era un modo per automatizzare l'accettazione della chiave host. Ma da quello che posso dire leggendo la documentazione di WinSCP C # non sembra esserci alcun modo per accettare automaticamente la chiave host. Qualche idea?
Corey Burnett,

1
@CoreyBurnett: ti connetti sempre allo stesso server?
user1686

Sto creando un'applicazione che verrà installata su un computer Windows e che potenzialmente si connetterà a diversi server Linux. Quando stavo usando PSCP ho trovato un modo per dire alla riga di comando di accettare automaticamente la chiave host. In questo modo non avevo bisogno di sapere in anticipo quale fosse la chiave host. Tuttavia non riesco a trovare quell'opzione usando C # e WinSCP.
Corey Burnett,

Personalmente, lo considererei un serio problema di sicurezza se un client SSH accettasse le chiavi dell'host senza verifica o conferma dell'utente.
user1686

Sono d'accordo. Tuttavia, questa è una situazione molto specifica in cui stiamo costruendo un'applicazione che verrà installata su un laptop e quindi quel laptop verrà collegato a una scatola Unix in un ambiente controllato. Questa configurazione sarà venduta ai clienti. Non è nemmeno connesso a Internet. Sto solo cercando di semplificare l'installazione e l'uso in modo che l'operatore dell'applicazione non debba conoscere o preoccuparsi delle cose chiave dell'host. Dovrebbe solo funzionare.
Corey Burnett,

1

Aggiungi un punto alla cartella di destinazione. Quanto segue dovrebbe funzionare con l'aggiunta . sul tuo esempio:

"C:\My PSCP Folder\pscp.exe" -pw MyPassword root@127.0.0.1:/etc/myfolder/myfile.opt "C:\download files\."

0
pscp.exe -pw MyPassword root@127.0.0.1:/etc/myfolder/myfile.opt "C:\download files"

bene prima, come hai già detto, hai degli spazi sul tuo cammino. Quindi sarebbe saggio usare le virgolette "C: \ download files". In secondo luogo, come hai già sottolineato, è necessario aggiungere l'applicazione al PATH per poter chiamare pscp senza alcun percorso strano. e terzo. Usa le convenzioni di denominazione che impediscono questo disordine causato dalla citazione di tutto.

camelCaseNaming
underscore_naming

Entrambi risolvono il problema e sembri 100500 volte più fresco.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.