2012-12-18 6 views
11

SSHのサーバにシェルスクリプトを書き込もうとしているときに、ファイル/フォルダの入力を求めるプロンプトが表示されます。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 

私のシェルスクリプトがかなり大きく、私はすべて二重引用符をエスケープしたくないので、私はこれらのコマンドを実行するためにSSH後にヒアドキュメントの代わりに、二重引用符を使用しています。

二重引用符を使用していたときに、プロンプトが正常に機能しました。しかし、私はheredocを使用しているので、プロンプトはもはや機能しません。

heredocで作業するためのプロンプトを表示するにはどうすればよいですか?これは、ホスト作品上のタブ補完を働く

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" 

二重引用符を使用して唯一の問題は、エスケープされ、そして、あなたのスクリプトで'単一引用符を使用して 予定がない場合は、あなたがこれを行うUSTできることに注意してください:

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

'<< 'EOF''に変更すると、SSHサーバーの内部のbashプロンプトに移動します。私が実際に 'プロンプト'としたのは、 'read -e -p 'というファイルへのパスを入力します:" FILEPATH' - スクリプトはユーザにファイルを要求するはずです。 –

+0

私は最初に一重引用符を使用していましたが、SSHコマンドの前に定義された '$ 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 

これは、ディレクトリのプロンプトにTHISというファイルを作成します。

+0

私はこれを意味します: 'read -e -p \"ファイルへのパスを入力してください:\ "FILEPATH' –

+0

更新されたバージョンを試してください。これはプロンプトで動作します。 – kdubs

+0

ですが、読み取りプロンプトがローカルで実行されていますが、これは正しくありません。 – dogbane

1

この1つは動作するようです:

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

SSHの見た目はどうですか? –

0

へheredocで動作させるには、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 

注:そうのように。