Ожидайте скрипт с Xargs и несколькими параметрами

Вопрос или проблема

У меня есть скрипт 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

Объяснение

  1. Определение аргументов: В самом начале мы определяем переменные foo и bar, которые содержат значения, которые вы хотите передать в скрипт Expect.

  2. Использование printf: Вместо создания временного файла, мы используем printf для форматирования строки. Для каждой строки, считанной из router_list, printf формирует строку из трех элементов: IP-адреса, значения foo и значения bar.

  3. Передача данных в 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, чтобы избежать неожиданных ошибок при выполнении.

Оцените материал
Добавить комментарий

Капча загружается...