bash หนึ่งซับในขณะที่วนรอบเพื่อ ssh เป็น IP ภายในหรือ IP ภายนอก


0

ฉันต้องการที่จะวนรอบบนหน้าจอเทอร์มินัลของฉันที่พยายาม ssh เข้าไปในเซิร์ฟเวอร์ของฉันทุกวินาที ในขณะนี้ดูเหมือนว่านี้:

while true; do echo INTERNALIP && date >> $HOME/server.log &&\
    ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 user@192.168.1.10;\
     date;\
sleep 1; done

ฉันมี bash whileloop คล้ายกันสำหรับ sshing ในเครื่องเดียวกัน แต่ใช้ IP ภายนอกซึ่งเป็นวิธีที่ฉันเชื่อมต่อเมื่อฉันไม่ได้อยู่ในเครือข่ายสำนักงาน:

while true; do echo EXTERNALIP && date >> $HOME/server.log &&\
    ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 user@NN.NNN.NN.NNN;\
     date;\
sleep 1; done

สิ่งที่ฉันต้องการจะทำคือการรวมทั้งสองอย่างนี้เข้าด้วยกันเป็นสายการบินเดียวที่ (1) พยายามเชื่อมต่อผ่าน INTERNALIP ก่อนและหากล้มเหลวให้ลองเชื่อมต่อผ่าน EXTERNALIP ฉันไม่คุ้นเคยกับเงื่อนไขในการทุบตีดังนั้นฉันไม่แน่ใจว่าจะทำอย่างไร

ความคิดใด ๆ

คำตอบ:


0

ทำไมไม่ใช้เพียงบรรทัดต่อไปนี้ภายในวงของคุณ:

ssh user@192.168.1.10 || ssh user@NN.NNN.NN.NNN

วิธีที่ฉันเข้าใจสิ่งนี้เฉพาะเมื่อ ssh ถึง 192.168.1.10 ล้มเหลวดังนั้น ssh ที่สองจะถูกเรียกใช้ นั่นคือสิ่งที่คุณต้องการหรือไม่

ฉันออกจากรายละเอียดอื่น ๆ ทั้งหมดของตัวเลือก ssh บันทึก ฯลฯ

ดียิ่งขึ้นอาจจะเป็นเช่นนี้:

( ssh user@192.168.1.10 && echo INTERNALIP ) || ( ssh user@NN.NNN.NN.NNN && echo EXTERNALIP )

นี้ควรดูแลบันทึกเช่นกัน & เป็นหนึ่งซับ (ไม่มีโอกาสที่จะทดสอบในตอนนี้ดังนั้นโปรดเตือน)


0

สมมติว่าสคริปต์ของคุณทำสิ่งที่คุณต้องการอย่างแน่นอนฉันจะเรียกใช้สิ่งนี้:

while true; do echo INTERNALIP && date >> $HOME/server.log && \
    if [ "`find .external.pid -mtime 1 | egrep '.*'`" == "" ]; then \
        ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 user@192.168.1.10; \
        if [ $? == 255 ]; then touch -d "-1 day" .external.pid; fi; \
    else ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 user@NN.NNNN.NN.NNN; \
        if [ $? == 255 ]; then rm .external.pid; fi; \
    fi; \
    date; \
sleep 1; done

นี่ใช้. ภายนอก. pid เพื่อติดตามเซิร์ฟเวอร์ที่ควรใช้

PS: คุณอาจจะใช้สิ่งนี้แทน:

while true; do echo INTERNALIP && date >> $HOME/server.log && \
    if [ "`find .external.pid -atime +1s | egrep '.*'`" == "" ]; then \
        ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 -o user@192.168.1.10 'date'; \
        if [ $? == 255 ]; then touch .external.pid; fi; \
    else ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 user@NN.NNNN.NN.NNN 'date'; \
        if [ $? == 255 ]; then rm .external.pid; fi; \
    fi; \
sleep 1; done

ใน Linux ฉันได้รับข้อผิดพลาดนี้find: unknown predicate '-x'
719016

1
ฉันอัปเดตโค้ดแล้วนำ "-x" ออก: มันไม่มีผลต่อผลลัพธ์สุดท้าย
David

atime นั้นแตกต่างกันใน Linux มากกว่า macosx
719016
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.