PSCPを使用してファイルをUnixマシンからターゲットパスにスペースがあるWindowsマシンにコピーする方法は?


13

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

何か案は?

回答:


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

同意する。しかし、これは非常に特殊な状況であり、ラップトップにインストールするアプリケーションを構築し、そのラップトップを制御された環境でUnixボックスに接続します。このセットアップは顧客に販売されます。インターネットにも接続されていません。アプリケーションのオペレーターがホストキーのことを知ったり心配したりする必要がないように、インストールと使用を簡単にしようとしています。うまくいくはずです。
コーリーバーネット

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」を使用するのが賢明でしょう。第二に、すでに指摘したように、奇妙なパスなしでpscpを呼び出すために、アプリケーションをPATHに追加する必要があります。そして3番目。すべてを引用することによるこの混乱を防ぐ命名規則を使用してください。

camelCaseNaming
underscore_naming

どちらも問題を解決し、100500倍クールに見えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.