LINUX.ORG.RU
ФорумTalks

Быдлокодинг на скриптах - как избавиться?

 , , ,


0

2

Заметил за собой - когда пишу <что угодно>, сразу вижу, как оное можно написать на шеллскриптах, причем гораздо быстрее. При этом здраво понимаю, что это и тормозит, и ненадежно,и плохо переносимо, и обладает еще кучей недостатков. Но в результате так и пишу на sh. Как преодолеть эту тупую тягу к быдлокодингу?

★★★★★

Ответ на: комментарий от crowbar

Сомневаюсь, что меня это исправит. Я один из тех фееричных людей, которые редко учатся даже на своих ошибках.

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

Да. Что он вообще должен делать? Выкидывать пользователя, если он зашел после некоего времени суток, что ли?

А не проще его не пускать, не? У вас в системе pam_time (/etc/security/time.conf) не доступен?

Zmicier ★★★★★
()

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

в чём проблема?

При этом здраво понимаю, что это и тормозит, и ненадежно,и плохо переносимо, и обладает еще кучей недостатков.

при чём тут скрипты?

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

Короче, здесь сам подход звездец, но в качестве иллюстрации того, о чем речь шла, вот:

Было (не проверял):

#!/bin/bash
set -o nounset

TIME="$1"
BLOCK="$2"

if [ $TIME != "" && $BLOCK != "" ]; then
    while true ; do
        if [ $(who | grep $BLOCK) != "" ]; then
            LOGONTIME="$(who | grep $BLOCK | awk '{print $4;}' | tr -d ':')"
            if [ $(($LOGONTIME > $TIME)) ]; then
                for j in $(ps -u $BLOCK -o pid); do
                    if [ $(echo $j | tr -d " ") != "" ]; then
                        kill $j
                    fi
                done
            else
                sleep 10
            fi
        else
            sleep 10
        fi
    done
else
    exit 1
fi

exit 0

Стало (а тоже не проверял):

#!/bin/bash
set -o nounset

TIME="$1" # E. g. 09:30, да с двоеточием.
BLOCK="$2"

[[ $TIME && $BLOCK ]] || exit 1

whoandwhen() {
    declare -g -A WHEN=()
    local __ user time
    while read user __ __ time __; do
        WHEN[$user]="$time"
    done < <(who)
}

while whoandwhen; do
    if [[ ${WHEN[$BLOCK]} > $TIME ]]; then
        pkill -u "$BLOCK"
    else
        sleep 10
    fi
done
Zmicier ★★★★★
()

а мне нравится баш, он няшный

питон, конечно, няшнее, но для моих задач избыточен, к тому же однажды я переписал пару своих скриптов с баша на питон и получил увеличение времени выполнения в 2-3 раза

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

Да, кикать пользователя путем прибивания всех его процессов.

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

