如何使用PSCP将文件从Unix计算机复制到目标路径具有空格的Windows计算机?


14

我在C#程序中使用PSCP将文件从Unix计算机复制到Windows计算机时遇到问题。仅当Windows计算机上的目标文件夹中有空格时,才会发生此问题。例如,以下工作正常:(注意:此示例的IP地址和密码已更改)

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

但是当我将其更改为:

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

我收到以下错误:不支持多个远程源。

我意识到这是因为PSCP将空间解释为另一个目标。但是我该怎么办呢?我已经尝试过各种方法,例如将其用引号引起来并转义空格。我已经尝试了以下所有方法,但没有任何效果:

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

有任何想法吗?

Answers:


18

尽管正确的答案可能是使用WinSCP及其C#库,但是我确实找到了一种方法,当目标文件夹中有空间时,PSCP才能工作。

正确的答案是这样做的:

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

事实证明,我遇到了另一个问题,使我认为上述操作无效。最初,我使用的是PSCP.EXE可执行文件的完整路径。完整路径包含空格。因此,我尝试执行以下操作:

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

我试图使用Process.Start()从C#调用它,但是失败了。如果PSCP路径或目标路径中都存在一个空间,但不能同时存在两者,则似乎可以处理。我通过在Windows环境变量中包含PSCP可执行文件的路径来解决此问题。现在,我可以只调用PSCP.EXE,它可以与目标文件夹周围的引号一起使用。


10

不要使用pscp

所述的WinSCP客户端(其是建立在腻子的顶部)提供的.NET组件。这是一个例子


好吧,我看着那个,然后遇到了另一个问题。显然,WinSCP需要SSH主机密钥(我没有)。当我使用PSCP时,有一种方法可以自动接受主机密钥。但是据我在阅读WinSCP C#文档时所知,似乎没有任何方法可以自动接受主机密钥。有任何想法吗?
科里·伯内特

1
@CoreyBurnett:您是否总是连接到同一台服务器?
user1686

我正在构建一个将安装在Windows机器上的应用程序,该应用程序可能会连接到许多不同的Linux服务器。当我使用PSCP时,我找到了一种告诉命令行自动接受主机密钥的方法。这样,我不需要提前知道主机密钥是什么。但是我似乎找不到使用C#和WinSCP的选项。
科里·伯纳特

就个人而言,如果SSH客户端在未经验证或用户确认的情况下接受主机密钥,我会认为这是一个严重的安全问题。
user1686 2013年

我同意。但是,这是一种非常特殊的情况,我们正在构建将安装在便携式计算机上的应用程序,然后将该便携式计算机连接到受控环境中的Unix机顶盒。此设置将出售给客户。它甚至没有连接到Internet。我只是想简化安装和使用,以便应用程序的操作员不必知道或担心主机密钥。它应该工作。
Corey Burnett

1

在目标文件夹上附加一个句点。以下应与附录一起使用在您的示例中:

"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"

首先,正如您已经提到的,路径中有空格。因此,使用引号“ C:\ download files”将是明智的。其次,正如您已经指出的那样,您需要将应用程序添加到PATH中,以便在没有任何奇怪路径的情况下调用pscp。第三。使用命名约定,以防止因引用所有内容而引起混乱。

camelCaseNaming
underscore_naming

两者都解决了这个问题,您看上去要凉爽100500倍。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.