SSH heredoc:bash提示符

14 ssh bash shell

我正在尝试编写一个SSH脚本到服务器的shell脚本,然后提示用户输入文件/文件夹.

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
Run Code Online (Sandbox Code Playgroud)

我在SSH之后使用heredoc而不是双引号来执行这些命令,因为我的shell脚本相当大,我不想逃避每个双引号.

当我使用双引号时,提示工作正常.但是,现在我正在使用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
"
Run Code Online (Sandbox Code Playgroud)

Fai*_*aiz 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" 
Run Code Online (Sandbox Code Playgroud)

请注意,如果您使用双引号的唯一问题是转义,并且您不打算在'脚本中使用单引号,则可以执行以下操作:

ssh -t $SERVER '
# your script, unescaped.
# if you want access to a locally defined variable,
echo "CLIENT is '$CLIENT'."
'
Run Code Online (Sandbox Code Playgroud)


Chr*_*ris 5

为了使它与heredoc一起工作,调用bash,或者你想在远程服务器上使用的任何shell应该就足够了。像这样:

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
Run Code Online (Sandbox Code Playgroud)

请注意,您可能想要转义$on FILEPATH,因为目前它将由本地 shell 而不是远程 shell 插入。