我试图写一个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
"
如果你不需要任何来自客户端的变量,为什么不尝试-并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'."
'
这个工程,完成选项卡上的主机作品。
var=$(cat<<EOF
read -e -p Path pname;
echo \$pname;
hostname;
echo \$pname;
cd \$pname;
pwd;
touch THIS ;
exit;
EOF
)
ssh -t NODE $var
在这个矿井创建这个在提示输入目录中的文件。
为了使其具有定界符工作,它应足以调用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进行插值。
这一个似乎工作:
T=$(tty) ; bash <<XXX
echo Hi "$T"
read p <$T
echo p: \$p
echo Bye
XXX