我有一个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作为文字字符串发送,但我希望发送该变量的值。
所以我想我需要一种方法来重构脚本的这一部分,这样我就能以两种方式工作,一些命令作为文字字符串传递,以便远程执行,有些我希望传递值。
你能建议一个合适的重构吗?
答案 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块。不是很漂亮,但似乎有效!