我应该如何在bash shell中使用变量在ssh上发送heredoc部分?

时间:2014-05-13 12:59:50

标签: linux bash shell heredoc

我有一个bash脚本,我正在尝试重新配置以删除一些硬编码值。

该脚本使用来自heredoc部分的内容设置变量,该变量通过ssh传递给远程服务器。

#!/bin/bash
FILEREF=${1}
CMDS=$(cat <<HDOC
    echo $FILEREF
    COUNT=$(timeout 10s egrep -c -m 1 'INFO: Destroying ProtocolHandler \["http-bio-8080"\]' <(tail -n0 -f ~/tomcat/logs/catalina.out))
    # removed a load of other stuff for brevity
HDOC
)

#/usr/bin/ssh.exe -t -t -o TCPKeepAlive=yes -o ServerAliveInterval=45 -i "$PRIVATE_KEY_PATH" "$REMOTE_USER"@"$REMOTE_HOST" "$CMDS"

给ssh命令的变量(在cygwin下,因此.exe)在脚本的前面设置为params。

我遇到的问题是本地计算机正在尝试运行分配给COUNT的命令。我希望它按原样传递给远程主机。

所以我可以将HDOC包装在&#34;&#34;中,以防止解析内容,但是然后$ FILEREF作为文字字符串发送,但我希望发送该变量的值。

所以我想我需要一种方法来重构脚本的这一部分,这样我就能以两种方式工作,一些命令作为文字字符串传递,以便远程执行,有些我希望传递值。

你能建议一个合适的重构吗?

2 个答案:

答案 0 :(得分:1)

可以通过ssh -o SendEnv …自行发送环境变量;但是,这些变量的名称需要在接收sshd_config中预先配置,因此如果您需要在同一台机器上多次执行此操作,那么它只值得做。您还可以通过复合命令组合您重定向到ssh的内容:

{
    printf 'echo %s\n' "$FILEREF"
    cat << 'HDOC'
      COUNT=$(timeout 10s egrep -c -m 1 'INFO: Destroying ProtocolHandler \["http-bio-8080"\]' <(tail -n0 -f ~/tomcat/logs/catalina.out))
      # other stuff
    HDOC
} | ssh …

答案 1 :(得分:0)

目前的解决方案:

VARS=$(cat <<-SETVARS
UNPACKED_WAR="$(echo $WAR_FILE_REMOTE_NAME | sed 's/.war//')"
WAR_FILE="$WAR_FILE_REMOTE_NAME"
SETVARS
)
CMDS=$(echo "$VARS"; cat <<"HDOC"
     # as original question
HDOC
/usr/bin/ssh.exe -t -t -o TCPKeepAlive=yes -o ServerAliveInterval=45 -i "$PRIVATE_KEY_PATH" "$REMOTE_USER"@"$REMOTE_HOST" "$CMDS"

所以我将变量创建位解析为它们自己的变量并连接2个HDOC块。不是很漂亮,但似乎有效!