远程 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 shell 中使用双引号打印路径,如下所示:

"c:\teste folder"

双引号已经用于通过 SSH 将命令发送到 Windows,要将双引号发送到 Windows shell,您需要使用带双引号的反斜杠\",命令如下所示:

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

对于那些将来有同样疑问的人来说,它仍然是一个帮助。

参考资料

答案2

首先,一定要检查引用、对 shell 有效的规则(该命令在本地 bash 中执行,但远程端可能使用其他内容,例如 Windows 上的 cmd.exe),以及何时转义引号你需要明确地传递。此外,在解析过程中,外部对经常被剥离/删除。

通过命令ssh user@ip-address "dir c:\\testfolder",bash 看到该命令的三个部分:

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

特别注意 bash 不包括最后一项的引号!这是因为在这一阶段,bash 假设您使用引号来告诉 bash 本身将带引号的文本解释为一部分(存储在 bash 内存空间中的一个字符串中)。

当 bash 将命令交给 ssh 时,ssh 会看到最后两部分:user@ip-addressdir c:\test folder。 shh 使用第一部分来确定连接位置,连接后,将第二部分完全按原样传递到远程端 - 请记住,但是引号已被删除。

在远程端,sshd(ssh 守护进程/服务)接收该数据,并将其传递给 cmd.exe(因为这是 Windows 端),就像...不是两个部分,而是三个部分:

dir
c:\test
folder

这不是我们想要的。因此,您需要确保引号从一个命令传递到另一个命令,并根据需要使用转义——某些命令在处理时删除引号,而其他命令则按原样传递它们。

因此,正确引用并转义的最终命令是:

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

另请注意,在本例中,我还将 c:\ 更改为 c:/。现代 cmd.exe 在大多数地方都会接受 /,这有助于避免需要进一步转义命令中的任何 \ 以防止其被解释为转义序列本身的古老问题。 (“黑客”长期以来一直利用这个问题作为代码注入的工具,通过嵌入“\n”,在设计不良的应用程序中该“\n”会扩展为换行符。)

如果保留“\”,则可能需要将其转义为“\\”。 (请注意,这是一个非常确实是常见问题!我不得不多次编辑这篇文章才能使其正确显示。这也被称为“逃离地狱”。请参阅逃脱序列 Wiki 条目更多细节。)

Windows 上还存在其他处理基本问题(文件名中带有空格)的方法:

  • 您可以使用该命令将驱动器号映射到完整路径subst。这也经常用于“缩短”很长的路径:

    subst gd:/an/insanely/long/path/to/my/personal/folder/of/favorite/games

会让你使用“g:”而不是总是输入完整路径。

  • 在现代 Windows 系统中的 NTFS 下,您可以使用NTFS 重新分析点为名称中没有空格但指向有空格的文件(和文件夹)名称创建连接点和符号链接。有时,如果您的名称需要非常复杂的引用和转义,这是唯一可用的方法。

相关内容