从Linux到Windows的ssh - 为什么需要这么多斜线?

时间:2017-01-23 13:11:37

标签: linux windows ssh openssh

我正在尝试将ssh上的命令从Linux机器运行到Windows机器。

Windows机器已安装OpenSSHx64

以下带双引号的命令失败:

ssh user@win8-pc "ls -l \\\\172.21.15.120\\vol0slash"

ls: cannot access 172.21.15.120vol0slash: No such file or directory

带单引号的相同命令仍然失败,但至少显示单斜杠:

ssh user@win8-pc 'ls -l \\\\172.21.15.120\\vol0slash'
ls: cannot access \172.21.15.120vol0slash: No such file or directory

带单引号的环绕路径几乎可以正常工作,但仍然缺少一个根斜杠:

ssh user@win8-pc "ls -l '\\\\172.21.15.120\\vol0slash'"
ls: cannot access \172.21.15.120\vol0slash: No such file or directory

现在最后将第五个斜杠添加到UNC路径根,做了诀窍:

ssh user@win8-pc "ls -l '\\\\\172.21.15.120\\vol0slash'"
total 536
drwxr-xr-x 1 Admin Domain Users   0 Jan 23 08:33 GeneralSystemDiagnostic
drwxr-xr-x 1 Admin Domain Users   0 Jan 22 08:10 cifs
-rw-r--r-- 1 Admin Domain Users 336 Jan 23 12:00 linux.txt
drwxr-xr-x 1 Admin Domain Users   0 Jan 19 14:11 nfs

任何人都可以解释这种行为背后的逻辑吗?

1 个答案:

答案 0 :(得分:1)

反斜杠是bash中的特殊符号,在所有Linux shell中都是如此,因此如果您需要使用它,则必须使用另一个\(反斜杠)进行转义。命令为passed through the remote bash,例如

bash -c "ls -l '\\\\\172.21.15.120\\vol0slash'"

哪些传输会评估特殊字符并使其看起来像

ls -l '\\\172.21.15.120\vol0slash'

当它应该运行时。

使用奇数个反斜杠的问题最终将作为一个特殊字符进行评估,所以如果你想在最后看到一个反斜杠,你应该使用偶数。

另一件事是Windows上ls如何解释参数(我不知道)。请参阅简单echo的测试:

$ ssh f25 "echo '\1'"
\1
$ ssh f25 "echo '\\1'"
\1
$ ssh f25 "echo '\\\1'"
\\1
$ ssh f25 "echo '\\\\1'"
\\1

同样,您可以在没有'的情况下解释原始命令:

ssh user@win8-pc "ls -l \\\\172.21.15.120\\vol0slash"

已经在本地shell中(因为它不在'

ssh user@win8-pc "ls -l \\172.21.15.120\vol0slash"

并且远程shell已经

bash -c "ls -l \\172.21.15.120\vol0slash"

评估为

bash -c "ls -l \172.21.15.120vol0slash"

ls -l 172.21.15.120vol0slash

显然不存在。