Bash - s sh для хостов в ассоциативном массиве - PullRequest
1 голос
/ 18 июня 2020

Я пишу сценарий, который хранит данные клиентского подключения, такие как идентификатор сеанса, сервер и порт, в ассоциативном массиве. Мне нужно установить s sh на эти хосты и запустить команду lsof, чтобы узнать, какой процесс использует этот порт.

declare -A HOSTMAP
HOSTMAP[session]=$session_ids
HOSTMAP[cname]=$cnames
HOSTMAP[port]=$ports

При печати данные в массиве отображаются так (имена хостов и порты были изменены для защиты невиновных)

for g in "${!HOSTMAP[@]}"
do
   printf "[%s]=%s\n" "$g" "${HOSTMAP[$g]}"
done
[cname]=hostname1
hostname2
hostname3
hostname4
hostname5
hostname6
hostname7
hostname8
[session]=44
5
3
9
14
71
65
47
[port]=11111
22222
33333
44444
55555
66666
77777
88888

Я бы хотел сделать операция, похожая на следующую:

for session in $session_id
    do
    echo "Discovering application mapped to session ${session} on ${cname}:${port}"
    ssh -tq ${cname} "lsof -Tcp | grep ${port}"
done

Заранее большое спасибо за совет по элегантному решению

Ответы [ 2 ]

1 голос
/ 18 июня 2020

bash не допускает вложения массивов. Здесь я бы просто использовал отдельные индексированные массивы. Однако, поскольку ваш сеанс выглядит как целые числа, а индексированные массивы разрежены, вы можете использовать идентификатор сеанса в качестве индекса для cnames и портов.

cnames=([44]=hostname1 [5]=hostname2 [3]=hostname3)
ports=([44]=1111 [5]=2222 [3]=3333)

for session in "${!cnames[@]}"; do
  cname=${cnames[$session]}
  port=${ports[$session]}
  echo "Discovering application mapped to session ${session} on ${cname}:${port}"
  ssh -tq ${cname} "lsof -Tcp | grep ${port}"
done
0 голосов
/ 18 июня 2020

Вы можете назначить вывод ssh переменной

result=$(ssh -tq ${cname} "lsof -Tcp | grep ${port}")

Затем вы можете извлечь нужные данные из $result.

...