Взаимодействие двух программ с вводом/выводом в консоль

Модератор: Модераторы разделов

altlogic
Сообщения: 59
ОС: SuSe

Взаимодействие двух программ с вводом/выводом в консоль

Сообщение altlogic »

Здравствуйте!

Стоит следующая задача. Имеется программа мониторинга состояния оборудования сервера (HP ILO). Получить доступ к этой программе можно по ssh. Вводя с консоли определённые запросы в программу получаем информацию о состоянии оборудования.
Серверов много, а информацию надо собирать часто (контроль температуры). Решил написать программу, которая будет "заменять человека". Имею большой опыт только в Си. Подумал, что для этой задачи Си будет тяжеловат:) Решил использовать Perl.
Написал примерно следующий скрипт:

Код: Выделить всё

open $CLUSTER, "| ssh user@10.10.190.101 -T |"   #устанавливаю соединение с машиной
printf $CLUSTER "user_password";   #ввожу пароль
printf $CLUSTER "КОМАНДА_ДЛЯ_ВЫПОЛНЕНИЯ_НА_УДАЛЁННОЙ_МАШИНЕ";   #ввожу команду

Надеюсь, что скрипт по крайней мере логируется на удалённой машине и вводит пароль. Но как мне считать информацию с потока, и направить её в станадртный вывод? Я открыл поток $CLUSTER на ввод и вывод данных сразу (так можно делать?).

Решается ли эта задача на языке Perl? Я думаю, задача не такая сложная и должна иметь станадартное решение.
Спасибо сказали:
Аватара пользователя
butch
Сообщения: 331
ОС: :OC

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение butch »

altlogic писал(а):
18.06.2009 13:12
Написал примерно следующий скрипт:

смотрите в сторону expect
софт специально для вашего случая.
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение pcodr »

С ssh так просто не получится. Смотрите в сторону модуля Net::SSH::Perl если хотите сделать на Perl.
remote system type is unix
Спасибо сказали:
altlogic
Сообщения: 59
ОС: SuSe

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение altlogic »

Спасибо, за наставление на истинный путь!
Мне понравились оба подхода и expect и Net::SSH::Perl. Думаю, с использованием этих инсрументов задача решится за несколко дней. Только вот я не определился с выбором инструмента. Вроде оба несложные, но наверное expect будет лаконичнее. Думаю, что лучше освоить. Подобные задачи интерактивного взаимодействия придётся решать и в дальнейшем.
Спасибо сказали:
Mag!str
Сообщения: 16
ОС: Ubuntu 8.04

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение Mag!str »

Хотя C и был отвергнут, данная задача может быть решена с помощью вызовов pipe() и dup2(), пример есть в книге "Программирование для Linux. Профессиональный подход"
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение drBatty »

почему не bash?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
altlogic
Сообщения: 59
ОС: SuSe

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение altlogic »

drBatty писал(а):
26.06.2009 02:43
почему не bash?


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

Код: Выделить всё

#!/usr/bin/expect
set timeout 10
spawn ssh admin@10.10.190.101
expect {
    "assword: " {send "password\r"}
}
expect {
    "> " {send "SHOW ENCLOSURE TEMP\r"}
}
expect {
    "> " { send "SHOW SERVER TEMP 1\r"}
}
expect {
    "> " { send "EXIT\r"}
}


На баше за несколько дней у меня не получилось подобного. Можно ли сделать это так же просто в баше? Требований к ПО у меня никаких не было, лишь бы работало, и просто модифицировалось. На Си отказался писать из-за сложности модификации, да и просто из-за сложности программы.
Спасибо сказали:
Аватара пользователя
butch
Сообщения: 331
ОС: :OC

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение butch »

altlogic писал(а):
26.06.2009 05:51
spawn ssh admin@10.10.190.101

можно кстати использовать ключи запуска скрипта, если подключаться нужно к разным хостам:
./somescript.sh hostname
при этом в самом скрипте строка подключения будет выглядить так:
spawn ssh admin@$argv
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение drBatty »

altlogic писал(а):
26.06.2009 05:51
Можно ли сделать это так же просто в баше?

не знаю... наверное это как раз то, что надо(expect)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
altlogic
Сообщения: 59
ОС: SuSe

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение altlogic »

butch писал(а):
26.06.2009 11:15
altlogic писал(а):
26.06.2009 05:51
spawn ssh admin@10.10.190.101

можно кстати использовать ключи запуска скрипта, если подключаться нужно к разным хостам:
./somescript.sh hostname
при этом в самом скрипте строка подключения будет выглядить так:
spawn ssh admin@$argv

это была первая версия программы, для большей ясности.
Спасибо сказали:
Аватара пользователя
Shura
Сообщения: 1537
Статус: Оказывается и без KDE есть жизнь
ОС: FreeBSD 8.0-RC2

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение Shura »

