LINUX.ORG.RU

Вышла новая версия empty-0.6.5b


0

0

empty - replace TCL/Expect with a simple shell-tool

Утилита empty предназначена для замены TCL/Expect (позволяет запускать и управлять интерактивными программами из sh-скриптов)

Новые возможности: - Полное логирование ввода-вывода сессии исполняемого процесса - Листинг вывода сессии исполняемого процесса построчно или поблочно - исправлен баг в вызове функции getopt() в Linux - Протестировано под FreeBSD-6.0

Просьба оттестировать и высказаться, желательно без упоминания яда.

>>> Подробности



Проверено: Shaman007 ()
Ответ на: комментарий от gr_buza

Скорее на С :) Но, затачивалось специально чтобы пользоваться из шелла. Синтаксис только другой, чем в expect'е, соответственно. И возможностей пока меньше. А багов, думаю, по-больше :)

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

Во-первых, спасибо за конструктивную деятельность.

> Есть повод пересмотреть свои привчки :)

Хорошо, но не мог бы ты сделать небольшой, простите за слово такое, промоушн?
Кинь сюда пожалуйста пример сценария с простейшей ветвью обработки ошибки? Сложно ли и возможно ли средствами твоего empty реализовать удалённую инсталляцию?
Пример:
1. идем rlogin'ом на host1.com
2. запускаем sh ~/inst/start.sh
3. ждём запроса имени "name:"
4. если 3. успешно, отдаём $LOGNAME и завершаем работу
5. (в противном случае) исполняем скрипт sh ~/inst/notifyAdmin и переходим в диалоговый режим (остаёмся на host1 и, не разрывая соединения, предоставляем возможность разбираться дальше подошедшему администратору).

Можно такое соорудить?

Wotson
()
Ответ на: комментарий от Wotson

Прочёл статью - http://www.opennet.ru/base/dev/interactive_tools.txt.html
Напрасно на неё нет ссылки на sourceforge.
(Да, это http://www.opennet.ru/base/df/kidnaping.txt.html тоже прочёл)

Вопрос: я решал описанные в статье проблемы путём заворачивания отдельных подзадач в отдельные expect скрипты и вызовом этих подскриптов из главного shell скрипта. Чем этот способ плох? В конце концов, скриптовый вывод отлично ловится командой script, если другие пути почему-то не устраивают - чего же ещё не хватает? Разве что, общее количество файлов возрастает, но, с точки зрения модульности, в этом только плюс. Я чего-то не догоняю?
Маленькое уточнение - expect отлично умеет использовать параметры коммандной строки, учитывая эту особенность, разве мы не получаем, что empty - прямой и всесторонний аналог expect'a?
Выгоды туманны. Да, вероятно empty несколько легче expect'a (дисковое пространство не в счёт, там empty несомненно легче), но expect за годы разработки прекрасно оттестирован, а стало быть - надёжен. И если подойти формально, параметры командной строки empty - это тоже в какой-то мере "язык", пусть и много проще TCL. Но проще ровно в той мере, в которой нужно знать TCL для программирования аналогичной, предлагаемой empty, функциональности. (так, последнее предложение черезчур заумно - я случайно)

Wotson
()
Ответ на: комментарий от Wotson

Во-первых, спасибо! Конечно можно! Пример скрипта напишу за выходные, если домашние позволят :)

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

Бесспорно отличный способ. Так обычно и делается :)

Но, если есть куча expect-модулей для perl, php и пр., видимо это кому-то нужно, и почему бы в этом случае не реализовать похожий интерфейс для использования в generic-sh? Кроме того, необходимо учитывать, что изначально empty была написана для конкретной задачи. Это уже потом я ее начал "развивать" just 4 fun. И я сам был удивлен, что empty начала пользоваться некоторой популярностью. Так, что пусть будет больше альтернатив :)

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

>Заранее спасибо за ответ и ещё раз спасибо за программу, вне зависимости пригодится она мне или нет.

Незачто :)

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

> Но, если есть куча expect-модулей для perl, php и пр., видимо это
> кому-то нужно, и почему бы в этом случае не реализовать похожий
> интерфейс для использования в generic-sh?

Ага, понял.

> Кроме того, необходимо учитывать, что изначально empty была
> написана для конкретной задачи.

А вот тут не понял. Почему задачу нельзя было решить средствами expect? В чем такая существенная разница? Ну кроме, понятно, удобства. Задача без empty была в принципе не решаемой?

Wotson
()
Ответ на: комментарий от Wotson

>А вот тут не понял. Почему задачу нельзя было решить средствами expect? В чем такая существенная разница? Ну кроме, понятно, удобства. Задача без empty была в принципе не решаемой?

Вот тут написано: http://www.opennet.ru/base/df/kidnaping.txt.html :)

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

Да что тут расжевывать. Были критичны размеры. Заказчик так хотел. С TCL-ем мы не пролазили.

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

#!/bin/sh

# Обещанный пример. Правда поскольку времени у меня не было, он не 
# про то, что вы просили :) Однако некая демонстрация возможностей 
# присутствует.
# 
# Скрипт читает список хостов из $hosts и для каждого хоста 
# выполняет некие команды.
#
# Пример написан грубо и на плохом sh и awk, без обработок
# исключений и ошибок. Проверялось на Solaris 8-9 на 22-х хостах.
# Автор к сожалению неизвестен. Используйте на свой страх и риск. 

empty="/tmp/bin/empty"
log="/tmp/empty.log"
hosts="/tmp/empty.hosts"

login="luser"
passwd="TopSecret"

t_host="DO NOT REMOVE THIS VALUE"       # Please, do not remove it
offset=0                                # first host in the $hosts file
tmp="/tmp/empty.tmp"                    # Just a temp file
in="/tmp/empty.in"
out="/tmp/empty.out"

get_next_host()
{
        offset=`expr $offset + 1`
        t_host=`nawk -v offset=$offset '{ if (NR == offset) print $0 }' $hosts`
}

logon()
{
        wearein=0
        $empty -f -i $in -o $out -L $log.$t_host ssh $login@$t_host
        $empty -w -i $out -o $in "assword" $passwd "yes/no" "yes"
#
# Не реализована обработка ветвления алгоритма
#
        $empty -w -i $out -o $in "assword"
        if [ $? -ne 255 ]; then
                kill $pid
                break
        else
                # Guess we are in
                wearein=1
        fi
}

emexec()
{
        # set PROMPT to default
        $empty -s -o $in "export PS1=EMPTY "
# COMMANDS TO HOST
        $empty -w -o $in -i $out EMPTY 'export PATH=$PATH:/sbin:/usr/sbin'
        $empty -w -o $in -i $out EMPTY 'sudo /usr/sbin/xpinfo -d'
        $empty -w -i $out -o $in assword $passwd
# ^^^^^^^^^^^^^^^^
        # logoff
        $empty -s -o $in "echo this is the end"
        $empty -w -t 2400 -i $out -o $in EMPTY "exit"
}

while (true); do
        get_next_host

        if [ "$t_host" = "" ]; then
                echo "Done operations"
                break
        fi

        logon
        if [ $wearein -eq 1 ]; then
                emexec
        else
                echo "Giving up with host $t_host"
        fi
done

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

Кстати, еще один неприятный баг с семафорами пофиксен. Спасибо Dmitry S. Vlasov (vlasov (at) quantum.ru) за его поимку.

mezantrop
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.