我是在创造一个bash脚本,将登录到远程计算机,并创建私钥和公钥的过程。
我的问题是远程计算机不是很可靠,他们并不总是起来。 我需要一个bash脚本,如果SSH连接到了那会检查。 其实之前创造未来使用的密钥。
我是在创造一个bash脚本,将登录到远程计算机,并创建私钥和公钥的过程。
我的问题是远程计算机不是很可靠,他们并不总是起来。 我需要一个bash脚本,如果SSH连接到了那会检查。 其实之前创造未来使用的密钥。
你可以用返回值SSH给你检查:
$ ssh -q user@downhost exit
$ echo $?
255
$ ssh -q user@uphost exit
$ echo $?
0
编辑:另一种方法是使用的nmap(你不需要有键或登录-东西):
$ a=`nmap uphost -PN -p ssh | grep open`
$ b=`nmap downhost -PN -p ssh | grep open`
$ echo $a
22/tcp open ssh
$ echo $b
(empty string)
但你必须到grep消息(NMAP不使用返回值显示,如果一个端口过滤,关闭或打开)。
EDIT2:
如果你有兴趣的SSH端口的实际状态,您也可以替换grep open
与egrep 'open|closed|filtered'
:
$ nmap host -PN -p ssh | egrep 'open|closed|filtered'
只要是完整的。
ssh -q -o "BatchMode=yes" -i /home/sicmapp/.ssh/id_rsa <ID>@<Servername>.<domain> "echo 2>&1" && echo $host SSH_OK || echo $host SSH_NOK
您可以使用这样的事情
$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)
这将输出“OK”,如果SSH连接就可以了
补充的响应@Adrià Cidre
你可以这样做:
status=$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)
if [[ $status == ok ]] ; then
echo auth ok, do something
elif [[ $status == "Permission denied"* ]] ; then
echo no_auth
else
echo other_error
fi
尝试:
echo quit | telnet IP 22 2>/dev/null | grep Connected
万一有人只希望检查端口22是在远程计算机上打开时,这个简单的netcat的命令非常有用。 我用它,因为NMAP和telnet是不适用于我。 此外,我的ssh配置使用键盘密码身份验证。
它是由GUESSWHOz提出的解决方案的一个变种。
nc -q 0 -w 1 "${remote_ip}" 22 < /dev/null &> /dev/null && echo "Port is reachable" || echo "Port is unreachable"
如果您想查询一个远程文件夹存在,或任何其他文件测试真正做到:
if [ -n "$(ssh "${user}@${server}" [ -d "$folder" ] && echo 1; exit)" ]; then
# exists
else
# doesn't exist
fi
不要忘记引号"$(ssh ...)"
。
要连接到具有多个接口的服务器
ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.61;[ $? = 1 ] || ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.51
例如使用bash脚本4+:
# -- ip/host and res which is result of nmap (note must have nmap installed)
ip="192.168.0.1"
res=$(nmap ${ip} -PN -p ssh | grep open)
# -- if result contains open, we can reach ssh else assume failure) --
if [[ "${res}" =~ "open" ]] ;then
echo "It's Open! Let's SSH to it.."
else
echo "The host ${ip} is not accessible!"
fi
我觉得你是想在这里解决错误的问题。 你不应该试图使SSH守护程序更加稳定? 试运行像monit的 ,这将检查是否守护进程正在运行,并重新启动它,如果它不(给你时间去寻找背后sshd的根本问题上,你关机)。 或者是网络服务的麻烦? 试着看一下man ifup
。 难道整个该死的东西只是想关闭你吗? 嗯,这是一个更大的问题...尝试看你的日志(开始的syslog)发现,被关闭的Boxen有向下硬件故障或服务(可能是温度监控器?)。
使你的脚本容错是伟大的,但你也可能想使你的Boxen有容错。