リモート Windows マシンでの SSH + DIR コマンド

リモート Windows マシンでの SSH + DIR コマンド

Windows Server 2008 R2 に OpenSSH をインストールし、公開キーをそこにエクスポートしました。パスワードを入力せずに通常どおり接続でき、接続に使用するコマンドにすでに含まれている DIR コマンドを実行することもできます。

ssh user@ip-address "dir c:\testfolder"

ただし、名前にスペースが含まれるディレクトリに対して DIR コマンドを実行すると、次のようになります。

ssh user@ip-address "dir c:\test folder"

動作しません。

名前にスペースが含まれるフォルダーに対して dir コマンドを実行する正しい方法をご存知の方はいらっしゃいますか? よろしくお願いします。

答え1

プログラマーの友人が、この問題を解決する方法を教えてくれました。次のように、Windows シェルでパスを二重引用符で囲んで印刷するにはどうすればよいでしょうか。

"c:\teste folder"

二重引用符はすでに SSH 経由で Wi​​ndows にコマンドを送信するために使用されていますが、二重引用符を Windows シェルに送信するには、二重引用符とともにバックスラッシュを使用する必要があります。\"コマンドは次のようになります。

ssh user@ip-address "dir \"c:\teste folder\""

今後、同じ疑問を持つ人にとっての助けとして残ります。

参考資料

答え2

まず、引用符、引用符に関するシェルの有効なルール (コマンドはローカルでは bash で実行されますが、リモート側では Windows の cmd.exe など他のものを使用する場合があります)、および明示的に渡す必要がある引用符をエスケープするタイミングを必ず確認してください。また、外側のペアは解析中に削除されることがよくあります。

コマンドを使用するとssh user@ip-address "dir c:\\testfolder"、bash はコマンドを 3 つの部分として認識します。

ssh
user@ip-address
dir c:\test folder

特に、bash は最後の項目を引用符で囲まないことに注意してください。これは、この段階では、bash は引用符を使用して、引用符で囲まれたテキストを 1 つの部分 (bash のメモリ スペース内の 1 つの文字列に格納されている) として解釈するように bash 自体に指示していると想定しているためです。

bash がコマンドを ssh に渡すと、ssh は最後の 2 つの部分、およびを確認しますuser@ip-address。shhdir c:\test folderは最初の部分を使用して接続先を決定し、接続されると、2 番目の部分をそのままリモート エンドに渡します。ただし、引用符はすでに削除されていることに注意してください。

リモート側では、sshd (ssh デーモン/サービス) がそれを受け取り、cmd.exe (Windows 側なので) に渡します。これは 2 つではなく 3 つの部分です。

dir
c:\test
folder

これは意図したものではありません。したがって、必要に応じてエスケープを使用して、引用符がコマンド間で渡されるようにする必要があります。一部のコマンドは処理中に引用符を削除しますが、他のコマンドは引用符をそのまま渡します。

したがって、適切に引用符で囲まれエスケープされた最終的なコマンドは次のようになります。

ssh user@ip-address "dir \"c:/test folder\""

また、この場合、c:\ を c:/ に変更したことにも注意してください。最新の cmd.exe は、ほとんどの場所で / を受け入れるため、コマンド内の \ をさらにエスケープして、エスケープ シーケンスとして解釈されないようにする必要があるという古い問題を回避するのに役立ちます。(「ハッカー」は、設計の悪いアプリケーションで改行文字に展開される「\n」を埋め込むことで、この問題をコード インジェクションのツールとして長い間使用してきました。)

「\」を残す場合は、「\\」としてエスケープする必要があるでしょう。(これはとてもよくある問題です!正しく表示されるようにするために、この投稿を何度も編集する必要がありました。これは「脱出地獄」とも呼ばれています。エスケープシーケンス Wiki エントリ詳細については。)

Windows には、基本的な問題 (スペースを含むファイル名) を処理する他の方法があります。

  • コマンドを使用して、ドライブ文字をフルパスにマップできますsubst。これは、非常に長いパスを「短縮」するためにもよく使用されます。

    subst gd:/私のお気に入りのゲームの個人フォルダへの非常に長いパス

常に完全なパスを入力する代わりに、「g:」を使用できるようになります。

  • 最近のWindowsシステムのNTFSでは、NTFS 再解析ポイント名前にスペースが含まれないファイル名とフォルダ名にジャンクション ポイントとシンボリック リンクを作成しますが、スペースが含まれるファイル名とフォルダ名を指すようにします。非常に複雑な引用符とエスケープ処理を必要とする名前の場合は、これが唯一使用できる方法となる場合があります。

関連情報