我在 server2 上运行来自 server1 的以下 SSH 命令:
ssh server2 echo pasword | su - root -c "echo this is the `hostname`"
我预期结果是 server2 的主机名,但我得到的却是 server1 的主机名。我该如何操作命令来获取 server 2 的主机名?
谢谢。
答案1
首先,您的命令管道是错误的。目前,这是按以下顺序执行的:
ssh server2 echo pasword
- 这将转到服务器 2 并登录并echo pasword
在远程系统上执行命令。(输出为pasword
)获取 #1 的输出(“pasword”)并将其导入到本地运行的命令中:
su - root -c "echo this is the `hostname`"
...从技术上讲,它会回显您的本地主机名(并且不会对第一个命令中回显的“密码”执行任何操作)。(不过,您不需要“root” -
hostname
远程系统或本地系统上的任何人都可以运行,不需要超级用户!)。
你需要要做的是将命令传递到 SSH 中,而不是通过这种方式传递到管道中。执行此操作的方法是使用以下命令:
ssh server2 'echo "This is the $(hostname)"'
这将正确地将请求发送到远程服务器以获取主机名那服务器并在远程服务器上执行该操作并告诉您响应。 您不需要sudo
在远程服务器上执行此操作。
如果您需要为 SSH 会话提供密码,则应使用ssh-pass
并执行以下命令:
sshpass -p YourPassword ssh server2 'echo "This is the $(hostname)"'
这被认为是正确的方法因为它以keyboard-interactive
非交互方式进行身份验证,并在提示输入密码时将密码传递到 SSH 命令中。 然而这仍然非常不安全,因为您的密码将在命令历史记录中或在脚本中硬编码,因此您应该考虑在远程服务器上使用 SSH 密钥验证而不是密码验证。
答案2
这里有几件事。
首先 - 命令
ssh server2 echo pasword | su - root -c "echo this is the `hostname`"
执行以下操作:
通过 ssh
echo pasword
在远程服务器上运行命令server2
并将此命令的输出提供给以下命令,在您的当地的电脑:
su - root -c "echo this is the `hostname`"
echo
如果您想要在远程计算机上执行从 开始的整个管道,您应该这样做:
ssh server2 'echo pasword | su - root -c "echo this is the `hostname`"'
但这是行不通的,因为su
需要从终端运行,并且只会中止并显示错误消息。但是,您不需要 root 权限来运行该hostname
命令,因此您可以尝试
ssh server2 echo 'this is the `hostname`'
您必须将hostname
替代品放在单引号,否则它将在发送到远程计算机之前在您的本地计算机上被替换,因此它仍会打印您的本地主机名。