Немного не в тему, но вставлю 5 копеек. Гораздо проще будет настроить ssh на беспарольную авторизацию по ключам. Т.е. ssh будет работать прозрачно, не запрашивая пароля. Как это сделать написано, например, тут: http://www.opennet.ru/tips/info/284.shtml

В итоге мы имеем нечто такое:

Код: Выделить всё

shura [/home/shura]$ ssh down ls
LML.avi
bin
boot code update.txt
boot_sdtst_td3.img
diablo-jre1.6.0
dir100_v200_hnap.bin
fullbackup-2009.05.22.tar.gz
id_rsa_shura.pub
mbox
mf.file
mf2.tst
minicom.log
pif.txt
pkgtools.conf
test.txt
text.tt
tftpd32l.zip

down - это имя машины. Так можно любую команду выполнить на удалённой машине и получить её вывод к нам в терминал.
Rock'n'roll мертв © БГ
Спасибо сказали:
altlogic
Сообщения: 59
ОС: SuSe

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение altlogic »

Shura писал(а):
01.07.2009 17:13
Немного не в тему, но вставлю 5 копеек. Гораздо проще будет настроить ssh на беспарольную авторизацию по ключам. Т.е. ssh будет работать прозрачно, не запрашивая пароля.

Не, эту фишку я знаю. Проблема в том, что на той стороне надо выполнить не команду bash. Там совсем другой интерпритатор, и общаться с ним на языке bash не получится.
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение diesel »

altlogic писал(а):
02.07.2009 11:09
Shura писал(а):
01.07.2009 17:13
Немного не в тему, но вставлю 5 копеек. Гораздо проще будет настроить ssh на беспарольную авторизацию по ключам. Т.е. ssh будет работать прозрачно, не запрашивая пароля.

Не, эту фишку я знаю. Проблема в том, что на той стороне надо выполнить не команду bash. Там совсем другой интерпритатор, и общаться с ним на языке bash не получится.

а что-то типа
echo "command1
command1" | /path/to/interpreter

на него не действует? или надо играть в вопрос/ответ?
Спасибо сказали:
altlogic
Сообщения: 59
ОС: SuSe

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение altlogic »

diesel писал(а):
04.07.2009 00:27
а что-то типа
echo "command1
command1" | /path/to/interpreter
на него не действует? или надо играть в вопрос/ответ?

а кто будет выполнять команду echo? Я так понял, что после установления ssh-соединения bash отдаёт управление другому интерпритатору, тому что на той машине. echo он выполнит после разрыва ssh соединения.
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение diesel »

altlogic писал(а):
04.07.2009 04:19
diesel писал(а):
04.07.2009 00:27
а что-то типа
echo "command1
command1" | /path/to/interpreter
на него не действует? или надо играть в вопрос/ответ?

а кто будет выполнять команду echo? Я так понял, что после установления ssh-соединения bash отдаёт управление другому интерпритатору, тому что на той машине. echo он выполнит после разрыва ssh соединения.

ммм вы имеете ввиду что на той машине стоит другой интерпретатор в качестве login shell?
допустим я поставил /usr/bin/python2.4 в качестве login shell:

Код: Выделить всё

diesel@indie:~$ echo "print '2+2=',2+2" | ssh -T  python-interp@debian
python-interp@debian's password:
2+2= 4

motd поскипал.

если же я сам вызываю интерпретатор:

Код: Выделить всё

diesel@indie:~$ echo 'echo "print \"2+2=\",2+2" | /usr/bin/python' | ssh  -T diesel@debian
     2+2= 4

возможны варианты, это не самый красивый.
Спасибо сказали:
altlogic
Сообщения: 59
ОС: SuSe

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение altlogic »

Дабы не вводить Вас в заблуждение "своими" терминами, напомню, что на той стороне - оборудование HP ILO, менеджер шасси HP, вобщем это сетевое оборудование. У него нужно запрашивать ряд параметров, типа температуры, состояния вентиляторов и другого.
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение diesel »

altlogic писал(а):
05.07.2009 07:59
Дабы не вводить Вас в заблуждение "своими" терминами, напомню, что на той стороне - оборудование HP ILO, менеджер шасси HP, вобщем это сетевое оборудование. У него нужно запрашивать ряд параметров, типа температуры, состояния вентиляторов и другого.

никогда не видел, тут вопрос вот в чем: вы когда коннектитесь туда по ssh: попадаете в shell(bash,sh,или любой другой общего назначения) и вбиваете определенные команды чтобы получить нужные параметры, или же сразу попадаете в какой-то специальный shell, в который вбиваете команды и он вам выплевывает результат?
Спасибо сказали:
altlogic
Сообщения: 59
ОС: SuSe

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение altlogic »

Скорее какой-то специальный шелл:) Там нужно выполнять команду типа

Код: Выделить всё

SERVER 1 STATUS TEMP

на что он выдаёт кучу показаний, потом нужно выполнить

Код: Выделить всё

