Задача состоит в том, чтобы построить с помощью mrtg графики изменения некоторых величин, которые надо получать с удаленного сервера, не поддерживающего snmp. Эти величины можно получить зайдя на этот сервер telnet-м.Например, получить с сервера кол-во коннектов через него в данный момент веремени.
Сделал так:
На сервере (Debian), где строится mrtg в mtrg.cfg создал секцию:
## >> Descr: '' | Name: 'elf2-ree_connections' | Ip: '' | Eth: '' ###
Target[elf2-ree_connections]: `/etc/elf2-ree_connections.sh`
YLegend[elf2-ree_connections]: elf2-ree_connections
ShortLegend[elf2-ree_connections]: connections
MaxBytes[elf2-ree_connections]: 63492
Options[elf2-ree_connections]: gauge, nopercent, growright
Title[elf2-ree_connections]: elf2-ree_connections
PageTop[elf2-ree_connections]: <H1>elf2-ree_connections</H1>В файле /etc/elf2-ree_connections.sh написан скрипт, который идет на другой сервер-роутер 87.226.ххх.ххх (Linux 2.4.22 ((none)), BusyBox v0.60.5 (2004.03.04-14:03+0000) Built-in shell (ash) ):
#!/usr/bin/expect
spawn telnet 87.226.ххх.ххх
expect {*login:}
send "root\r"
expect {*password:}
send "хххххх\r"
expect {*#}
send "cat /proc/net/ip_conntrack | wc -l\r"
expect {*#}
send "exit\r"Однако в mrtg возвращается всегда "1" (единица). При этом если ручками зайти телнетом на 87.226.ххх.ххх и выполнить команду
cat /proc/net/ip_conntrack | wc -l
то искомая величина выдается на консоль. Как эту же величину скормить mtrg ?PS.
Попутно: таким же образом надо забрать последнее значение, выдаваемое командой# uptime
9:28am up 1 day, 7:11, load average: 0.29, 0.62, 0.97Как скормить mtrg и именно последнее значение?
Заранее благодарен за подсказки.
Если спецы молчат, то рискну предположить -
>send "cat /proc/net/ip_conntrack | wc -l\r"Здесь возникает ошибка и потому -
>Однако в mrtg возвращается всегда "1" (единица).и потому возвращается её значение - 1
Попробуйте так -
send "a=$(cat /proc/net/ip_conntrack | wc -l)"
send "echo "$a\r"
Не лучше ли заменить перевод каретки на перевод строки? И ещё echo на некоторых OS требуется опция -е.
>таким же образом надо забрать последнее значение, выдаваемое командой
>
># uptime
> 9:28am up 1 day, 7:11, load average: 0.29, 0.62, 0.97Если имеется в виду значение 0.97 и там всегда 4 символа то так -
b=$(uptime); echo ${b: -4}
иначе можно так -
uptime | cut -d ',' -f6
>Попробуйте так -
>send "a=$(cat /proc/net/ip_conntrack | wc -l)"
>send "echo "$a\r"ругается:
# can't read "(cat /proc/net/ip_conntrack | wc -l)": no such variable
while executing
"send "a=$(cat /proc/net/ip_conntrack | wc -l)""
(file "./elf2" line 26)
А если эдак -
echo -e "$(grep -c . /proc/net/ip_conntrack)\r"
>А если эдак -
>echo -e "$(grep -c . /proc/net/ip_conntrack)\r"Ругается:
# can't read "(grep -c . /proc/net/ip_conntrack)": no such variable
while executing
"echo -e "$(grep -c . /proc/net/ip_conntrack)\r""
(file "./elf2" line 12)
>
>Ругается:
>Локально то, хоть работает?
Давай вернёмся к первоначальному варианту, но чуть изменим -send "cat /proc/net/ip_conntrack | wc -l ""\r"
у меня локально с echo это работает, но как будет с send?
И попробуй опцию -s к send подставить.
Что, никакого описания синтаксиса?
Посоветовали сделать так:#!/usr/bin/expect
log_user 0
spawn telnet 87.226.ххх.ххх
expect {*login:}
send "root\r"
expect {*password:}
send "хххххх\r"
expect {*#}
send "cat /proc/net/ip_conntrack | wc -l\r"
log_user 1
expect {*#}
send "exit\r"
>[оверквотинг удален]
>spawn telnet 87.226.ххх.ххх
>expect {*login:}
>send "root\r"
>expect {*password:}
>send "хххххх\r"
>expect {*#}
>send "cat /proc/net/ip_conntrack | wc -l\r"
>log_user 1
>expect {*#}
>send "exit\r"Этот скрипт поместил в файл /etc/elf2_connections.
Нужное число скрипт в консоль выдает, а в mrtg затолкать его не получается.
В консоли видно вот что:
spawn telnet 87.226.х.х
Trying 87.226.х.х...
Connected to 87.226.х.х.
Escape character is '^]'.Linux 2.4.22 ((none)) (14:58 on Friday, 24 November 2034)
login: root
Password:
BusyBox v0.60.5 (2004.03.04-14:03+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.# cat /proc/net/ip_conntrack | wc -l
8412Вот эти 8412 и надо отобразить в mrtg. А на самом деле туда попадает какое-то совершенно случайное число.
В mrtg пытаюсь отдать это число строкой:
Target[elf2_connections]: `/etc/elf2_connections`
<<"Получить данные telnet-ом с удаленного сервера">>
А вы не боитесь пользоваться телнетом?
Обратите внимание на plink, pscp, psftp из пакета putty.
В этом случае и канал защищенный и нет мучений с expect.
>А вы не боитесь пользоваться телнетом?Ну телнет-то все равно нужен - иногда приходится конфигурить. Он прикрыт ACL-ем и длинным цифро-буквенным паролем. К тому же не уверен, что этот роутер, не поддерживающий snmp, поддерживает plink, pscp, psftp.
>Ну телнет-то все равно нуженДык, а putty 22 порт тот-же телнет, только трафик шифрованный.
Плюс консоль как на ладони.
Народ, а всё-таки, как отдать mrtg именно заветную циферку? У меня подобная проблема -- скрипт отдаёт две циферки в две строчки, а в mrtg попадает две единицы...
>Народ, а всё-таки, как отдать mrtg именно заветную циферку? У меня подобная
>проблема -- скрипт отдаёт две циферки в две строчки, а в
>mrtg попадает две единицы...С линух-сервера я получаю скриптом (лежит в файлике /etc/ebox_cpu_util):
#!/bin/sh
echo `uptime | sed -e 's/.*, //'` \*100 | bcСоответственно в mrtg.cfg:
Target[ebox_cpu_util]: `/etc/ebox_cpu_util`
YLegend[ebox_cpu_util]: ebox_cpu_util
ShortLegend[ebox_cpu_util]: %
MaxBytes[ebox_cpu_util]: 100
Options[ebox_cpu_util]: gauge, nopercent, growright
Title[ebox_cpu_util]: ebox_cpu_util
PageTop[ebox_cpu_util]: <H1>ebox_cpu_util</H1>