2012-12-18 17 views
11

मैं एक शेल स्क्रिप्ट लिखने का प्रयास कर रहा हूं जो सर्वर में एसएसएच करता है और फिर उपयोगकर्ता को फ़ाइल/फ़ोल्डर में प्रवेश करने के लिए संकेत देता है।एसएसएच हेरेडोक: बैश प्रॉम्प्ट

ssh $SERVER <<EOF 
cd downloads/ 
read -e -p "Enter the path to the file: " FILEPATH 
echo $FILEPATH 
eval FILEPATH="$FILEPATH" 

echo "Downloading $FILEPATH to $CLIENT" 
EOF 

मैं SSH के बाद बजाय हियरडॉक उपयोग कर रहा हूँ डबल कोट्स के इन आदेश पर अमल करने के लिए क्योंकि मेरी खोल स्क्रिप्ट नहीं बल्कि बड़ी है और मैं हर दोहरे उद्धरण से बचने जा करने के लिए नहीं करना चाहती।

जब मैं डबल कोट्स का उपयोग कर रहा था, तो प्रॉम्प्ट ठीक काम करता था। हालांकि, अब मैं हेरेडोक का उपयोग कर रहा हूं, प्रॉम्प्ट अब काम नहीं करता है।

हेरेडोक के साथ काम करने के लिए संकेत प्राप्त करने के लिए मैं क्या कर सकता हूं? और अगर नहीं, वहाँ किसी भी तरह से मैं अपने स्क्रिप्ट लेआउट है ताकि शीघ्र करता दोहरे उद्धरण में सब कुछ लपेटकर और भागने, इसलिए की तरह बिना काम:

ssh $SERVER " 
cd downloads/ 
read -e -p \"Enter the path to the file: \" FILEPATH 
echo $FILEPATH 
eval FILEPATH=\"$FILEPATH\" 

echo \"Downloading $FILEPATH to $CLIENT\" 
exit 
" 

उत्तर

7

आप ग्राहक से किसी भी चर की जरूरत नहीं है, क्यों की कोशिश नहीं - और ssh -t उपयोगी हो सकता है।

export CLIENT=me 

CMDS=$(cat <<CMD 
cd downloads/ 
read -e -p "Enter the path to the file: " FILEPATH 
echo \$FILEPATH 
eval FILEPATH="\$FILEPATH" 

echo "Downloading \$FILEPATH to $CLIENT" 
CMD 
) 

ssh localhost -t "$CMDS" 

ध्यान दें कि डबल उद्धरण के साथ अपने ही मुद्दा बचने अगर है, और आप अपनी स्क्रिप्ट में ' एकल उद्धरण का उपयोग कर पर योजना नहीं है, तो आप यह करते हैं उस्त कर सकते हैं: करने के लिए

ssh -t $SERVER ' 
# your script, unescaped. 
# if you want access to a locally defined variable, 
echo "CLIENT is '$CLIENT'." 
' 
+0

इसे '<<' EOF'' में बदलना मुझे एसएसएच सर्वर के अंदर बैश प्रॉम्प्ट पर ले जाता है। वास्तव में 'प्रॉम्प्ट' से मेरा क्या मतलब है: 'read -e -p" फ़ाइल के पथ को दर्ज करें: "FILEPATH' - स्क्रिप्ट को उपयोगकर्ता को फ़ाइल के लिए संकेत देना चाहिए। –

+0

मैं शुरुआत में सिंगल कोट्स का उपयोग कर रहा था, लेकिन फिर मैं '$ CLIENT'' जैसे चरों तक नहीं पहुंच सकता, जिसे एसएसएच कमांड से पहले परिभाषित किया गया था। –

+0

एकल उद्धरण एकल उद्धरण के बारे में एक सुझाव जोड़ा गया। बदसूरत, लेकिन आश्चर्य है कि यह आपके लिए काम करता है? – Faiz

2

इस होस्ट काम करता है पर काम करता है, टैब पूरा होने।

var=$(cat<<EOF 
read -e -p Path pname; 
echo \$pname; 
hostname; 
echo \$pname; 
cd \$pname; 
pwd; 
touch THIS ; 
exit; 
EOF 
) 

ssh -t NODE $var 

मेरा यह निर्देशिका फ़ाइल के लिए संकेत में फ़ाइल बनाता है।

+0

प्रॉम्प्ट द्वारा मेरा मतलब यह है: 'read -e -p \ "फ़ाइल के पथ दर्ज करें: \" FILEPATH' –

+0

अद्यतन संस्करण को आजमाएं। यह संकेत के साथ काम करता है। – kdubs

+0

लेकिन रीड प्रॉम्प्ट स्थानीय रूप से चलाया जाता है, जो सही नहीं है। – dogbane

1

यह एक काम करने के लिए लगता है:

T=$(tty) ; bash <<XXX 
echo Hi "$T" 
read p <$T 
echo p: \$p 
echo Bye 
XXX 
+0

एसएसएच उस रूप के बराबर कैसे होगा? –

0

इसे हेड्रोक के साथ काम करें, यह bash, या रिमोट सर्वर पर जो भी खोल आप उपयोग करना चाहते हैं उसे आमंत्रित करने के लिए पर्याप्त होना चाहिए। आप शायद, FILEPATH पर $ से बचने के लिए वर्तमान में है कि दूरदराज के खोल के बजाय स्थानीय शेल द्वारा अंतर्वेशित हो जाएगा के बाद से चाहते हैं कि

ssh $SERVER bash <<EOF 
cd downloads/ 
read -e -p "Enter the path to the file: " FILEPATH 
echo $FILEPATH 
eval FILEPATH="$FILEPATH" 

echo "Downloading $FILEPATH to $CLIENT" 
EOF 

नोट: इसलिए की तरह।