簡體   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