SERVER 2 STATUS TEMP

и так далее...
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение diesel »

и что-то типа:

echo "SERVER 1 STATUS TEMP" | ssh -T user@host

не работает?
Спасибо сказали:
altlogic
Сообщения: 59
ОС: SuSe

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение altlogic »

Пока что мешает доступ через ssh по паролю. Если его убрать, то видимо и впрямь поможет!
Спасибо сказали:
Аватара пользователя
butch
Сообщения: 331
ОС: :OC

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение butch »

altlogic писал(а):
08.07.2009 02:14
мешает доступ через ssh по паролю. Если его убрать, то видимо и впрямь поможет!

ыыы =)
я expect использую для рестарта повисшего спуллера на тонких клиентах.
можно в образ кнчно внедрить ключики для ssh. но уже больше двух лет прошло как я собрал образы, и там черт его знает уже что наковырял.
экспект никого не обременяет, в общем. единственное что плохо - он хранит пароль в открытом виде.
Спасибо сказали:
altlogic
Сообщения: 59
ОС: SuSe

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение altlogic »

butch писал(а):
08.07.2009 08:47
единственное что плохо - он хранит пароль в открытом виде.

но ведь его тоже можно передавать параметром для скрипта. При желании повышении защиты и понижении автоматизации:)
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение diesel »

altlogic писал(а):
08.07.2009 11:20
butch писал(а):
08.07.2009 08:47
единственное что плохо - он хранит пароль в открытом виде.

но ведь его тоже можно передавать параметром для скрипта. При желании повышении защиты и понижении автоматизации:)

ну вообще лучше всего таки ключи... команде ssh пароль в качестве параметра передать нельзя
Спасибо сказали:
Аватара пользователя
butch
Сообщения: 331
ОС: :OC

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение butch »

diesel писал(а):
08.07.2009 12:36
команде ssh пароль в качестве параметра передать нельзя

но скрипту expect можно =)
ключи лучше. но поломать образ тонкого клиента сыкотнее.
Спасибо сказали:
altlogic
Сообщения: 59
ОС: SuSe

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение altlogic »

diesel писал(а):
06.07.2009 12:11
и что-то типа:

echo "SERVER 1 STATUS TEMP" | ssh -T user@host

не работает?


# echo "passwd newuser" | ssh -T root@host
Не работает. Для пользователя root настроен беспарольный доступ. Авот попроще,
# echo "ls" | ssh -T root@host
работает.
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение diesel »

altlogic писал(а):
16.07.2009 02:17
diesel писал(а):
06.07.2009 12:11
и что-то типа:

echo "SERVER 1 STATUS TEMP" | ssh -T user@host

не работает?


# echo "passwd newuser" | ssh -T root@host
Не работает. Для пользователя root настроен беспарольный доступ. Авот попроще,
# echo "ls" | ssh -T root@host
работает.

а команде passwd обычно можно и пароль в параметрах передать, а "введите пароль" сделать не "там" а "тут"(вполне возможно что можно сделать и чтобы диалог "того" passwd показывался - сейчас нет под рукой второй машины)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение drBatty »

diesel писал(а):
18.07.2009 23:48
а команде passwd обычно можно и пароль в параметрах передать

что-то не вижу такого ключа.

# passwd --help

passwd: неверный ключ -- - usage: passwd [-f|-s] [name] passwd [-x max] [-n min] [-w warn] [-i inact] name passwd {-l|-u|-d|-S|-e} name


это в слаке.

а вот - в мандриве:

Shell

$ passwd --help Использование: passwd [OPTION...] <accountName> -k, --keep-tokens keep non-expired authentication tokens -d, --delete delete the password for the named account (root only) -l, --lock lock the named account (root only) -u, --unlock unlock the named account (root only) -f, --force force operation -x, --maximum=DAYS maximum password lifetime (root only) -n, --minimum=DAYS minimum password lifetime (root only) -w, --warning=DAYS number of days warning users receives before password expiration (root only) -i, --inactive=DAYS number of days after password expiration when an account becomes disabled (root only) -S, --status report password status on the named account (root only) --stdin read new tokens from stdin (root only) Help options: -?, --help Show this help message --usage Display brief usage message
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение diesel »

В Федоре есть опция:

Код: Выделить всё

   --stdin
              This option is used to indicate that passwd should read the new password from standard input, which can be a pipe.

в --help она не показывается.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Взаимодействие двух программ с вводом/выводом в консоль

Сообщение drBatty »

diesel писал(а):
22.07.2009 14:42
в --help она не показывается.

Shell

[root@localhost ksu]# echo xxx | passwd --stdin root Changing password for user root. passwd: all authentication tokens updated successfully. [root@localhost ksu]# exit exit [ksu@localhost ~]$ su -c whoami Password: root

в мандриве работает!
А вот в слаке непонятно как это сделать (и возможно-ли это)
man & info посмотрел, не нашёл :(
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: