Score:0

คำสั่งดำเนินการต่อไม่ทำงานเท่าที่ควร - ทุบตี

ธง cn

สำหรับบริบท ฉันมีโครงสร้างพื้นฐานของเครื่องหลายเครื่องที่ใช้ ssh เราเชื่อมต่อผ่าน ssh ในฐานะรูทบนเครื่องโดยไม่ต้องใช้รหัสผ่าน ขอบคุณไฟล์ที่ได้รับอนุญาตในแต่ละเครื่อง เรากำลังเพิ่มเครื่องจักรใหม่อย่างสม่ำเสมอในโครงสร้างพื้นฐานของเรา

ปัญหาคือการสร้างสคริปต์ที่:

  1. ปิงเครื่องทั้งหมด (โดยการแยกวิเคราะห์ผ่านไฟล์ที่มีชื่อเครื่องของเราทั้งหมด)
  2. หากการ ping สำเร็จ ให้ทดสอบการเชื่อมต่อ ssh โดยไม่ต้องใช้รหัสผ่าน (ด้วยคำสั่ง ssh -o BatchMode=ใช่ $machine uname -a )
  3. หาก ssh ไม่ทำงานและเป็นเพราะข้อความนี้: คุณแน่ใจหรือไม่ว่าต้องการเชื่อมต่อต่อ (ใช่/ไม่ใช่) (เนื่องจากเป็นการเชื่อมต่อ ssh ครั้งแรกกับเครื่องนี้) จากนั้นด้วยสคริปต์คาดหวัง ให้ส่ง "ใช่"
  4. หาก ssh ไม่ทำงานและเป็นเพราะมีการถามรหัสผ่าน ให้ส่ง "CTRL + C" ด้วยสคริปต์ที่คาดไว้

ปัญหาของฉันคือทั้งสองเงื่อนไข 3. และ 4. สามารถเกิดขึ้นได้กับเครื่องเดียวและฉันไม่สามารถหาวิธีใช้คำสั่งดำเนินการต่อในสคริปต์ของฉันได้

กรณีนี้เฉพาะสำหรับเครื่องที่ขอ "ใช่" แต่หลังจากนั้นขอรหัสผ่านด้วย

นี่คือลักษณะของสคริปต์:

สำหรับเครื่องใน `cat ${liste} | grep -v \#`
ทำ

ping -c1 ${เครื่อง} 2>&1 >/dev/null

ถ้า [ $? -eq 0 ]
แล้ว
    echo ${เครื่อง} >> ${pingok}    
    ssh -o BatchMode=ใช่ ${machine} uname -a &> $verifssh 2>&1    
    ก้อง $? > ${exitcode}
    
    ถ้า grep -q "255" "$exitcode"
    แล้ว        
        ตัด -c 15-74 $verifssh > $verifssh2
                
        ถ้า grep "ication ล้มเหลว" "$verifssh2"        
        แล้ว                
            คาดหวัง ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null
            
            ต่อ 3 
                        
        elif grep "การอนุญาตถูกปฏิเสธ (กุญแจสาธารณะ, รหัสผ่าน, แป้นพิมพ์แบบโต้ตอบ)" "$verifssh2"        
        แล้ว        
            คาดหวัง ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null            
            echo "${machine} -> เครื่องถามรหัสผ่าน" >> "${sshnok}"           
        ไฟ
                
    elif grep -q "0" "$exitcode"   
    แล้ว   
        echo "${machine} ใช้งานได้กับ ssh"
        echo "${เครื่อง}" >> ${sshok}               
    ไฟ
    
อื่น
    echo "${เครื่อง}" >> "${pingnok}"     
ไฟ

เสร็จแล้ว

นี่คือสคริปต์คาดหวัง (จัดการทั้งสองสถานการณ์):

ตั้งเครื่อง [lindex $argv 0]

วางไข่ ssh $เครื่อง

คาดหวัง {
    "คุณแน่ใจหรือไม่ว่าต้องการเชื่อมต่อต่อ (ใช่/ไม่ใช่)" {send "yes\r";exp_continue}
    -exact "รหัสผ่าน: " {ปิด}
    -re $prompt {ส่ง "exit\r";close}
}

สรุป ปัญหาของฉันคือ สำหรับเครื่องที่ขอคำตอบว่า "ใช่" แล้วต้องการรหัสผ่าน ฉันต้องการลงทะเบียนใน ${sshnok} ไฟล์แต่ ดำเนินต่อ ไม่ทำงาน ฉันเหนื่อย ดำเนินต่อ / ต่อ 2 / ต่อ 3 และยังไม่อยากย้อนกลับไปในลูปก่อนหน้า

Archemar avatar
mx flag
ไม่แน่ใจว่าคุณคาดหวังอะไร (ไม่มีการเล่นสำนวน) `ดำเนินการต่อ` จะออกจากลูป (ในกรณีนี้ จะสามารถออกจากส่วนกลาง `สำหรับเครื่องใน ... ` เท่านั้น)
cn flag
ขอบคุณสำหรับคำตอบ ฉันเข้าใจผิดว่าจะใช้ต่ออย่างไร มีวิธีใดบ้างที่ฉันสามารถบอกให้สคริปต์ทำลูปซ้ำตั้งแต่ครั้งแรกหรือครั้งที่สอง if ?
fo flag
[คำตอบที่คุณได้รับจาก stackoverflow เมื่อวาน](https://stackoverflow.com/q/71658273/7552) ไม่ตอบคำถามนี้ใช่ไหม
Archemar avatar
mx flag
วาง `continue` และแทนที่ `elif` ตามหลังด้วย `fi if` ?
Score:0
ธง cn

ตามที่แนะนำในความคิดเห็น ฉันได้ละทิ้ง ดำเนินต่อ และแทนที่จะเป็นหลายรายการ เอลฟ์ ฉันเพิ่งทำเพิ่มเติม ถ้า ข้อความ :

สำหรับเครื่องใน แมว ${liste} | grep -v \#

ทำ

เสียงสะท้อน "."

ping -c1 ${เครื่อง} 2>&1 >/dev/null


ถ้า [ $? -eq 0 ]

แล้ว

    
    echo ${เครื่อง} >> ${pingok}
    
    ssh -o BatchMode=ใช่ ${machine} uname -a &> $verifssh 2>&1 
    
    ก้อง $? > ${exitcode}
    
    
    ถ้า grep -q "255" "$exitcode"
    
    แล้ว
    
    
        ตัด -c 15-74 $verifssh > $verifssh2
        
        
        ถ้า grep "ication ล้มเหลว" "$verifssh2"
        
        แล้ว 
        
        
            คาดหวัง ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null
            

        ไฟ
        
        
        ssh -o BatchMode=ใช่ ${machine} uname -a &> $verifssh 2>&1
        
        ตัด -c 15-74 $verifssh > $verifssh2
        
        
        ถ้า grep "การอนุญาตถูกปฏิเสธ (คีย์สาธารณะ รหัสผ่าน คีย์บอร์ดแบบโต้ตอบ)" "$verifssh2"
        
        แล้ว
        
        
            คาดหวัง ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null
            
            echo "${machine} -> ปัญหา de cle ssh (demande un mdp)" >> "${sshnok}"
            
            
        ไฟ
        
        
        ssh -o BatchMode=ใช่ ${machine} uname -a &> $verifssh 2>&1
        
        ก้อง $? > ${exitcode}
        
        
        ถ้า grep -q "0" "$exitcode"
        
        แล้ว
        
        
            echo "${เครื่อง}" >> ${sshok}
            
            
        ไฟ
        
        
    elif grep -q "0" "$exitcode"
    
    แล้ว
    
    
        echo "${เครื่อง}" >> ${sshok}
        
        
    elif grep -q "1" "$exitcode"
    แล้ว
    
    
        เสียงสะท้อน "wtf 1"
        
        
    ไฟ
    
    
อื่น


    echo "${เครื่อง}" >> "${pingnok}"
    
    
ไฟ


เสร็จแล้ว

ขอบคุณมากสำหรับทุกคำตอบ !

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา