簡體   English   中英

將遠程ssh命令的輸出存儲到循環中的本地變量

[英]Store output of a remote ssh command to a local variable in a loop

我嘗試為主機列表運行命令,然后將輸出存儲在循環變量中。 我還創建了一個數組來關聯ip / hostname,因為我的命令只接受IP地址作為參數,但是我想在變量名中使用主機名和通道名。 我的代碼如下所示:

#!/bin/bash
IP="10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4 10.0.0.5"
CHANNEL="1 2 3 " 
USERNAME="username" 
SCRIPT_HOST="myscript_host" 
HOME_DIR="/home/myuser" 
SCRIPT_DIR=$HOME_DIR/scripts 
COMMAND="sudo /path_to_my_remote_script" 
SSH="ssh -t -o ConnectTimeout=10 -l $USERNAME"

declare -A array
array[10.0.0.1]="host1"
array[10.0.0.2]="host2"
array[10.0.0.3]="host3"
array[10.0.0.4]="host4"
array[10.0.0.5]="host5"

for ip in ${IP} ; do
for channel in ${CHANNEL} ; do

my_variable_name_$(${array[$($ip)]})_$c=$($SSH "$COMMAND -i $ip |grep -i \"ipv4 count\"|awk {print \$4}'") 

echo my_variable_name_$(${array[$($ip)]})_$c
done;done

當我執行腳本時,會收到一條錯誤消息,例如:

./test_array.sh:第20行:10.0.0.1:找不到命令./test_array.sh:第20行:array:壞數組下標

我可以猜測這是一個語法錯誤,但無法弄清楚。 感謝您的幫助。

我將其重寫為

declare -A array
array[10.0.0.1]="host1"
array[10.0.0.2]="host2"
array[10.0.0.3]="host3"
array[10.0.0.4]="host4"
array[10.0.0.5]="host5"

channels="1 2 3"
script=/path_to_my_remote_script
cmd=(ssh -t -o ConnectTimeout=10 -l username myscript_host)

for ip in "${!array[@]}" ; do
    for channel in $channels ; do
        varname=my_variable_name_${array[$ip]}_$channel
        echo $varname

        remote_script="sudo $script -i $ip | awk -v IGNORECASE=1 '/ipv4 count/ {print \$4}'"
        out=$( "${cmd[@]}" "$remote_script" )

        declare "$varname=$out"
    done
done
  • declare命令可以分配給動態創建的變量名,而不必使用eval
  • 您不需要將數組鍵存儲在單獨的變量中
  • 將命令存儲在數組中更可靠( ref
  • 如果您要呼叫awk ,則不需要先使用grep
  • 我認為太多的變量實際上會降低可讀性

再次考慮,我將使用另一個數組來存儲輸出,並使用偽多維鍵:

declare -A my_variable_name
for ip in "${!array[@]}" ; do
    for channel in $channels ; do
        remote_script="sudo $script -i $ip | awk -v IGNORECASE=1 '/ipv4 count/ {print \$4}'"
        my_variable_name[$ip,$channel]=$( "${cmd[@]}" "$remote_script" )
    done
done

在這條線

my_variable_name_$(${array[$($ip)]})_$c= ...

$(${array{...}})語法是問題所在。 本質上,包裝數組的$(...)試圖調用命令。 刪除$(和相應的) 同樣在下面的echo語句中。

您必須通過eval運行此程序,並避免使用復雜/不可讀的語句,我將使用一個臨時變量:

vname=my_variable_name_${array[$ip]}_$c
tmp=$($SSH ...)
eval $vname=\$tmp

要查看發生了什么,您可以添加一個

set -x

在語句之前或將其稱為bash -x your-script

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM