繁体   English   中英

我应该如何在bash shell中使用变量通过ssh发送Heredoc部分?

[英]How should I be using variables in bash shell sending heredoc section over ssh?

我有一个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包裹在“”中,以防止内容解析,但是$ FILEREF作为文字字符串发送,但是我希望发送该变量的值。

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

您可以建议适当的重构吗?

可以通过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 …

当前解决方案:

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组。 不是很漂亮,但是似乎有效!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM