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