2012-12-18 2 views
11

SSH'leri bir sunucuya koyduktan sonra kullanıcıdan bir dosya/klasör girmesini isteyen bir kabuk komut dosyası yazmayı deniyorum. Benim kabuk komut dosyası oldukça büyük olduğunu ve her çift tırnak kaçan olmak istemiyorum çünküSSH heredoc: bash istemi

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 

Ben bu komutları yürütmek için SSH sonra çift tırnak yerine yorumlu metin kullanıyorum.

Çift tırnak kullanırken, komut istemi iyi çalıştı. Ancak, şimdi heredoc kullanıyorum, istemi artık çalışmıyor.

Heredoc ile çalışma komutunu almak için ne yapabilirim? Ve eğer, benim komut düzeni herhangi bir yolu yoktur, böylece istemi yapar çift tırnak şeyi sarma ve böylece gibi kaçan olmadan çalışma:

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 
" 

cevap

7

Eğer müşteriden herhangi bir değişken gerekmiyorsa, neden denemiyorsunuz - ve ssh -t yararlı olabilir. To

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

"<< 'EOF'" ile değiştirmek beni sadece SSH sunucusunun içindeki bash komutuna götürür. Aslında 'istemi' ile kastettiğim şey şudur: '-e -p oku' Dosyaya giden yolu girin: "FILEPATH" - komut dosyası kullanıcıyı bir dosya için yönlendirmelidir. –

+0

Başlangıçta tek tırnak kullanıyordum, ancak SSH komutundan önce tanımlanmış olan "$ CLIENT" gibi değişkenlere erişemiyorum. –

+0

Tek tırnak kaçışını kaldırma hakkında bir öneri eklendi. çirkin, ama senin için çalışıyor mu merak ediyorum? – Faiz

2

bu konak çalışmalarına, sekme tamamlama çalışır. Benim için bu, dizin için istendiğinde BU dosya oluşturur.

+0

Komut istemiyle şunu söylüyorum: 'read -e -p \" Dosyanın yolunu girin: \ "FILEPATH' –

+0

güncellenmiş sürümü deneyin. Bu istemi ile çalışır. – kdubs

+0

ancak okuma istemi yerel olarak çalıştırılıyor, bu doğru değil. – dogbane

1

Bu seferki iş gibi görünüyor:

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

Bu SSH eşdeğeri nasıl görünürdü? –

0

: o zaman bunu ust olabilir çift tırnak ile tek sorun kaçtığı ve size komut ' tek tırnak kullanarak planı yok eğer

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" 

Not Heredoc ile çalışmasını sağlamak için, bash'u veya uzak sunucuda kullanmak istediğiniz kabukları çağırmak için yeterli olmalıdır. muhtemelen şu anda yerel kabuk ziyade uzaktan kabuk tarafından interpolated olacağını beri FILEPATH üzerinde $ kaçmak istediğiniz

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 

Not: öylesine gibi.