2012-09-20 18 views
8

वाले तर्कों के साथ कमांड को कम करने की अपेक्षा करते हैं I ssh पर एक साधारण कमांड cat /tmp/id_rsa.pub चलाने के लिए expect का उपयोग करना चाहते हैं।रिक्त स्थान

एक खोल में, मैं चला सकते हैं इस wo समस्या, (साथ मैन्युअल रूप से पासवर्ड में डाल)

ssh [email protected] 'cat /tmp/id_rsa.pub' 

मैं expect के साथ इस स्वचालित करना चाहते हैं। मेरे expect स्क्रिप्ट है,

#!/usr/bin/expect 
eval spawn ssh [email protected] 'cat /tmp/id_rsa.pub' 
expect "password:" 
send "123456" 
expect eof 

यह त्रुटि bash: cat /tmp/id_rsa.pub: no such file or directory फेंकता है। यह मेरे लिए बहुत अजीब लग रहा है। संभावित कारण क्या हो सकता है?

संपादित करें: कुछ परीक्षणों के बाद, मुझे लगता है कि यह सामान्य है, न केवल cat के मामले में। यदि कमांड को कम करने का तर्क अंतरिक्ष के साथ है (भले ही यह उद्धरण में है), तो इसमें समस्या होगी। उदाहरण के लिए, रिक्त स्थान के साथ अन्य आदेशों के साथ cat /tmp/id_rsa.pub की जगह, जैसे

eval spawn ssh [email protected] 'which java' 

यह bash: which java: command not found साथ शिकायत। लेकिन यह ठीक से काम करता है, तो pwd साथ की जगह है कि, की तरह

eval spawn ssh [email protected] 'pwd' 

+3

आपके आस-पास 'कमांड तर्क' एकल उद्धरण चिह्न निकाल कर की कोशिश की है: मैं इसे " साथ काम करने में कामयाब रहे? ऐसा प्रतीत होता है कि समस्या की जड़ यह है कि यह आदेश के नाम के रूप में पूरे उद्धृत स्ट्रिंग को कमांड और तर्कों में विभाजित करने की बजाय कोशिश कर रहा है ... – twalberg

+0

@twalberg जो काम कर रहा है। मैंने डबल कोट्स, वाई/समस्या भी कोशिश की। जिज्ञासा से बाहर, क्या आप एक उद्धरण के बारे में कुछ खास बता सकते हैं? – Richard

+0

मुझे यह देखने के लिए 'उम्मीद' दस्तावेज़ों को खोदना होगा - मेरे सिर के ऊपर से नहीं पता। मैंने सुझाव दिया कि आपको प्राप्त होने वाले विशेष त्रुटि संदेश के सिंटैक्स के आधार पर ... – twalberg

उत्तर

0

मुझे लगता है कि आपको eval की आवश्यकता नहीं है। इसे हटाएं और जांचें।

"expect का उपयोग कैसे करें" पर विस्तृत उदाहरणों के लिए यह expect examples link देखें? ।

उम्मीद है कि इससे मदद मिलती है।

+0

मैंने 'eval'' के बिना प्रयास किया है, लेकिन सफलता के बिना। – Richard

3

एकल उद्धरण (') के पास sh और अन्य संगत शैल के विपरीत, अपेक्षा करने के लिए कोई विशेष अर्थ नहीं है।
इसका मतलब यह है कि आपके बयान

spawn ssh [email protected] 'cat /tmp/id_rsa.pub' 

निम्नलिखित शब्दों में पार्स किया गया है:

  • spawn
  • ssh
  • [email protected]
  • 'cat - अन्य एकल उद्धरण तक नहीं।
  • /tmp/id_rsa.pub'

श में उपयोग करने के लिए एक भी तर्क समूह इस के लिए है। टीसीएल में आप या तो डबल कोट्स (") या घुंघराले ब्रैकेट ({}) का उपयोग कर सकते हैं। डबल कोट्स के अंदर, टीसीएल वैरिएबल को प्रतिस्थापित किया जाएगा, जबकि {} के अंदर की सामग्री किसी भी प्रतिस्थापन के बिना पास की जाती है।

tl; डॉ अपेक्षा की/Tcl बराबर श के '{} हैं।

एक \ एक नई लाइन से पहले भी प्रतिस्थापित किया जाएगा।

2

जैसा कि जोहान्स ने कहा, ' का उपयोग नहीं करता है।
मुझे एक ही समस्या थी, लेकिन मैं अधिक आदेश निष्पादित करना चाहता था और फिर भी एक लॉगिन खोल प्राप्त करना चाहता था।

expect -c " 
    set timeout 5; 
    spawn ssh -XY [email protected]$host -t \"cat /etc/motd; bash -l\" 
    expect { 
     -re \"^Warning.*\" {exp_continue} 
     -re \"^.*sword: \" {send \"${PASSWORDS[$user]}\r\"; interact} 
    } 
" 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^