Вопрос или проблема
У меня есть скрипт expect, который будет подключаться по SSH к списку маршрутизаторов.
Скрипт expect работает со списком маршрутизаторов из файла и вызывается из bash-скрипта с помощью xargs.
Bash: скрипт get-rtr.sh
#!/bin/bash
/usr/bin/xargs -P 10 -L 1 -r ./get-rtr-expect.sh < ./router_list
Скрипт expect будет подключаться по SSH к 10 маршрутизаторам одновременно, пока не обработает весь список.
Expect: скрипт get-rtr-expect.sh
#!/usr/bin/expect -f
set IPaddress [lindex $argv 0]
войти на маршрутизаторы и получить конфигурации и т.д.
Я хочу передать 2 дополнительных аргумента (те же 2 для каждого маршрутизатора) в скрипт expect из bash-скрипта, чтобы в итоге скрипт expect принимал 3 аргумента, и он будет выглядеть так:
#!/usr/bin/expect -f
set IPaddress [lindex $argv 0]
set foo [lindex $argv 1]
set bar [lindex $argv 2]
войти на маршрутизаторы и получить конфигурации и т.д.
Как я могу передать эти 2 дополнительных аргумента в каждый экземпляр скрипта expect?
спасибо
ОБНОВЛЕНИЕ.
Я придумал действительно уродливый способ сделать это:
Добавить в bash-скрипт get-rtr.sh:
> router_list_temp
list=`cat router_list`
for i in `echo $list`
do
echo $i $foo $bar >> router_list_temp
done
/usr/bin/xargs -P 10 -L 1 -r ./get-rtr-expect.sh < ./router_list_temp
> router_list_temp
Я итерируюсь по списку маршрутизаторов и записываю в новый файл с добавленными аргументами. Затем подаю новый список на скрипт expect, где каждая строка — это arg0, arg1 и arg2. Затем очищаю его в конце.
Мне это совсем не нравится. Я не хочу создавать временный файл, но, похоже, это работает.
Все лучшие идеи приветствуются. Если router_list_temp могла бы быть массивом маршрутизаторов с 2 аргументами, а не файлом, это было бы лучше… все это находилось бы в ОЗУ.
Но я не знаю, как создать массив или передать его в скрипт expect.
Ответ или решение
Чтобы реализовать передачу двух дополнительных аргументов в ваш Expect скрипт без создания временного файла, вы можете рассмотреть использование конструкции printf
в сочетании с xargs
. Это позволит вам передавать все необходимые параметры непосредственно, избегая промежуточного файла и сохраняя ваш код более чистым и эффективным.
Решение
Замените текущую реализацию в вашем bash-скрипте get-rtr.sh
на следующую:
#!/bin/bash
# Определите ваши дополнительные аргументы
foo="значение_foo"
bar="значение_bar"
# Используем printf для форматирования нужных параметров
cat router_list | xargs -P 10 -I {} printf "%s %s %s\n" {} "$foo" "$bar" | xargs -n 3 ./get-rtr-expect.sh
Объяснение
-
Определение аргументов: В самом начале мы определяем переменные
foo
иbar
, которые содержат значения, которые вы хотите передать в скрипт Expect. -
Использование
printf
: Вместо создания временного файла, мы используемprintf
для форматирования строки. Для каждой строки, считанной изrouter_list
,printf
формирует строку из трех элементов: IP-адреса, значенияfoo
и значенияbar
. -
Передача данных в
xargs
: Используя второй вызовxargs
с параметрами-n 3
, мы указываем, что каждая группа аргументов, содержащая три элемента, будет передана вget-rtr-expect.sh
. Параметр-I {}
позволяет заменить{}
на текущую строку, чтобы правильно передать каждый IP-адрес и два дополнительных аргумента.
Скрипт Expect
Ваш Expect скрипт get-rtr-expect.sh
, как вы уже упомянули, должен выглядеть следующим образом:
#!/usr/bin/expect -f
set IPaddress [lindex $argv 0]
set foo [lindex $argv 1]
set bar [lindex $argv 2]
# Логинимся на маршрутизаторы и получаем конфигурации
Преимущества подхода
-
Эффективность: Вы избегаете создания временного файла, что повышает производительность и уменьшает использование дискового пространства.
-
Читаемость: Код становится более чистым и легким для понимания, так как все действия выполняются в одном контексте.
-
Гибкость: Легко изменять значения
foo
иbar
, просто обновляя переменные в скрипте.
Заключение
Этот метод позволяет более элегантно решить задачу передачи нескольких аргументов в Expect скрипт без необходимости создания временных файлов. Убедитесь, что скрипт выполняется в среде, где установлен как bash
, так и expect
, чтобы избежать неожиданных ошибок при выполнении.