16

我正在尝试编写一个通过 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

我在 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

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 回答
6

要使其与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

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

于 2017-07-07T20:56:28.300 回答
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 回答