我正在写一些自动化程序,而且我遇到了一个问题,主机的密钥已经改变,扳手也被扔进了作品中。 我想添加一个飞行前检查这个特定的条件,但我似乎无法让ssh返回超过其全部255返回码。
例如:
$ ssh -o StrictHostKeyChecking=yes foobar@squiffy-host ls; echo $? @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: POSSIBLE DNS SPOOFING DETECTED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...snip... 255
我该如何检测这个, 具体的情况?
build立一点点你的shell snippit,你可以试试这个:
$ ssh -o StrictHostKeyChecking=yes foobar@squiffy-host ls 2>&1 |grep "WARNING: POSSIBLE DNS SPOOFING DETECTED" >/dev/null; echo $? 0
如果grep调用find错误消息,它应该输出0,否则输出1。
在这一点上,我不是非常乐观,有一个完美的答案,所以我已经走了你的build议来parsing错误文本。
## Return codes: # 0: No problem # 1: Host key problem # 2: Unhandled error function testhostkey() { user=$1 hostname=$2 res=$( ( ssh -o StrictHostKeyChecking=yes ${user}@${hostname} exit 1>/dev/null ) 2>&1 ) code=$? if [ $code -eq 0 ]; then return 0 elif [ $code -eq 255 ]; then while read line; do case "$line" in 'WARNING: POSSIBLE DNS SPOOFING DETECTED!') continue ;; 'WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!') continue ;; *) echo "Unhandled SSH error message: $line" >&2 echo "$res" >&2 return 2 ;; esac done < <(echo "$res" | grep '^@\s\+' | sed 's/@\s\+\(.*\)\s\+@/\1/' | sed -e 's/^\s\+//' -e 's/\s\+$//') return 1 else printf "Unhandled return code from SSH: %d\n%s\n" $code "$res" >&2 return 2 fi }
基本上, 如果返回代码是255 并且所有错误消息都在指定集合内, 那么返回代码是1。
所有其他错误消息/代码返回2,没有错误返回0。