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

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

问题描述:

我写了一个scipt来执行一些关于apache风暴的ssh远程命令。当我执行脚本它说:ssh“端口22:没有路由到主机”在bash脚本中的错误

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 [email protected] './zookeeper-3.4.6/bin/zkServer.sh start' 
    else 
     ssh -i file [email protected] 'sed -i '"'"'s/#\ storm.zookeeper.servers.*/storm.zookeeper.servers:/'"'"' /root/apache-storm-0.9.3/conf/storm.yaml' 
     ssh -i file [email protected] 'sed -i '"'"'0,/^#[[:space:]]*-[[:space:]]*\"server1\".*/s//"  - \"'${IParray[1]}'\""/'"'"' /root/apache-storm-0.9.3/conf/storm.yaml' 
     ssh -i file [email protected] 'sed -i '"'"'s/#\ nimbus.host:.*/"nimbus.host: \"'${IParray[2]}'\""/'"'"' /root/apache-storm-0.9.3/conf/storm.yaml' 
     ssh -i file [email protected] './zookeeper-3.4.6/bin/zkCli.sh -server ${IParray[1]} &' 
     sleep 10 
     ssh -i file [email protected] './apache-storm-0.9.3/bin/storm nimbus &' & 
     sleep 10 
     ssh -i file [email protected] './apache-storm-0.9.3/bin/storm ui &' & 
     sleep 10 
     ssh -i file [email protected] './apache-storm-0.9.3/bin/storm supervisor &' & 
    fi 
    ((i++)) 
done 

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

+4

尝试执行,或使用'设置-x'有bash的告诉你什么是它做的每一步之前打印出命令。也许其中一个变数不会扩大你的期望?我发现在某些行中有'$ IP2',而其他的只有'IP2',这可能是问题所在? –

+0

实际上它不是一个数组($ {IParray [$ i]})我使用IP1和IP2使其更简洁,更清晰。但是我会尝试设置-x并检查脚本详细描述的内容。感谢您的回答 – Brave

+0

好的,我检查了它。命令的bash输出看起来很好,在执行之后再次显示“没有路由到主机”。我复制了命令并手动执行它并且它可以工作。这怎么可能呢? – Brave

几件事情我能想到的:

  • 大多数sshd守护进程不会允许root访问。嘿,许多版本的Unix/Linux不再允许root登录。如果您需要root访问权限,则需要使用sudo
  • 远程计算机上的sshd守护程序未运行。虽然很少,但有些网站可能永远不会设置它,或有意将其作为安全问题关闭。
  • 您的ssh命令本身不正确。

而不是在您的shell脚本中执行ssh命令,修改shell脚本只是为了打印出您正在尝试执行的内容。然后,查看您是否可以执行shell脚本的以外的命令。通过这种方式,您可以确定问题是否是shell脚本,或者问题与ssh命令本身有关。

如果您的ssh命令在命令行中不起作用以外,您可以简化它们并查看是否可以确定问题所在。你有ssh -i file [email protected]。这是否假设为ssh -i $file [email protected]$IP2? (即,你错过了领先的签名)。

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

如果这些不工作,那么你有你的远程机器的sshd命令设置了一些很基本的问题。

+0

感谢您的想法。我想直接告诉你我的看法。我使用“root”运行许多ssh命令,正如我在我的问题中提到的那样,即使在此脚本中也有ssh命令与root一起工作。从我的角度来看,如果sshd守护进程没有运行,那将是不可能的。再一次要真正说清楚,只有** _sed_命令不起作用。至于你的最后一点,我也会说并非如此。因为正如我在评论中提到的那样,如果我从shell脚本中执行完全相同的命令,它将起作用。 Telnet工作正常...... – Brave

+0

这只是sed?为什么不使用'ssh -i文件root @ IP2“sed -i's /#\ sto ... /'/root/apache-storm-0.9.3/conf/storm.yaml”'。也就是说,用双引号括住你的'ssh'命令而不是单引号。然后,单引号可以在你的'sed'命令中工作,而不必用其他引号引用它们。你也可以尝试使用'\''而不是''''“''。 –

+0

我用双配额试过了,仍然没有路由到主机。但我想出了一些奇怪的东西。如果我将sed-commands复制到另一个脚本中,它就可以工作。所以我会说这些命令是正确的,执行脚本可能有什么问题吗?当我关闭2台虚拟机时,即使我现在不在机器上,我也会得到_Connection to XXX.XXX.XXX.XXX被远程主机关闭。这可能是以任何方式与错误有关吗? – Brave

然后在这里发布解决方案,请查看此链接。

click here to solution