SSH定界符:bash提示符(SSH heredoc: bash prompt)

2019-08-04 06:40发布

我试图写一个shell脚本SSHS到服务器,然后提示用户输入一个文件/文件夹。

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后,因为我的shell脚本是相当大的,以执行这些命令,我​​不希望被转义每一个双引号。

当我使用双引号,提示工作的罚款。 但是,现在,我使用定界符,提示不再有效。

我能做些什么,以获得及时与定界符工作? 如果没有,有没有什么办法我布置我的剧本,这样的提示确实没有包裹在双引号中的一切和逃避,像这样的工作:

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
"

Answer 1:

如果你不需要任何来自客户端的变量,为什么不尝试-并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" 

请注意,如果你用双引号唯一的问题是逃跑了,你不打算使用计划'脚本中的单引号,那么你可以UST这样做:

ssh -t $SERVER '
# your script, unescaped.
# if you want access to a locally defined variable,
echo "CLIENT is '$CLIENT'."
'


Answer 2:

这个工程,完成选项卡上的主机作品。

var=$(cat<<EOF
read -e -p Path pname;
echo \$pname;
hostname;
echo \$pname;
cd \$pname;
pwd;
touch THIS ;
exit;
EOF
)

ssh -t NODE $var  

在这个矿井创建这个在提示输入目录中的文件。



Answer 3:

为了使其具有定界符工作,它应足以调用bash ,或者你想在远程服务器上使用什么壳。 像这样:

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进行插值。



Answer 4:

这一个似乎工作:

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


文章来源: SSH heredoc: bash prompt
标签: bash shell ssh