LINUX.ORG.RU

Bash Массив

 


0

2

Имеется фаил с ip адресами

  • 192.168.0.1
  • 192.168.0.2
  • 192.168.0.3
  • 192.168.0.4
  • 192.168.0.5

через sshpass я подключаюсь к серверу sshpass -p $pass ssh -o StrictHostKeyChecking=no -X $user@$ip

Задача подставлять элементы массива в переменную $ip

Как я это вижу:

При запуске скрипта в терминал вываливается весь список ip адресов масива, стрелками вверх ввниз я выбираю элимент, и нажимаю энтер тем самым элемент подставляется в переменную $ip


А ты не пробовал алиасы или просто закладки в эмуляторе терминала? Ты на пустом месте городишь не пойми что.

P.S. Ну что за дикость с паролями, юзай ключи.

WitcherGeralt ★★
()
function connect() {
  local user=$1
  local pass=$2

  local -a ip_addrs=()
  mapfile -t ip_addrs < file_with_ips.txt

  local ip=
  select ip in "${ip_addrs[@]}"; do
    [ -n "$ip" ] && break  
  done

  sshpass -p "$pass" ssh -o StrictHostKeyChecking=no -X "$user@$ip"
}

connect USER PASSWORD
KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 2)

если хочешь выбирать адреса только курсором:

connect() {
  local user=$1
  local pass=$2
  local -a ip_addrs=()
  mapfile -t ip_addrs < file_with_ips.txt
  local i=1
  for ip in "${ip_addrs[@]}";do
    diag_menu="$diag_menu $i $ip"
    i=$((i+1))
  done;
  cmd="dialog --stdout --backtitle SSH --menu Servers: $((${#ip_addrs[@]}+7)) 40 ${#ip_addrs[@]} $diag_menu"
  answer=$(($($cmd)-1))
  $sshpass -p "$pass" ssh -o StrictHostKeyChecking=no -X "$user@${ip_addrs[$answer]}"
}
connect USER PASSWORD

vasyan
()
Ответ на: комментарий от vasyan

Все отлчино! тольно есть одно но! в файле file_with_ips.txt есть текст

  • 192.168.0.1
  • 192.168.0.2
  • 192.168.0.3

если я снова запускаю функцию connect, то пошел цикл и добовляет в diag_menu ip из листа file_with_ips.txt по кругу выходит так

  • 192.168.0.1
  • 192.168.0.2
  • 192.168.0.3
  • 192.168.0.1
  • 192.168.0.2
  • 192.168.0.3
  • 192.168.0.1
  • 192.168.0.2
  • 192.168.0.3

необходимо выводить только то что есть в файле

vbox
() автор топика
Ответ на: комментарий от slowpony

Не вы не поняли! Делоне ssh соединение. Проблема в том, что сколько бы раз я не запустил функцию connect, диалоговое меню не очищает содержимое а добавляет

vbox
() автор топика
Ответ на: комментарий от vasyan

local diag_menu=«»

Очищение в local — по умолчанию. А вообще, как-то странно Вы кодируете. Вот тоже самое на ash. Можете подумать, почему даже без башизмов тоже самое получается при желании короче и яснее.

#!/bin/ash

connect() {
  local user=$1 pass=$2 i=1 diag_menu
  while read ip; do
    local "ip_$i=$ip"
    diag_menu="$diag_menu $i $ip"
    i=$(($i+1))
  done < file_with_ips.txt
  answer="$(dialog --stdout --backtitle SSH --menu Servers: $(($i+7)) 40 $i $diag_menu)"
  if [ "$answer" ]; then
        eval i=\$ip_$answer
        sshpass -p "$pass" ssh -o StrictHostKeyChecking=no -X "$user@$i"
  fi
}
connect USER PASSWORD
(Последний if — защита от «Cansel» в dalog)

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

спасибо что добавил и свой вариант, нет предела совершенству, а от Васяна ждать тонкой материи не стоит )

vasyan
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.