[英]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.