bash 脚本中的 ssh“端口 22:没有到主机的路由”错误

Posted

技术标签:

【中文标题】bash 脚本中的 ssh“端口 22:没有到主机的路由”错误【英文标题】:ssh "port 22: no route to host" error in bash script 【发布时间】:2015-09-29 06:04:04 【问题描述】:

我写了一个 scipt 来执行一些与 apachestorm 相关的 ssh 远程命令。当我执行脚本时它说:

ssh: connect to host XXX.XXX.XXX.XXX port 22: No route to host
ssh: connect to host XXX.XXX.XXX.XXX port 22: No route to host
ssh: connect to host XXX.XXX.XXX.XXX port 22: No route to host
ssh: connect to host XXX.XXX.XXX.XXX port 22: Connection refused

如果我手动执行命令,它运行良好,我可以 ping 机器。所以这段代码肯定有问题:

while [ $i -le $numVM ]

do
    if [ $i -eq 1 ];then
        ssh -i file root@IP1 './zookeeper-3.4.6/bin/zkServer.sh start' 
    else
        ssh -i file root@IP2 'sed -i '"'"'s/#\ storm.zookeeper.servers.*/storm.zookeeper.servers:/'"'"' /root/apache-storm-0.9.3/conf/storm.yaml'
        ssh -i file root@IP2 'sed -i '"'"'0,/^#[[:space:]]*-[[:space:]]*\"server1\".*/s//"      - \"'$IParray[1]'\""/'"'"' /root/apache-storm-0.9.3/conf/storm.yaml'
        ssh -i file root@IP2 'sed -i '"'"'s/#\ nimbus.host:.*/"nimbus.host: \"'$IParray[2]'\""/'"'"' /root/apache-storm-0.9.3/conf/storm.yaml'
        ssh -i file root@IP2 './zookeeper-3.4.6/bin/zkCli.sh -server $IParray[1] &'
        sleep 10
        ssh -i file root@IP2 './apache-storm-0.9.3/bin/storm nimbus &' &
        sleep 10
        ssh -i file root@IP2 './apache-storm-0.9.3/bin/storm ui &' & 
        sleep 10
        ssh -i file root@IP2 './apache-storm-0.9.3/bin/storm supervisor &' &
    fi  
    ((i++))
done

我正在从同一映像部署的 2 个虚拟机上启动多个进程,因此它们通常是相同的。令人困惑的是,第一个 ssh 命令(zkServer.sh start)运行良好,但如果我的脚本尝试执行三个“sed”-ssh-commands,我会收到上面的错误消息。但是最后四个 ssh 命令再次运行良好。这对我来说没有任何意义......

【问题讨论】:

尝试在执行命令之前打印出命令,或者使用set -x 让 bash 向您展示它在每一步都在做什么。也许其中一个变量没有按照您期望的方式扩展?我看到在某些行中你有$IP2 而其他你只有IP2 也许这就是问题所在? 不,实际上它是一个数组 ($IParray[$i]) 我使用 IP1 和 IP2 使其更简短,对其他人来说更清晰。但我会尝试 set -x 并详细检查脚本的作用。感谢您的回答 好的,我查过了。该命令的 bash 输出似乎很好,在执行后再次显示“没有到主机的路由”。我复制了命令并手动执行它,它可以工作。这怎么可能? 您的阵列中是否有一些不可打印的字符,例如 IP2 末尾的 \r 而 IP1 不存在? 不,在这种情况下,当我复制由于“set -x”而显示的命令时,我认为它也不应该成功。但它确实使命令在一般情况下是正确的? 【参考方案1】:

我能想到的几点:

大多数sshd 守护进程不允许root 访问。哎呀,许多版本的 Unix/Linux 不再允许 root 登录。如果需要root权限,需要使用sudo。 远程机器上的sshd 守护进程没有运行。尽管很少见,但某些网站可能从未设置过它,或者出于安全问题而故意将其关闭。 您的ssh 命令本身不正确。

不要在 shell 脚本中执行 ssh 命令,而是修改 shell 脚本以打印出您尝试执行的内容。然后,看看你是否可以在 shell 脚本的 outside 执行命令。这样您就可以确定问题出在 shell 脚本上,还是出在 ssh 命令本身上。

如果您的ssh 命令在命令行外部 不起作用,您可以简化它们,看看您是否可以确定问题所在。你有ssh -i file root@IP2。这应该是ssh -i $file root@$IP2 吗? (即,您缺少领先的印记)。

$ ssh -i file root@$IP2 ls   # Can't get simpler than this...
$ ssh -i file root@IPS       # See if you can remotely log on...
$ ssh root@IP2               # Try it without an 'identity file'
$ ssh bob@IP2                # Try it as a user other than 'root'
$ telnet IP2 22              # Is port 22 even open on the remote machine?

如果这些都不起作用,那么您在设置远程计算机的sshd 命令时遇到了一些非常基本的问题。

【讨论】:

感谢您的意见。我想直接把我的意见告诉他们。我正在使用“root”运行许多 ssh 命令,正如我在问题中提到的那样,即使在这个脚本中也有 ssh 命令与 root 一起使用。从我的角度来看,如果 sshd 守护进程没有运行,这是不可能的。再次明确地说,only sed 命令不起作用。最后一点,我还要说事实并非如此。因为正如我在评论中提到的,如果我从 shell 脚本中执行完全相同的命令,它就可以工作。 Telnet 工作正常... 这只是 sed?为什么不使用ssh -i file root@IP2 "sed -i 's/#\ sto.../' /root/apache-storm-0.9.3/conf/storm.yaml"。也就是说,用双引号而不是单引号将您的 ssh 命令括起来。然后单引号将在您的 sed 命令中起作用,而无需将它们与其他引号 quote 一起使用。你也可以试试\' 而不是'"'"' 我尝试了双倍配额,仍然没有主机路由。但我发现了一些奇怪的东西。如果我将 sed-commands 复制到另一个脚本中,它可以工作。所以我会说命令是正确的,执行脚本可能有问题吗?当我关闭 2 个虚拟机时,我得到 远程主机关闭到 XXX.XXX.XXX.XXX 的连接。 即使我现在不在机器上。这可能与错误有关吗? 你是如何自动启动脚本的?如果使用 cron(1) / cronie(1) 和朋友,请记住运行时环境不会自动运行任何 shell 启动脚本。此外,从 cron(1) 开始,不会连接 stdin/pty 输入。

以上是关于bash 脚本中的 ssh“端口 22:没有到主机的路由”错误的主要内容,如果未能解决你的问题,请参考以下文章

bash脚本中的ssh退出循环[重复]

在SSH中使用bash脚本时,为Git输入私钥密码

如何创建一个 bash 脚本来检查 SSH 连接?

如何从 bash 脚本中 ssh?

在 Bash 脚本中使用 Expect 为 SSH 命令提供密码

在 CentOS 上使用 bash 脚本更改 SSH 端口