URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7565
[ Назад ]

Исходное сообщение
"Получить данные telnet-ом с удаленного сервера"

Отправлено Andrei_V , 27-Авг-08 21:39 
Задача состоит в том, чтобы построить с помощью 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  и именно последнее значение?

Заранее благодарен за подсказки.


Содержание

Сообщения в этом обсуждении
"Получить данные telnet-ом с удаленного сервера"
Отправлено ANF , 28-Авг-08 18:59 
Если спецы молчат, то рискну предположить -
>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



"Получить данные telnet-ом с удаленного сервера"
Отправлено Andrei_V , 28-Авг-08 20:21 
>Попробуйте так -
>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)



"Получить данные telnet-ом с удаленного сервера"
Отправлено ANF , 28-Авг-08 22:59 
А если эдак -
echo -e "$(grep -c . /proc/net/ip_conntrack)\r"

"Получить данные telnet-ом с удаленного сервера"
Отправлено Andrei_V , 29-Авг-08 22:10 
>А если эдак -
>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)


"Получить данные telnet-ом с удаленного сервера"
Отправлено anf , 29-Авг-08 23:40 

>
>Ругается:
>

Локально то, хоть работает?
Давай вернёмся к первоначальному варианту, но чуть изменим -

send "cat /proc/net/ip_conntrack | wc -l ""\r"

у меня локально с echo это работает, но как будет с send?
И попробуй опцию -s к send подставить.
Что, никакого описания синтаксиса?


"Получить данные telnet-ом с удаленного сервера"
Отправлено Andrei_V , 08-Сен-08 08:19 
Посоветовали сделать так:

#!/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"


"Получить данные telnet-ом с удаленного сервера"
Отправлено Andrei_V , 08-Сен-08 09:45 
>[оверквотинг удален]
>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-ом с удаленного сервера"
Отправлено anf , 10-Сен-08 17:36 
<<"Получить данные telnet-ом с удаленного сервера">>
А вы не боитесь пользоваться телнетом?
Обратите внимание на plink, pscp, psftp из пакета putty.
В этом случае и канал защищенный и нет мучений с expect.

"Получить данные telnet-ом с удаленного сервера"
Отправлено Andrei_V , 11-Сен-08 06:21 
>А вы не боитесь пользоваться телнетом?

Ну телнет-то все равно нужен - иногда приходится конфигурить. Он прикрыт ACL-ем и длинным цифро-буквенным паролем. К тому же не уверен, что этот роутер, не поддерживающий snmp, поддерживает plink, pscp, psftp.


"Получить данные telnet-ом с удаленного сервера"
Отправлено anf , 12-Сен-08 00:10 
>Ну телнет-то все равно нужен

Дык, а putty 22 порт тот-же телнет, только трафик шифрованный.
Плюс консоль как на ладони.


"Получить данные telnet-ом с удаленного сервера"
Отправлено sphsop , 17-Апр-09 01:58 
Народ, а всё-таки, как отдать mrtg именно заветную циферку? У меня подобная проблема -- скрипт отдаёт две циферки в две строчки, а в mrtg попадает две единицы...

"Получить данные telnet-ом с удаленного сервера"
Отправлено Andrei_V , 17-Апр-09 07:18 
>Народ, а всё-таки, как отдать 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>