如何通过多台网桥机器 ssh 进入远程机器,成为另一个用户并以该用户身份运行命令

如何通过多台网桥机器 ssh 进入远程机器,成为另一个用户并以该用户身份运行命令

我需要在本地机器上的变量中保存从脚本或命令返回的值 - 让我们举个bash /tmp/script1.sh例子 - 该脚本或命令位于远程机器上 - 假设机器_C,在路径/tmp/script1.sh并包含:

#! bin/bash

echo "Hello! I am speaking from remote machine: $(hostname -I)"

但是,这台机器只能通过多台桥接机器(在我的情况下是两台)才能通过 ssh 到达 - 假设机器_P机器_C

此外,由于访问锁定,只有特定用户(比如说用户_O- 出席机器_B,可以访问下一台机器,所以当我的代码到达机器_B,它需要切换到用户_O

注意:我无法 ssh 进入机器_B直接作为用户_O因为访问锁定。另外,我想为我的 ssh 命令添加超时,这样如果访问失败,该过程不会永远处于停滞状态。

所以程序是

  1. 使用权机器_B作为用户_B
  2. 从那台机器切换到用户_O并访问机器_P作为用户_O
  3. 从该机器访问机器_C作为用户O
  4. 在 machine_C 中,运行命令bash /tmp/script1.sh

我该怎么做?

答案1

简短回答:

ssh_timeout=3

ip_string=$(ssh -o ConnectTimeout=$ssh_timeout $user_B@$remote_machine_B_ip                         \
              "sudo -i -u user_O ssh -o ConnectTimeout=$ssh_timeout $user_O@$remote_machine_P_ip  \
                  \"ssh -o ConnectTimeout=$ssh_timeout $user_O@$remote_machine_C_ip               \
                      \"bash /tmp/script1.sh\"                                          \
                  \"                                                                              \
              "                                                                                   \
          )
          

解释:

首先,我们需要一个变量来存储返回的值脚本1,因此我们首先:

info=...

然后我们需要运行一个命令,最终运行该脚本机器_C获取该值:

info=$(...)

然后我们第一次 ssh 进入机器_B作为用户_O,带有超时选项(-o ConnectTimeout=seconds),
并且我们希望通过 ssh 运行的命令必须放在分隔符之间;我们选择双引号("):

info=$(ssh -o ConnectTimeout=$ssh_timeout $user_B@$remote_machine_B_ip "...")

然后用户_B机器_B必须切换到用户_O然后通过 ssh 进入机器_P并在那里运行另一个命令。
该命令必须用分隔符括起来,由于我们已经使用了双引号 ( "),为了避免代码将第二对引号读为第一对引号的闭包,我们必须用 对其进行转义\,这样只有当代码运行时,它们才会被读为引号机器_P

info=$(ssh -o ConnectTimeout=$ssh_timeout $user_B@$remote_machine_B_ip "sudo -i -u user_O ssh -o ConnectTimeout=$ssh_timeout $user_O@$remote_machine_P_ip  \"...\" ")

让我们将此命令显示为多行,使其更易于理解。
为了防止代码在我们换行时停止读取命令,我们必须使用\

info=$(ssh -o ConnectTimeout=$ssh_timeout $user_B@$remote_machine_B_ip \
            "sudo -i -u user_O ssh -o ConnectTimeout=$ssh_timeout $user_O@$remote_machine_P_ip  \"...\" "   \
        )

然后用户_O机器_P必须通过 ssh 进入机器_C并运行命令。
该命令必须用分隔符括起来,同样,由于我们已经使用了双引号 ( "),为了避免代码将第三对引号读为第一对引号的闭包,我们必须对其进行转义。
同样,让我们​​将命令放在多行中:

info=$(ssh -o ConnectTimeout=$ssh_timeout $user_B@$remote_machine_B_ip                                  \
                  "sudo -i -u user_O ssh -o ConnectTimeout=$ssh_timeout $user_O@$remote_machine_P_ip  \
                      \"ssh -o ConnectTimeout=$ssh_timeout $user_O@$remote_machine_C_ip \"...\" \"                                                                              \
                  "                                                                                   \
              )
              

最后,我们必须输入想要运行的命令机器_C\"...\"我们之前准备好的插槽中。
如果相同的脚本位于指定位置,此命令的语法与我们在本地机器上编写和运行此命令时使用的语法完全相同。

# define ssh_timeout
ssh_timeout=3

info=$(ssh -o ConnectTimeout=$ssh_timeout $user_B@$remote_machine_B_ip                         \
              "sudo -i -u user_O ssh -o ConnectTimeout=$ssh_timeout $user_O@$remote_machine_P_ip  \
                  \"ssh -o ConnectTimeout=$ssh_timeout $user_O@$remote_machine_C_ip               \
                      \"bash /tmp/script1.sh\"                                          \
                  \"                                                                              \
              "                                                                                   \
          )

echo "$info"

输出为

I am speaking from remote machine: <remote_machine_C_ip>

相关内容