【问题标题】:SSH heredoc: bash promptSSH heredoc:bash 提示符
【发布时间】: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
"

【问题讨论】:

    标签: bash shell ssh


    【解决方案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 进行插值。

    【讨论】:

      猜你喜欢
      • 2017-12-10
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      相关资源
      最近更新 更多