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'."
'

【讨论】:

将其更改为 &lt;&lt;'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 被损坏(随机)[重复]

使用 SSH 密钥登录在 Git Bash 上不起作用,但在 Windows 命令提示符中起作用 [关闭]

ssh 登录弹窗提示

ssh免密登录免提示登录

ssh免密登录免提示登录

ssh免密登录免提示登录