我正在编写一个脚本来登录网关服务器,从网关服务器到只能通过网关访问的节点
我的脚本如下:
{{1}}
所以最终发生的事情是我登录到GATEWAY,并运行一些命令。 然后,当我将函数“cool”调用ssh到节点时,它会这样做,但随后开始从启动画面读取消息并执行不正确的命令。 我希望它在函数cool中执行“ls -l”!
哦,摆脱闪屏不是一个选择!
答案 0 :(得分:0)
我假设您设置了pubkey身份验证,因此您无需编写密码。 SSH具有非常好的代理功能,如果您在~/.ssh/config
中创建配置文件,它的效果非常好:
Host SERVER
ProxyCommand ssh -W %h:%p GATEWAY
然后您可以使用单个命令ssh SERVER
连接到服务器。如果您需要执行某些命令,请在ssh SERVER "ls -l"
之后添加它。
您的函数cool
的范围仅限于您的脚本,因此无法在HEREDOC
管道中识别第二个ssh
。如果要在第二个shell中使用函数,则需要在其范围内定义它。
同样将函数调用为$(cool)
会在子进程中运行该函数,这是您不想要的。你想直接调用这个函数。
#!/bin/bash
fool () {
ssh -A GATEWAY << EOF
cool () {
ssh -A SERVER << EOF2
ls -l
EOF2
}
touch foobar
cool
EOF
}
export -f fool
fool
答案 1 :(得分:0)
问题是您通常无法通过ssh
连接导出函数(或任何内容)。如果要在远程主机上运行某个功能,则需要在那里定义它。
#!/bin/bash
fool () {
ssh -A GATEWAY << EOF
touch foobar
cool () {
ssh -A SERVER <<EOF2
ls -l
EOF2
}
cool
EOF
}
fool