SSH पर लूप के लिए रिमोट


14

मेरे पास एक स्क्रिप्ट में निम्नलिखित है

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

लेकिन यह काम नहीं करता है। अजीब बात है, मैं $ I राशि वापसी लाइनें देखता हूं। इसलिए अगर मेरे पास दस फाइलें हैं, तो मुझे दस रिक्त लाइनें दिखाई देती हैं।


पर भी देखने जीएनयू समानांतर के --sshlogin विकल्प।
सेबस्टियन

जवाबों:


20

आपका स्थानीय शेल ${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'

2

बस थोड़ी सी इस समस्या में भाग गया, और दिया गया समाधान, जबकि यह काम नहीं करता है बहुत प्रभावी नहीं है यदि आप स्थानीय शेल से चर में खींच रहे हैं, तो इससे पहले कि आप एक सरणी बनाने के लिए इसे खत्म कर दें। थोडा गन्दा कुछ तो बस शुरू में $ बचना होगा इसलिए यह होगा

"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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.