如何防止 ssh 将远程命令解释为主机?

如何防止 ssh 将远程命令解释为主机?

我设置了专用的 SSH 密钥对,用于在远程服务器上强制执行特定命令。我将公钥添加到远程服务器的 authorized_keys 文件中,并添加一个命令选项,指定使用此密钥时要执行的命令。该命令是一个 shell 脚本,需要一个命令行参数,我希望将其传递到$SSH_ORIGINAL_COMMAND环境变量中。

当我从客户端执行ssh命令并指定此特定键的用途时,如下所示:

ssh -i id_rsa_mykey -o User=abc -o HostName=myhost xxx

远程脚本按预期执行并传递到变量xxxSSH_ORIGINAL_COMMAND

如果我尝试向远程命令传递一个电子邮件地址,但是远程命令sshd会将该值解释为,user@host并似乎尝试对符号之前的部分进行身份验证@,并且远程命令永远不会执行。/var/log/auth.log远程服务器上出现错误:

Invalid user xxx from 192.168.0.1

我怎样才能转义该@符号,或者不将该sshd值评估为user@host,而是将值按原样传递给远程命令?

我尝试过尝试使用反斜杠转义@符号以及--在参数前使用但sshd似乎不支持这个参数结尾约定。

  • 客户端机器正在运行 Ubuntussh版本 OpenSSH_7.2p2。
  • 服务器运行的是 Debian,sshd版本为 OpenSSH_6.7p1

答案1

我认为您有自己的理由-o User=abc -o HostName=myhost使用abc@myhost

…然而遥控器sshd将该值解释为,user@host并且似乎……

不,我认为是你们当地的工作人员ssh对此进行了解释。

在我的 Debian 中,第一个不能解释为选项的参数被解释为sshhostuser@host取决于是否@存在。此后,即使@其中有,其他参数也不会以这种方式解释。

现在有一些观察:

  • user来自user@host优先于-o User=abc
  • host(独立 或来自user@host) 被 抑制-o HostName=myhost

结论:使用 时-o HostName=myhosthost无关紧要。这使得以下情况成为可能:

ssh -i id_rsa_mykey -o User=abc -o HostName=myhost dummy_host foo@bar

由于 的存在dummy_hostfoo@bar即使包含@字符,也会作为命令传递到远程端。仍然ssh连接到myhost,而不是dummy_host,因为-o HostName=myhost优先。

注意:dummy_host可能是也可能不是myhost。甚至可能是空白("")。

相关内容