2012-12-18 35 views
11

Ich versuche, ein Shell-Skript zu schreiben, die SSH in einen Server und fordert dann den Benutzer auf, eine Datei/einen Ordner einzugeben.SSH heredoc: bash prompt

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 

Ich verwende heredoc statt doppelte Anführungszeichen nach dem SSH diese Befehle auszuführen, weil mein Shell-Skript ist ziemlich groß, und ich will nicht jedes doppelte Anführungszeichen zu entkommen werden.

Wenn ich doppelte Anführungszeichen verwendete, funktionierte die Eingabeaufforderung gut. Jetzt, da ich heredoc benutze, funktioniert die Eingabeaufforderung nicht mehr.

Was kann ich tun, um die Eingabeaufforderung für die Arbeit mit Heredoc zu erhalten? Und wenn nicht, ist es eine Möglichkeit, meine Skript-Layout, so dass die Eingabeaufforderung funktioniert ohne alles in doppelten Anführungszeichen zu wickeln und zu entkommen, etwa so:

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 
" 

Antwort

7

Wenn Sie von der Client alle Variablen brauchen nicht, warum nicht versuchen - und ssh -t könnte nützlich sein.

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" 

Beachten Sie, dass, wenn Ihr einziges Problem mit doppelten Anführungszeichen entweicht, und Sie nicht vorhaben, auf ' einfache Anführungszeichen in Ihrem Skript verwenden, dann können Sie dies ust tun:

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

Wenn ich es in '' ''EOF'' ändere, komme ich einfach zur bash-Eingabeaufforderung innerhalb des SSH-Servers. Was ich eigentlich mit 'prompt' meinte, ist dies: 'read -e -p 'Geben Sie den Pfad zur Datei ein:" FILEPATH "- das Skript sollte den Benutzer nach einer Datei fragen. –

+0

Ich habe anfangs einfache Anführungszeichen verwendet, aber dann kann ich nicht auf Variablen wie '$ CLIENT' zugreifen, die vor dem SSH-Befehl definiert wurden. –

+0

Es wurde ein Vorschlag zum Deaktivieren von einfachen Anführungszeichen hinzugefügt. hässlich, aber frage mich, ob es für dich funktioniert? – Faiz

2

das funktioniert, Tabulatorvervollständigung auf den Host-Werken.

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

ssh -t NODE $var 

auf meinem dies erstellt die Datei This in der Aufforderung für das Verzeichnis.

+0

Mit prompt meine ich dies: 'read -e -p \" Geben Sie den Pfad zu der Datei: \ "FILEPATH' –

+0

versuchen Sie die aktualisierte Version. das funktioniert mit der Aufforderung. – kdubs

+0

, aber die Leseaufforderung wird lokal ausgeführt, was nicht korrekt ist. – dogbane

1

Dies scheint zu funktionieren:

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

Wie würde ein SSH-Äquivalent aussehen? –

0

zu Wenn es mit einem here- doc funktioniert, sollte es ausreichen, bash oder eine beliebige Shell aufzurufen, die Sie auf dem Remote-Server verwenden möchten. Wie so:

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 

Beachten Sie, dass Sie wahrscheinlich die $ auf FILEPATH, entkommen, da zur Zeit, die von der lokalen Shell interpoliert werden, anstatt dem Remote-Shell.