2013-04-03 176 views
9

我有一个这样的程序:如何使SSH命令执行超时

ssh -q [email protected] exit 
echo "output value -->$?" 

在上面的代码,我想SSH到远程服务器,并尝试检查,如果我可以连接或不。 我有几个服务器,这是密码少激活和少数服务器的密码仍未停用。 所以我担心,如果有密码,它会卡住在同一个屏幕上询问密码,并且它会在无限期的时间内出现,无需退出逻辑。

问题:如何为上述代码实现定时器,以及它是否保持在同一屏幕上询问密码。并与一些错误代码

2)当我执行上面的代码中,我得到以下错误代码退出:

127 -- > I guess its for success 
225 -- > for any error. 

是否有任何其他错误代码除上述以外的?

+0

http://www.eldos.com/documentation/sbb/documentation/ref_err_ssherrorcodes.html,找到一个链接, – gmhk

+0

如果没有提供密码并且没有设置基于密钥的身份验证,请勿发生爆炸。 使用预期脚本。 (在google/stackoverflow上搜索ssh + expect,查看模板脚本) – anishsane

+4

使用-o PasswordAuthentication = no – Vorsprung

回答

14

您可以使用timeout命令将呼叫打包为ssh。如果发生超时,则timeout命令以代码124退出。

timeout 10s ssh -q [email protected] exit 
if [ $? -eq 124 ]; then 
    echo "Timeout out" 
fi 

或者,如Vorsprung曾这样评价您的问题(因为我是仰视的男人页!):

ssh -oPasswordAuthentication=no -q [email protected] exit 

将不允许交互式密码验证。然后您必须检查退出代码。

+0

ssh -oPasswordAuthentication = no -q [email protected]。238退出 - >此工作 – gmhk

+0

@gmhk - 不要忘了点击对号最有帮助的答案。 – ghoti

2

听起来好像问题是一次询问对多个主机的“批处理模式”处理(例如,在一个循环中)。如果PKA为而非配置为给定主机(公钥认证 - “无密码”登录提到原始问题),则以下ssh命令将简单失败,因此它对于您只想继续运行的脚本无论连接到一台或两台主机的问题如何。它也不会打扰所有关于“您确定要继续连接”到以前未知的主机的所有疑问(或者您可以将StrictHostKeyChecking no添加到您的~/.ssh/config中)。例如,

for host in host1 host2 host3 # etc 
do 
    ssh -o BatchMode=yes -o StrictHostKeyChecking=no -o ConnectTimeout=5 \ 
     [email protected]$host 'uptime' || echo "problem: host=$host" 
done 

你必须检查你的(客户端)ssh手册页,看看这些选项(BatchModeConnectTimeout)的支持,虽然。