SSH heredoc:bash 提示符
Posted
技术标签:
【中文标题】SSH heredoc:bash 提示符【英文标题】:SSH heredoc: bash prompt 【发布时间】:2012-12-05 17:40:36 【问题描述】:我正在尝试编写一个通过 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
"
【问题讨论】:
【参考方案1】:这可行,主机上的选项卡完成。
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 \"Enter the path to the file: \" FILEPATH
【参考方案2】:
这个似乎有效:
T=$(tty) ; bash <<XXX
echo Hi "$T"
read p <$T
echo p: \$p
echo Bye
XXX
【讨论】:
SSH 等效的外观如何?【参考方案3】:如果您不需要来自客户端的任何变量,何不尝试一下 - 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 "Enter the path to the file: " FILEPATH
——脚本应该提示用户输入文件。
我最初使用的是单引号,但后来我无法访问在 SSH 命令之前定义的 $CLIENT
等变量。
添加了关于取消转义单引号的建议。丑陋,但不知道它是否适合你?
您关于取消转义单引号的建议有效。可能更丑!估计这是我能得到的最好的吗?
刚刚更新了我的第一个建议 - 您必须使用 \$varname
转义远程(服务器端)变量,同时保留本地声明的变量。【参考方案4】:
要使其与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 进行插值。
【讨论】:
以上是关于SSH heredoc:bash 提示符的主要内容,如果未能解决你的问题,请参考以下文章
粘贴到 ssh 终端时,bash heredoc 被损坏(随机)[重复]