अगर हालत ssh पर स्क्रिप्ट में काम नहीं कर रहा है


0

SSH मोड पर शेल स्क्रिप्ट के नीचे काम नहीं कर रहा है।

वैरिएबल end_pos को "Stop" मान मिल रहा है, लेकिन जब यह IF लूप में आता है, तो यह स्थिति की जांच नहीं करता है और लूप विफल हो रहा है।

कमांड का आउटपुट:

 /mysql/mysql/bin/mysqlbinlog mysql-bin.000001 |tail -10| grep -w -A1 154 | grep -w "Stop" |awk '{print \$10}' 

STOP है

echo \ $ end_pos; STOP प्रिंट करें

 #!/bin/bash
ssh -t -t username@hostname << ENDSSH
  cd /logs
echo "8. We are in SSH mode now" >./log_master.txt
end_pos=\$(/mysql/mysql/bin/mysqlbinlog mysql-bin.000001 |tail -10| grep -w -A1 154 | grep -w "Stop" |awk '{print \$10}')
echo \$end_pos;

 if  [ "\$end_pos" == "*Stop*" ];
  then
     echo "Loop succeed" >>./log_master.txt
 break
  else
      echo "loop failed" >>./log_master.txt
 fi
exit;
exit;
ENDSSH

IlkKachu टिप्पणी के बाद मैंने "ENDSSH" में उद्धरण दिए (यह केवल एक बदलाव है जिसे मैंने बनाया है) और निष्पादित किया गया। यह त्रुटि फेंक दिया। फिर मैंने डबल ब्रैकेट लगाने की दूसरी विधि का उपयोग किया जैसा कि नीचे दिखाया गया है।

लेकिन जब स्क्रिप्ट के नीचे निष्पादित किया गया, तो मुझे यह मिल रहा था: अगर [["" = " स्टॉप "]];

  #!/bin/bash
 ssh -t -t username@hostname << ENDSSH
 cd /logs
 echo "8. We are in SSH mode now" >./log_master.txt
end_pos=\$(/mysql/mysql/bin/mysqlbinlog mysql-bin.000001 |tail -10| grep -w -A1 154 | grep -w "Stop" |awk '{print \$10}')
 echo \$end_pos;

if  [[ "$end_pos" == "*Stop*" ]];
 then
 echo "Loop succeed" >>./log_master.txt
 break
 else
  echo "loop failed" >>./log_master.txt
fi
exit;
ENDSSH

जवाबों:


2
ssh -t -t username@hostname << ENDSSH
...
echo \$end_pos;

यदि आपको बाहरी शेल से किसी भी चर का विस्तार करने की आवश्यकता नहीं है, तो यहां SSH को जाने वाले डॉक्टर के << "ENDSSH"साथ , आप सीमांकक के आसपास के उद्धरणों के साथ उपयोग कर सकते हैं , यहाँ-doc को एक एकल-उद्धृत स्ट्रिंग के रूप में लिया गया है। तब आपको इसके $भीतर हर संकेत से बचने की जरूरत नहीं है।

if [ "$end_pos" == "*Stop*" ]; then

यदि आप *Stop*एक पैटर्न के रूप में मूल्य की तुलना करना चाहते हैं , और शाब्दिक स्ट्रिंग के रूप में नहीं , तो आपको उपयोग करने की आवश्यकता है [[ .. ]]या अधिक मानक case:

if [[ $end_pos = *Stop* ]] ; then
    ...

# or
case "$end_pos" in 
    *Stop*) echo "stop found" ;;
    *) echo "stop not found" ;;
esac

इसके अलावा, यह breakजगह से बाहर दिखता है, कोई लूप नहीं है। बैश उस बारे में शिकायत करेगा, लेकिन केवल अगर इफ-स्टेटमेंट के उस हिस्से को निष्पादित किया जाता है। exitएक पंक्ति में दो s थोड़ा बेमानी भी लगते हैं।


जवाब के लिए धन्यवाद । लेकिन दोनों तरह से यह काम नहीं कर रहा है। मैंने संपादित भाग में दिखाया है कि मैंने आपकी टिप्पणी पढ़ने के बाद क्या किया
user21546

@ user21546, आपके पास ENDSSHकीवर्ड के आसपास के उद्धरण नहीं हैं , आपने केवल $एस से पलायन को हटा दिया है । जिसका मतलब है कि स्क्रिप्ट कॉलिंग से वेरिएबल का विस्तार होता है ssh, और इसका कोई मूल्य नहीं है, इसलिए आप खाली हो जाएं। मेरा मतलब था कि आप ssh -t ... << "ENDSSH"(या << 'ENDSSH'), वस्तुतः उद्धरणों के साथ लिख सकते हैं । लेकिन इससे कोई फर्क नहीं पड़ता, यदि आप टर्मिनेटर को निर्विरोध छोड़ देते हैं, तो $अपने मूल कोड के अनुसार एस से बच जाएं । वह हिस्सा सिर्फ एक शैली का मुद्दा है।
इलकाचू

0

मैंने इसे नीचे तरीके से किया है:

#!/bin/bash
ssh -t -t username@hostname << ENDSSH
 cd /logs
 echo "8. We are in SSH mode now" >./log_master.txt
end_pos=\$(/mysql/mysql/bin/mysqlbinlog mysql-bin.000001 |tail -10| grep -w -A1 154 | grep -w "Stop" |awk '{print \$10}')
 echo \$end_pos;

if  [[ "$end_pos" =~ Stop ]];
 then
 echo "Loop succeed" >>./log_master.txt
 else
 echo "loop failed" >>./log_master.txt
fi   
exit;
ENDSSH
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.