Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Помогите написать скрипт с циклом  (Прочитано 1485 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Uga518

  • Автор темы
  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Доброе время суток! Опять нужна помощь. Есть скрипт который перезагружает Voip шлюз Dlink7111s.
        #!/bin/bash
       /usr/bin/expect -<<EOD
       set timeout 10
       spawn telnet 192.168.xxx.xxx
       sleep 2
       expect "User:*"
       sleep 2
       send "axxx\r"
       expect "Password:*"
       sleep 2
       send "xxxxxxxx\r"
       expect ">*"
       sleep 4
       send "restart\r"
       sleep 2
       expect "Restart Now? (Y/N):*"
       sleep 2
       send "y\r"
       expect eof
 

Помогите вписать цикл в него чтобы можно было перезагружать несколько шлюзов последовательно запустив один скрипт.


ТС не появлялся на Форуме более полугода по состоянию на 13/07/2019 (последняя явка: 25/04/2016). Модератором раздела принято решение закрыть тему.
--zg_nico
« Последнее редактирование: 13 Июля 2019, 23:55:19 от zg_nico »

Оффлайн kalek

  • Активист
  • *
  • Сообщений: 267
    • Просмотр профиля
Re: Помогите написать скрипт с циклом
« Ответ #1 : 08 Апреля 2016, 09:19:27 »
Можно сделать цикл по адресам шлюзов. Что-то вроде этого
for ADDR in <список_адресов>
 do
  ...
  spawn telnet $ADDR
  ...
 done
Или нужно каждый раз разное количество шлюзов перезагружать?

Оффлайн Uga518

  • Автор темы
  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Re: Помогите написать скрипт с циклом
« Ответ #2 : 11 Апреля 2016, 08:04:34 »
Спасибо что откликнулись!!

Вот вписал в код ваше предложение. не работает. Может где ошибаюсь поправьте.

           #!/bin/bash
        /usr/bin/expect -<<EOD
        set timeout 10
        for ADDR in 149,148

            spawn telnet 192.168.8.$ADDR
            sleep 2
            expect "User:*"
            sleep 2
            send "XXX\r"
            expect "Password:*"
            sleep 2
            send "XXX\r"
            expect ">*"
            sleep 4
            send "restart\r"       
            sleep 2
            expect "Restart Now? (Y/N):*"
            sleep 2
            send "y\r"
            expect eof
      done
   
Выдает ошибку
           wrong # args: should be "for start test next command"
        while executing
      "for ADDR in 149,148"
   

Оффлайн kalek

  • Активист
  • *
  • Сообщений: 267
    • Просмотр профиля
Re: Помогите написать скрипт с циклом
« Ответ #3 : 11 Апреля 2016, 09:00:15 »
Ошибаетесь тут
Цитировать
for ADDR in 149,148
Элементы списка должны разделяться не запятой, а пробелом. И do забыли.
Цикл в общем виде так должен выглядеть
for VAR in LIST
 do
  ...
 done

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: Помогите написать скрипт с циклом
« Ответ #4 : 11 Апреля 2016, 09:08:57 »
Цитировать
        /usr/bin/expect -<<EOD
что такое?
Wars ~.o

Оффлайн Uga518

  • Автор темы
  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Re: Помогите написать скрипт с циклом
« Ответ #5 : 11 Апреля 2016, 09:34:49 »
Цитировать
        /usr/bin/expect -<<EOD
что такое?

я не сам писал скрипт. Нашел на просторах Интернета)) Пытаюсь адаптировать под себя! Без это записи он совсем не работает.

Пользователь добавил сообщение 11 Апреля 2016, 09:37:13:
Ошибаетесь тут
Цитировать
for ADDR in 149,148
Элементы списка должны разделяться не запятой, а пробелом. И do забыли.
Цикл в общем виде так должен выглядеть
for VAR in LIST
 do
  ...
 done

Исправил. Все равно ошибка(
#!/bin/bash
/usr/bin/expect -<<EOD
set timeout 10
for ADDR in 149 148
     do
        spawn telnet 192.168.8.$ADDR
        sleep 2
        expect "User:*"
        sleep 2
        send "xxx\r"
        expect "Password:*"
        sleep 2
        send "xxx\r"
        expect ">*"
        sleep 4
        send "restart\r"
        sleep 2
        expect "Restart Now? (Y/N):*"
        sleep 2
        send "y\r"
        expect eof

 done


Ошибка
invalid command name "ADDR"
    while executing
"ADDR"
    ("for" initial command)
    invoked from within
"for ADDR in 149 148"
« Последнее редактирование: 11 Апреля 2016, 09:37:13 от Uga518 »

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: Помогите написать скрипт с циклом
« Ответ #6 : 11 Апреля 2016, 10:12:46 »
Цитировать
        /usr/bin/expect -<<EOD
что такое?

должно.
/usr/bin/expect <<EOD
...
...
...
EOD
...
...
...

Wars ~.o

Оффлайн kalek

  • Активист
  • *
  • Сообщений: 267
    • Просмотр профиля
Re: Помогите написать скрипт с циклом
« Ответ #7 : 11 Апреля 2016, 11:04:59 »
Значит expect такой цикл не понимает.
Можно попробовать обойтись одним только bash. Как-нибудь так:
#!/bin/bash
for ADDR in 149 148
 do
  (sleep 3s
  echo "user_name"
  sleep 3s
  echo "password"
  sleep 3s
  echo "restart"
  sleep 3s
  echo "y"
  sleep 2s
  ) | telnet 192.168.8.$ADDR
 done
Время sleep'ов возможно придется подбирать экспериментально.
По крайней мере с роутером у меня такой скрипт работал безо всяких проблем.

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: Помогите написать скрипт с циклом
« Ответ #8 : 11 Апреля 2016, 11:43:20 »
найти  done последный эту.
done | <какую программа>
пример telnet?
done | telnet 192.168.xxx.xxx XXX
XXX это порт.
« Последнее редактирование: 11 Апреля 2016, 11:46:15 от victor00000 »
Wars ~.o

 

Страница сгенерирована за 0.038 секунд. Запросов: 23.