Continue 语句无法正常工作 - bash

Continue 语句无法正常工作 - bash

就上下文而言,我有一个使用 ssh 的多台机器的基础设施。由于每台机器上都有 authorized_keys 文件,我们无需密码即可通过 ssh 以 root 身份连接到机器。我们定期在基础设施中添加新机器。

问题在于创建一个脚本:

  1. 对所有机器执行 ping 操作(通过解析包含所有机器名称的文件)
  2. 如果 ping 成功,则测试无密码的 ssh 连接(使用命令ssh -o BatchMode=yes $machine uname -a
  3. 如果 ssh 不起作用并且这是由于此消息引起的:(Are you sure you want to continue connecting (yes/no)?例如,因为这是与此机器的第一次 ssh 连接),则使用 expect 脚本发送“yes”
  4. 如果 ssh 不起作用并且因为要求输入密码,则使用预期脚本发送“CTRL + C”

我的问题是,情况 3. 和 4. 都可能发生在一台机器上,我不知道如何在脚本中使用 continue 语句。

这种特定情况是,机器先要求输入“是”,然后又要求输入密码。

脚本如下:

for machine in `cat ${liste} | grep -v \#`
do

ping -c1 ${machine} 2>&1 >/dev/null

if [ $? -eq 0 ]
then
    echo ${machine} >> ${pingok}    
    ssh -o BatchMode=yes ${machine} uname -a &> $verifssh 2>&1    
    echo $? > ${exitcode}
    
    if grep -q "255" "$exitcode"
    then        
        cut -c 15-74 $verifssh > $verifssh2
                
        if grep "ication failed." "$verifssh2"        
        then                
            expect ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null
            
            continue 3 
                        
        elif grep "Permission denied (publickey,password,keyboard-interactive)." "$verifssh2"        
        then        
            expect ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null            
            echo "${machine}   ->  The machine asks for a password" >> "${sshnok}"           
        fi
                
    elif grep -q "0" "$exitcode"   
    then   
        echo "${machine} works with ssh"
        echo "${machine}" >> ${sshok}               
    fi
    
else
    echo "${machine}" >> "${pingnok}"     
fi

done

这是预期脚本(它处理两种情况):

set machine [lindex $argv 0]

spawn ssh $machine

expect {
    "Are you sure you want to continue connecting (yes/no)? "  {send "yes\r";exp_continue}
    -exact "Password: " {close}
    -re $prompt {send "exit\r";close}
}

简而言之,我的问题是,对于要求回答“是”然后需要密码的机器,我想将它们注册到文件中,${sshnok}continue不起作用。我试过了continue/ continue 2/ continue 3,它仍然不想回到上一个循环。

答案1

正如评论中所建议的,我确实删除了continue并且而不是多个elif我只是做了更多的if陈述:

用于机器cat ${liste} | grep -v \#

do

echo "."

ping -c1 ${machine} 2>&1 >/dev/null


if [ $? -eq 0 ]

then

    
    echo ${machine} >> ${pingok}
    
    ssh -o BatchMode=yes ${machine} uname -a &> $verifssh 2>&1 
    
    echo $? > ${exitcode}
    
    
    if grep -q "255" "$exitcode"
    
    then
    
    
        cut -c 15-74 $verifssh > $verifssh2
        
        
        if grep "ication failed." "$verifssh2"
        
        then 
        
        
            expect ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null
            

        fi
        
        
        ssh -o BatchMode=yes ${machine} uname -a &> $verifssh 2>&1
        
        cut -c 15-74 $verifssh > $verifssh2
        
        
        if grep "Permission denied (publickey,password,keyboard-interactive)." "$verifssh2"
        
        then
        
        
            expect ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null
            
            echo "${machine}   ->  Probleme de cle ssh (demande un mdp)" >> "${sshnok}"
            
            
        fi
        
        
        ssh -o BatchMode=yes ${machine} uname -a &> $verifssh 2>&1
        
        echo $? > ${exitcode}
        
        
        if grep -q "0" "$exitcode"
        
        then
        
        
            echo "${machine}" >> ${sshok}
            
            
        fi
        
        
    elif grep -q "0" "$exitcode"
    
    then
    
    
        echo "${machine}" >> ${sshok}
        
        
    elif grep -q "1" "$exitcode"
    then
    
    
        echo "wtf 1"
        
        
    fi
    
    
else


    echo "${machine}" >> "${pingnok}"
    
    
fi


done

非常感谢您所有的回答!

相关内容