SSH heredoc: bash提示符

16

我试图编写一个Shell脚本,该脚本通过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后使用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
"
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'."
'

将其更改为<<'EOF'只会将我带到SSH服务器内部的bash提示符。我实际上所指的“提示符”是这个:read -e -p“输入文件路径:”FILEPATH-脚本应提示用户选择文件。 - user1082754
增加了一个有关取消转义单引号的建议。虽然不太美观,但不知道是否适用于您? - Faiz
你关于取消转义单引号的建议很好。虽然可能不太美观,但我认为这已经是最好的解决方案了。 - user1082754
1
刚刚更新了我的第一个建议 - 在本地声明的变量保持不变的情况下,您将需要使用 \$varname 转义远程(服务器端)变量。 - Faiz
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/21330/discussion-between-faiz-and-oliver-joseph-ash - Faiz
显示剩余3条评论

7
为了让它与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

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

3
这个可以正常运作,主机上的Tab自动完成也可以使用。
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”的文件。

我所说的提示是这样的:read -e -p \"输入文件路径:\" FILEPATH - user1082754

0

这个似乎可以工作:

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

一个类似SSH的等效物会是什么样子? - user1082754

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接