用Heredocs或更好的方法击败脚本



我需要在

内运行一些命令
ssh->ssh->clientprogram->loop command

这是我执行命令的要求。

  1. 将输入参数发送到第一个SSH服务器,捕获该命令的输出(这是bash脚本在同一路径中的其他脚本上相互依赖,并且在$ PATH变量中可用。我确实使用了echo $ path检查(
  2. 提供 ip 的step1命令输出到第二ssh命令。
  3. 循环在n时和循环内部,启用客户端和执行系列命令并捕获命令的输出,并从第二个命令验证输出(例如:一系列命令为:rm file; ls--> check该文件是否存在,然后重复进行直到n迭代(
  4. 应该根据选择执行步骤3(例如:创建文件或删除文件(。此变量应在开始时从用户中进行选项。

到目前为止,我能够放置所有静态IP并能够执行一个命令

 ssh_to_server () {
        remote_output=$(ssh -t root@10.25.55.10 << "EOF"
            # looking for command to capture output of input entry 1 and proceed further like
           command_output=$(/tmp/user/script $1) # this is not working. getting file or directory not found.
            ssh -t user@10.50.10.76 << "EOF1"
                clientprogram <<-"EOF2"
                  loop;then
                    command1  # based on "option"
                     command2  # checking if the delete or create operation is success.
                  end loop
                  /exit . # exit from the client program
                EOF2
            EOF1
    EOF)
    }
ssh_to_server "input" "option"

在上述代码中示例IPS。

我能够在客户端程序中执行命令并捕获输出,但是我需要的是:

  1. 在第一个SSH服务器中捕获命令的IP输出,并将其动态传递到第二SSH服务器。
    1. 将选项从用户到客户端程序或第二个服务器创建或删除文件。

注意:第二个SSH服务器不允许其他任何IP的SSH,除了第一服务器。因此,SSH隧道和其他隧道无法正常工作。如果有更好的方法可以使用其他脚本语言(Python,Perl(或Java(我可以创建一个JAR(。

有两个独立的传输

这样做的简单方法是两个单独的步骤,如:

printf -v args_q '%q ' "$@"  # store our script's arguments in a string
host2_ip=$(ssh host1 get_host2_ip)
ssh -o"ProxyJump host1" "$host2_ip" "bash -s $args_q" <<'EOF'
  ...inner command for host2 goes here...
EOF

由于-o"ProxyJump host1",与host2_ip的连接是由host1组成的;但是,host2_ip返回到首先运行脚本的系统。


有一次运输

如果您需要更多的性能,那就是ControlSocket功能进来的时候。

printf -v args_q '%q ' "$@"  # store our script's arguments in a string
ssh_common_args=( -o"ControlMaster=yes" -o"ControlPath $HOME/.ssh/socket-%r@%h:%p" )
host2_ip=$(ssh "${ssh_common_args[@]}" host1 get_host2_ip)
ssh "${ssh_common_args[@]}" -o"ProxyJump host1" "$host2_ip" "bash -s $args_q" <<'EOF'
  ...inner command for host2 goes here...
EOF

以这种方式,host1上的两个通道调用都使用相同的连接 - 用于检索host2 ip地址的第一个连接,而第二个连接用于运行您的实际远程命令。<<<<<<<<<<<<<<

相关内容

  • 没有找到相关文章

最新更新