我需要在
内运行一些命令ssh->ssh->clientprogram->loop command
这是我执行命令的要求。
- 将输入参数发送到第一个SSH服务器,捕获该命令的输出(这是bash脚本在同一路径中的其他脚本上相互依赖,并且在$ PATH变量中可用。我确实使用了echo $ path检查(
- 提供 ip 的step1命令输出到第二ssh命令。
- 循环在n时和循环内部,启用客户端和执行系列命令并捕获命令的输出,并从第二个命令验证输出(例如:一系列命令为:rm file; ls--> check该文件是否存在,然后重复进行直到n迭代(
- 应该根据选择执行步骤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。
我能够在客户端程序中执行命令并捕获输出,但是我需要的是:
- 在第一个SSH服务器中捕获命令的IP输出,并将其动态传递到第二SSH服务器。
- 将选项从用户到客户端程序或第二个服务器创建或删除文件。
注意:第二个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地址的第一个连接,而第二个连接用于运行您的实际远程命令。<<<<<<<<<<<<<<