รีโมต for-loop ผ่าน SSH


12

ฉันมีต่อไปนี้ในสคริปต์

for server in ${servers[@]}; do
    echo ${server}
    ssh user@${server} "for i in /tmp/foo* ; do echo ${i}; done"
done

แต่มันไม่ทำงาน สิ่งประหลาดฉันเห็นจำนวนเงินคืนของจำนวน $ I ดังนั้นถ้าฉันมีสิบไฟล์ฉันเห็นบรรทัดว่างสิบบรรทัด


ดูที่ตัวเลือกGNU Parallel --sshloginด้วย
เซบาสเตียน

คำตอบ:


19

เชลล์โลคัลของคุณตีความ${i}อัญประกาศคู่ภายใน ( ") ดังนั้นคำสั่งจึงใช้งานได้

ssh user@some.serv.er "for i in /tmp/foo* ; do echo; done"

เพียงใช้เครื่องหมายคำพูดเดี่ยว ( ') แทนและปัญหาของคุณจะหายไป:

ssh user@${server} 'for i in /tmp/foo* ; do echo $i; done'

1

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

"for i in /tmp/foo* ; do echo \${i}; done"

ซึ่งจะหลบหนีได้ภายในโครงสร้างในท้องถิ่นไม่ใช่เชลล์ ssh


0

ฉันได้อัปเดตคำตอบข้างต้นเพื่อรับพอร์ตจากรายการด้วย

for i in {10.21.xxx.yyy,10.21.xxx.yyy,10.23.xxx.yyy};
do
        for j in {5501,5502,5503,5504,7701,7702,7703,7704,5551,5552,5553,7771,7772,7773};
        do
                (echo > /dev/tcp/${i}/${j}) > /dev/null 2>&1 && echo "${i}:${j} :: it's getting connected" || echo "${i}:${j} :: it's not connecting"
        done
done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.