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:没有到主机的路由”错误的主要内容,如果未能解决你的问题,请参考以下文章