LINUX.ORG.RU

Вывод из bash передать скрипту expect

 ,


0

1

Доброго всем добрым людям!

Стоит задача по опросу из таблицы mariadb (здесь получаю ip-адреса коммутаторов) выполнить на каждом ряд операций. Могу в bash-скрипте выполнить поток expect, но иначе как через аргумент командной строки передать ему каждый из полученных ip-адресов не нашел как. В этом случае тоже проблема , например, надо переменной HOSTS присвоить значение итога выполнения всего скрипта:

HOSTS=$(expect -c '
spawn /usr/bin/mysql -u sa -pAccessp
expect ">"
send "Use Cisco;\n"
expect ">"
send "select IP_switch from Commutator;\n "
expect ">"
set results $expect_out(buffer)
send "exit\n"')

for H in $HOSTS
./expect.exp $H
done

И конечно, оно так не присваивается. Я прям не ожидал, что между bash и expect внутри него не предусмотрели передачу общей «глобальной» переменной. И экспорт полученного results непонятно как выполнить.

Как же решить это?



Последнее исправление: DrBim (всего исправлений: 1)

А скажи-ка, нахрера, а главное - зачем для заполнения переменной HOSTS использовать expect?!

Консольному клиенту mysql можно передать запрос непосредственно с командной строки.

aol ★★★★★
()

expect это tcl (внезапно, да?)...

package require expect
package require tdbc::mysql
## далее делаете запросы в DB,
## от них expect`ом ведёте диалоги с коммутаторами
## если нужны переменные шел, то они в массиве $::env
MKuznetsov ★★★★★
()
Ответ на: комментарий от EXL

Там получается два экземпляра spawn, один для подключения к БД (results), другой для подключения к коммутаторам внутри цикла подставления ip из каждой итерации опроса results. Успешно запустить еще один экземпляр spawn внутри другого цикла у меня не получилось даже синтаксически, и также не передается переменная из цикла.

Попробую покурить tdbc::mysql.

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

Toxo2

[code] #!/bin/bash HOSTS=$(/usr/bin/mysql -u 1 -p1111111 -D Cisco -e «SELECT GROUP_CONCAT(IP_switch SEPARATOR ’ ’) FROM Commutator;» -N -B) for H in $HOSTS do echo $H done [/code]

Понял, спасибо.

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

package require tdbc::mysql для меня пока сложновато

на самом деле всё очень просто. См https://wiki.tcl-lang.org/page/TDBC

два последних абзаца подряд, ровно про то что вы хотите; позволю процитировать:

If you have a MySQL database, the driver (and perhaps the mysql software?) installed:

package require tdbc::mysql
tdbc::mysql::connection create db -user joe -passwd sesame \
    -host 127.0.0.1 -database customers

Simple Querying

set name "O'Hara"
db foreach rec { SELECT firstname FROM customers WHERE surname = :name } {
    puts "Found \"[dict get $rec firstname]\" in the customers table"
}

даже и добавить нечего, ровно в точности ваш вопрос : соедиться с базой, сделать простой SELECT и получить его результаты.

думаю что после праздника, с ясной головой быстро разберётесь что и как

MKuznetsov ★★★★★
()
Ответ на: комментарий от Toxo2

не знаю почему, но всегда каноничным считал такой вариант, хотя сути это не меняет, но если придут старшие и не сделаешь так - заругают)

while read -r Host; do
         
 echo $Host
         
done < <(mysql --login-path=bla-bla -Nse \
            "use database; SELECT bla-bla;")
nerve ★★
()
18 февраля 2023 г.
Ответ на: комментарий от nerve

сути это не меняет

Поменяет, если хостов будет очень много. В первом варианте надо будет сначала их все вычитать и положить в $HOSTS, а тут можно сразу обрабатывать их по мере поступления из базы.

kmeaw ★★★
()