Puncte:0

Declarația Continue nu funcționează așa cum ar trebui - bash

drapel cn

Pentru context, am o infrastructură de mai multe mașini care folosesc ssh. Ne conectăm prin ssh ca root pe mașini fără parolă, mulțumim fișierului authorized_keys de pe fiecare mașină. Adăugăm în mod regulat noi mașini în infrastructura noastră.

Problema este de a crea un script care:

  1. Face ping la toată mașina (prin analizarea unui fișier care conține toate numele mașinii noastre)
  2. Dacă ping-ul are succes, testați conexiunea ssh fără parolă (cu comanda ssh -o BatchMode=da $mașină uname -a )
  3. Dacă ssh-ul nu funcționează ȘI este din cauza acestui mesaj: Sigur doriți să continuați conectarea (da/nu)? (pentru că este prima conexiune ssh la această mașină, de exemplu), apoi cu un script expect, trimiteți „da”
  4. Dacă ssh nu funcționează ȘI pentru că este cerută o parolă, atunci cu un script expect, trimiteți „CTRL + C”

Problema mea este că cele două condiții 3. și 4. se pot întâmpla ambele unei mașini și nu îmi pot da seama cum să folosesc instrucțiunea continue în scriptul meu.

Acest caz specific ar fi pentru o mașină care cere un „da”, dar după aceea cere și parola.

Iată cum arată scriptul:

pentru mașină în `cat ${liste} | grep -v \#`
do

ping -c1 ${mașină} 2>&1 >/dev/null

dacă [ $? -eq 0]
atunci
    echo ${mașină} >> ${pingok}    
    ssh -o BatchMode=da ${mașină} uname -a &> $verifssh 2>&1    
    eco $? > ${exitcode}
    
    dacă grep -q „255” „$exitcode”
    atunci        
        cut -c 15-74 $verifssh > $verifssh2
                
        if grep "ication a failed." „$verifssh2”        
        atunci                
            așteptați ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null
            
            continua 3 
                        
        elif grep „Permisiune refuzată (cheie publică, parolă, tastatură interactivă).” „$verifssh2”        
        atunci        
            așteptați ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null            
            echo „${machine} -> Aparatul cere o parolă” >> „${sshnok}”           
        fi
                
    elif grep -q "0" "$exitcode"   
    atunci   
        echo „${machine} funcționează cu ssh”
        ecou „${mașină}” >> ${sshok}               
    fi
    
altfel
    echo „${machine}” >> „${pingnok}”     
fi

Terminat

Iată scriptul aștept (se ocupă de ambele situații):

setați mașina [lindex $argv 0]

spawn ssh $mașină

așteaptă {
    „Sunteți sigur că doriți să continuați conectarea (da/nu)?” {trimiteți „da\r”;exp_continue}
    -exact „Parola:” {închidere}
    -re $prompt {trimite „ieșire\r”;închide}
}

Deci, pe scurt, problema mea este că pentru mașina care cere un răspuns „da” și apoi au nevoie de o parolă, vreau să le înregistrez în ${sshnok} dosarul dar continua nu merge. am incercat continua / continua 2 / continua 3 și tot nu vrea să se întoarcă în bucla anterioară.

Archemar avatar
drapel mx
Nu sunt sigur la ce vă așteptați (fără joc de cuvinte), `continue` va ieși dintr-o buclă (în acest caz, poate ieși numai din `for machine în ... `)
drapel cn
Vă mulțumesc pentru răspunsul dvs., am înțeles greșit cum să folosesc Continuare, există vreo modalitate prin care aș putea spune scriptului să refac bucla de la prima sau a doua, dacă?
drapel fo
[Răspunsul pe care l-ați primit la stackoverflow ieri](https://stackoverflow.com/q/71658273/7552) nu a răspuns la această întrebare?
Archemar avatar
drapel mx
aruncați `continue` și înlocuiți următorul `elif` cu `fi if`?
Puncte:0
drapel cn

După cum s-a sugerat într-un comentariu, am renunțat la continua și în loc de multiple elif doar am mai facut ceva dacă afirmatii:

pentru mașină în pisica ${liste} | grep -v \#

do

ecou "."

ping -c1 ${mașină} 2>&1 >/dev/null


dacă [ $? -eq 0]

atunci

    
    echo ${mașină} >> ${pingok}
    
    ssh -o BatchMode=da ${mașină} uname -a &> $verifssh 2>&1 
    
    eco $? > ${exitcode}
    
    
    dacă grep -q „255” „$exitcode”
    
    atunci
    
    
        cut -c 15-74 $verifssh > $verifssh2
        
        
        if grep "ication a failed." „$verifssh2”
        
        atunci 
        
        
            așteptați ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null
            

        fi
        
        
        ssh -o BatchMode=da ${mașină} uname -a &> $verifssh 2>&1
        
        cut -c 15-74 $verifssh > $verifssh2
        
        
        if grep „Permisiune refuzată (cheie publică, parolă, tastatură interactivă).” „$verifssh2”
        
        atunci
        
        
            așteptați ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null
            
            echo "${machine} -> Probleme de cle ssh (demand un mdp)" >> "${sshnok}"
            
            
        fi
        
        
        ssh -o BatchMode=da ${mașină} uname -a &> $verifssh 2>&1
        
        eco $? > ${exitcode}
        
        
        dacă grep -q "0" "$exitcode"
        
        atunci
        
        
            ecou „${mașină}” >> ${sshok}
            
            
        fi
        
        
    elif grep -q "0" "$exitcode"
    
    atunci
    
    
        ecou „${mașină}” >> ${sshok}
        
        
    elif grep -q "1" "$exitcode"
    atunci
    
    
        ecou „wtf 1”
        
        
    fi
    
    
altfel


    echo „${machine}” >> „${pingnok}”
    
    
fi


Terminat

Va multumesc mult pentru toate raspunsurile!

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.