Логика плохо понятна, а жаль =(

DeadEye ★★★★★
() автор топика

Пиши на перле. Там тоже можно быдлокодить, но со временем потянет модульно все делать. Кроме того на sh можно и не быдлокодить, если свято соблюдать unix мантру.

zloelamo ★★★★
()

переходи на питон, что-ли?

Shadow ★★★★★
()
Ответ на: комментарий от DeadEye

https://bitbucket.org/RADDyomin/raddutils/src/b7d7e98b069db1a22b57cfc789d849a...
Вот, например. Феерический звиздец, правда? Я его даже тестировать боюсь...

Не так все и плохо. Только проверки используя grep не совсем правильные, имя пользователя может совпадать с частью имени другого т.е. если есть пользователь «a» то все у которых есть в имени «а» попадут под раздачу, например мой ник anc будет среди них, но в конечном счете на результат это не повлияет.

А вот предназначение этого скрипта мне не понятно, если не секрет расскажите зачем он? Точнее по коду понятно, я могу залогиниться с 00:00 и работать до какого-то времени, но вот где это применимо?

PS Да, awk grep легко заменяются на sed и еще, что бы awk не тащить можно на cut заменить.

anc ★★★★★
()
Ответ на: комментарий от DeadEye

PAM - зло! Патрик не одобряет! Брось эту каку.

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

Это я пытался написать подобие родительского контроля. Пока еще не дописал - додумываю, как его переписать для реализации работы после 12 часов ночи, для того, чтобы ребут не давал снова логиниться юзеру...
Работы еще много, в общем.

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

Тогда тебе вообще не нужно время логина, нужен только юзер и текущее время. Все кто залогинен в этот период киляются. Или я все-таки не понял задачу?

anc ★★★★★
()
Последнее исправление: anc (всего исправлений: 1)
Ответ на: комментарий от anc

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

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

Тогда сравнение полного даты/времени логина с текущей датой. Вроде профит получается. А стартовать как раз можно на старте системы там все равно проверка по всем юзверам идет. Итого не вижу проблемы, или опять что-то не до понял.

anc ★★★★★
()
Ответ на: комментарий от DeadEye

Там нет сравнения с датой, а только с временем суток. Если нужно органичивать по времени от логина до килла, то лучше полное время использовать вместе с датой.

anc ★★★★★
()
Ответ на: комментарий от DeadEye

btw к твоему скрипту, за название переменных TIME, DATE и т.д. я вообще бы програмистов убивал еще в младенчестве

Немного подправлю твой скрипт, что бы было понятно

DIFFTIME='120' # время в минутах через сколько надо юзвера кильнуть.

LOGONTIME=«$(who | grep $BLOCK | awk '{print $4;}' | tr -d ':')»

не будет работать в случае если несколько одинаковых юзверов залогинено
меняем на

who | grep $BLOCK | awk '{print $3,$4}' |
while read LDT; do
# LDT - получаем дату и время логина
CDT=$(date +'%Y%m%d%H%M' -d «+$DIFFTIME minutes $LDT»)
# CDT - получаем дату и время когда надо выкинуть пользователя
LDT=$(echo $LDT | sed -r 's/://g;s/-//g;s/ //g')
# теперь можно преобразовать LDT в число
Начинаем сравнивать LDT и CDT, килять пользователя и т.д. Только в баше сравнения чисел это не знаки > или <
найдеш здесь http://www.opennet.ru/docs/RUS/bash_scripting_guide/x2565.html

done

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

Спасибо за описание. В ходе чистки поправим.

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

Ну и очевидно, что инструменты следует выбирать под задачу. Я бы, скажем, не стал парсить JSON башем.

Правильно, нечего изобретать велосипед, всё уже придумано до нас:

https://github.com/dominictarr/JSON.sh

Smacker ★★★★
()
Ответ на: комментарий от dvrts

Perl - жив скорее как legacy, не на многих новых проектах ты его найдешь. Если интересно не только пользоваться, но и развиваться вместе с требованиями рынка, стоит учить python.

Смотря у кого какие задачи. В вебе к перлу интерес потерян, а в сфере предобработки/очистки данных он вполне себе живёт. Если мне надо из кучи каких-то текстовых страничек или HTML-ек вытащить, скажем, цифры экономической статистики, на кой чёрт мне сдался для этого петон? В CPAN-е есть на каждый чих по модулю, некоторые десятки лет разрабатываются и отлаживаются. Посмотрел аналогичные тем, что использую я, модули петона — от горшка два вершка, в основном все альфа-бета.

Петон педалируется сейчас, потому что это «стильно, модно, молодёжно», его стали продвигать в качестве хорошего языка для обучения программированию, при чём всех подряд. Вон, на той же Coursera посмотрите, что на книжных полках у политологов/социологов/эконометристов/нейробиологов и прочих людей, которые программируют «по необходимости» — непременно книжки по Петону. Раньше в сравнимом положении был, скажем, паскаль: до сих пор знаю людей, которые что-то делают в том же Лазарусе. А до этого бейсик. На них учили, к ним привыкали. А перл нынче (да и раньше) надо самому осваивать.

Smacker ★★★★
()
Ответ на: комментарий от Pyzia

Виртуалка - есть. Добавляем в автостарт юнит, запускающий главный скрипт. Создаем тестового пользователя, устанавливаем время блока (/etc/raddutils/block) в 10 минут. Ждем...

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

И это всё? Жаль, я думал, будет какое-то юнит-тестирование. Как быть, если скрипт разросся до 500+ строк и является частью системы скриптов, сотоящей из 2000+ строк? Как такое тестировать, не подскажете?

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

Я не знаком с юнит-тестами. Знаю лишь то, что они тестируют только определенную часть программы. Поэтому тестирую по старинке - руками.

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

Только проверки используя grep не совсем правильные, имя пользователя может совпадать с частью имени другого т.е. если есть пользователь «a» то все у которых есть в имени «а» попадут под раздачу

who | grep -P «^$BLOCK(?=\s)»

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

Я писал про конкретную реализацию, а не как можно сделать. :)
если на то пошло, то так лучше grep -E «^$BLOCK »

anc ★★★★★
()
Ответ на: комментарий от vsemnazlo

уговорили, заменить пробел на \s, но все равно правильнее, чем перл синтаксис :)

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