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