我设置了专用的 SSH 密钥对,用于在远程服务器上强制执行特定命令。我将公钥添加到远程服务器的 authorized_keys 文件中,并添加一个命令选项,指定使用此密钥时要执行的命令。该命令是一个 shell 脚本,需要一个命令行参数,我希望将其传递到$SSH_ORIGINAL_COMMAND
环境变量中。
当我从客户端执行ssh
命令并指定此特定键的用途时,如下所示:
ssh -i id_rsa_mykey -o User=abc -o HostName=myhost xxx
远程脚本按预期执行并传递到变量xxx
中SSH_ORIGINAL_COMMAND
。
如果我尝试向远程命令传递一个电子邮件地址,但是远程命令sshd
会将该值解释为,user@host
并似乎尝试对符号之前的部分进行身份验证@
,并且远程命令永远不会执行。/var/log/auth.log
远程服务器上出现错误:
Invalid user xxx from 192.168.0.1
我怎样才能转义该@
符号,或者不将该sshd
值评估为user@host
,而是将值按原样传递给远程命令?
我尝试过尝试使用反斜杠转义@
符号以及--
在参数前使用但sshd
似乎不支持这个参数结尾约定。
- 客户端机器正在运行 Ubuntu
ssh
版本 OpenSSH_7.2p2。 - 服务器运行的是 Debian,
sshd
版本为 OpenSSH_6.7p1
答案1
我认为您有自己的理由-o User=abc -o HostName=myhost
使用abc@myhost
。
…然而遥控器
sshd
将该值解释为,user@host
并且似乎……
不,我认为是你们当地的工作人员ssh
对此进行了解释。
在我的 Debian 中,第一个不能解释为选项的参数被解释为ssh
或host
,user@host
取决于是否@
存在。此后,即使@
其中有,其他参数也不会以这种方式解释。
现在有一些观察:
user
来自user@host
优先于-o User=abc
,- 但
host
(独立 或来自user@host
) 被 抑制-o HostName=myhost
。
结论:使用 时-o HostName=myhost
,host
无关紧要。这使得以下情况成为可能:
ssh -i id_rsa_mykey -o User=abc -o HostName=myhost dummy_host foo@bar
由于 的存在dummy_host
,foo@bar
即使包含@
字符,也会作为命令传递到远程端。仍然ssh
连接到myhost
,而不是dummy_host
,因为-o HostName=myhost
优先。
注意:dummy_host
可能是也可能不是myhost
。甚至可能是空白(""
)。