16

サーバーに SSH 接続し、ユーザーにファイル/フォルダーを入力するように求めるシェル スクリプトを作成しようとしています。

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
"
4

4 に答える 4

8

クライアントからの変数が必要ない場合は、試してみてください-そして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'."
'
于 2012-12-18T14:03:23.827 に答える
3

これは機能し、ホストでのタブ補完は機能します。

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 が作成されます。

于 2012-12-18T13:46:42.677 に答える
0

これはうまくいくようです:

T=$(tty) ; bash <<XXX
echo Hi "$T"
read p <$T
echo p: \$p
echo Bye
XXX
于 2012-12-18T13:55:53.630 に答える