BASH - 登录到服务器,然后登录另一台服务器

时间:2016-10-18 18:43:29

标签: bash ssh eof

我正在编写一个脚本来登录网关服务器,从网关服务器到只能通过网关访问的节点

我的脚本如下:

{{1}}

所以最终发生的事情是我登录到GATEWAY,并运行一些命令。 然后,当我将函数“cool”调用ssh到节点时,它会这样做,但随后开始从启动画面读取消息并执行不正确的命令。 我希望它在函数cool中执行“ls -l”!

哦,摆脱闪屏不是一个选择!

2 个答案:

答案 0 :(得分:0)

如何在SSH中进行代理

我假设您设置了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