Comment utiliser PSCP pour copier un fichier d'une machine Unix vers une machine Windows où le chemin cible a des espaces?

14

J'ai un problème avec PSCP dans un programme C # pour copier un fichier d'une machine Unix vers une machine Windows. Le problème se produit uniquement lorsque le dossier cible sur la machine Windows contient un espace. Par exemple, ce qui suit fonctionne correctement: (REMARQUE: l'adresse IP et le mot de passe ont été modifiés pour cet exemple)

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

Mais quand je le change en ceci:

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

J'obtiens l'erreur suivante: plusieurs sources distantes non prises en charge.

Je me rends compte que c'est parce que PSCP interprète l'espace comme une autre cible. Mais comment faire? J'ai essayé toutes sortes de choses comme le mettre entre guillemets et s'échapper de l'espace. J'ai essayé toutes les solutions suivantes et rien ne fonctionne:

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

Des idées?

Corey Burnett
la source

Réponses:

18

Bien que la bonne réponse soit probablement d'utiliser WinSCP et leur bibliothèque C #, j'ai trouvé un moyen de faire fonctionner PSCP lorsque le dossier cible contient un espace.

La bonne réponse est de faire ceci:

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

Il s'avère que j'avais un autre problème qui me faisait penser que ce qui précède ne fonctionnait pas. À l'origine, j'utilisais le chemin d'accès complet à l'exécutable PSCP.EXE. Le chemin complet comprenait des espaces. J'essayais donc de faire ce qui suit:

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

Et j'essayais d'appeler cela depuis C # en utilisant Process.Start () et cela échouait. Il semblait qu'il pouvait le gérer s'il y avait un espace dans le chemin PSCP ou le chemin cible, mais pas les deux. J'ai corrigé cela en incluant le chemin vers l'exécutable PSCP dans mes variables d'environnement Windows. Maintenant, je suis capable d'appeler simplement PSCP.EXE et cela fonctionne avec les guillemets autour du dossier cible.

Corey Burnett
la source
10

Ne pas utiliser pscp.

Le client WinSCP (qui est construit au-dessus de PuTTY) fournit un assembly .NET . Voici un exemple .

user1686
la source
Eh bien, j'ai regardé cela et j'ai rencontré un problème différent. Apparemment, WinSCP nécessite la clé d'hôte SSH (que je n'ai pas). Lorsque j'utilisais PSCP, il y avait un moyen d'automatiser l'acceptation de la clé d'hôte. Mais d'après ce que je peux dire en lisant la documentation WinSCP C #, il ne semble pas y avoir de moyen d'accepter automatiquement la clé d'hôte. Des idées?
Corey Burnett
1
@CoreyBurnett: vous connectez-vous toujours au même serveur?
user1686
Je construis une application qui sera installée sur une machine Windows et se connectera potentiellement à un certain nombre de serveurs Linux différents. Lorsque j'utilisais PSCP, j'ai trouvé un moyen de dire à la ligne de commande d'accepter automatiquement la clé d'hôte. De cette façon, je n'avais pas besoin de savoir à l'avance quelle était la clé d'hôte. Cependant, je n'arrive pas à trouver cette option en utilisant C # et WinSCP.
Corey Burnett
Personnellement, je considérerais cela comme un grave problème de sécurité si un client SSH acceptait des clés d'hôte sans vérification ni confirmation de l'utilisateur.
user1686
Je suis d'accord. Cependant, c'est une situation très spécifique où nous construisons une application qui sera installée sur un ordinateur portable, puis cet ordinateur portable sera connecté à une boîte Unix dans un environnement contrôlé. Cette configuration sera vendue aux clients. Il n'est même pas connecté à Internet. J'essaie simplement de le rendre simple à installer et à utiliser afin que l'opérateur de l'application n'ait pas à connaître ou à se soucier des éléments de la clé d'hôte. Ça devrait juste marcher.
Corey Burnett
1

Ajoutez un point au dossier de destination. Les éléments suivants devraient fonctionner avec l'annexe . sur votre exemple:

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

eh bien d'abord, comme vous l'avez déjà mentionné, vous avez des espaces sur votre chemin. Il serait donc judicieux d'utiliser des guillemets "C: \ télécharger des fichiers". Deuxièmement, comme vous l'avez déjà souligné, vous devez ajouter votre application à votre PATH afin d'appeler pscp sans aucun chemin étrange. et troisièmement. Utilisez des conventions de dénomination qui empêchent ce gâchis causé par tout ce qui est cité.

camelCaseNaming
underscore_naming

Les deux résolvent le problème et vous avez l'air 100500 fois plus frais.

Anton Stafeyev
la source