La declaración Continuar no funciona como debería - bash

La declaración Continuar no funciona como debería - bash

Para el contexto, tengo una infraestructura de varias máquinas que usan ssh. Nos conectamos vía ssh como root en las máquinas sin contraseña gracias al archivo autorizado_keys en cada máquina. Regularmente agregamos nuevas máquinas a nuestra infraestructura.

El problema es crear un script que:

  1. Hace ping a toda la máquina (al analizar un archivo que contiene todos los nombres de nuestras máquinas)
  2. Si el ping es exitoso, pruebe la conexión ssh sin contraseña (con el comando ssh -o BatchMode=yes $machine uname -a)
  3. Si el ssh no funciona Y se debe a este mensaje: Are you sure you want to continue connecting (yes/no)?(porque es la primera conexión ssh a esta máquina, por ejemplo), entonces con un script de espera, envíe "sí"
  4. Si el ssh no funciona Y es porque se solicita una contraseña, entonces con un script expect, envía "CTRL + C"

Mi problema es que las dos condiciones 3. y 4. pueden sucederle a una máquina y no puedo entender cómo usar la instrucción continuar en mi script.

Este caso específico sería para una máquina que solicita un "sí" pero luego también solicita una contraseña.

Así es como se ve el guión:

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

Aquí está el script esperado (maneja ambas situaciones):

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}
}

En pocas palabras, mi problema es que, para la máquina que solicita una respuesta "sí" y luego necesita una contraseña, quiero registrarla en el ${sshnok}archivo pero continueno funciona. Lo intenté continue// continue 2y continue 3todavía no quiere volver al bucle anterior.

Respuesta1

Como se sugiere en un comentario, dejé el continuey en lugar de varias, elifsimplemente hice algunas ifdeclaraciones más:

para máquina encat ${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

¡Muchas gracias por todas las respuestas!

información relacionada