2012-12-18 1 views
11

Ja próbuje napisać skrypt, który SSHs na serwerze, a następnie pyta użytkownika, aby wprowadzić plik/folder.SSH heredoc: bash szybka

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 

Używam heredoc zamiast cudzysłów po SSH na wykonanie tych poleceń, bo mój skrypt jest dość duży, a ja nie chcę być ucieczką każdy podwójny cudzysłów.

Kiedy używałem cudzysłowów, monit działało. Jednak teraz, gdy używam heredoc, zachęta przestaje działać.

Co mogę zrobić, aby dostać się monit, aby pracować z heredoc? A jeśli nie, czy jest jakiś sposób, że układ mój skrypt tak, że szybka praca bez owijania robi wszystko, co w cudzysłowach i ucieczki, tak jak poniżej:

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 
" 

Odpowiedz

7

Jeśli nie potrzeba żadnych zmiennych z klientem, to dlaczego nie spróbować - i ssh -t może być przydatna.

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" 

Zauważ, że jeśli tylko problem z cudzysłowami ucieka, a ty nie planują na użyciu ' apostrofów w skrypcie, można Ust to zrobić:

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

Zmiana na '<< 'EOF'' powoduje przejście do podpowiedzi bash w serwerze SSH. To, co właściwie miałem na myśli przez "prompt", to: 'read -e -p" Podaj ścieżkę do pliku: "FILEPATH" - skrypt powinien monitować użytkownika o plik. –

+0

Początkowo używałem pojedynczych cudzysłowów, ale potem nie mam dostępu do zmiennych takich jak '$ CLIENT', które zostały zdefiniowane przed poleceniem SSH. –

+0

Dodano sugestię dotyczącą unikania pojedynczych cudzysłowów. brzydki, ale zastanawiam się, czy to działa dla ciebie? – Faiz

2

to działa, zakończenie prac na kartę gospodarza.

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

ssh -t NODE $var 

na kopalni tworzy to plik THIS w katalogu z monitem o.

+0

Przez szybka Znaczy to: 'czytać -e -p \„Wprowadź ścieżkę do pliku: \”FILEPATH' –

+0

spróbować zaktualizowaną wersję. działa to z podpowiedziami. – kdubs

+0

, ale prompt odczytu jest uruchamiany lokalnie, co nie jest poprawne. Naprawiono tylko – dogbane

1

Ten wydaje się działać:

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

Jak mógłby wyglądać odpowiednik SSH? –

0

Aby sprawiają, że działa z heredoc, powinno wystarczyć wywołanie bash lub jakiejkolwiek powłoki, której chcesz użyć na serwerze zdalnym. Tak:

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 

Zauważ, że prawdopodobnie chcesz uciec $ na FILEPATH, ponieważ obecnie, że będą interpolowane przez lokalną muszli zamiast zdalnej powłoki.