защита от вандализма. Блокировка изменения настроек. ((вопросы применения ПСПО и Линукс в школах))

Обсуждаем вопросы продвижения Linux в школах, делимся опытом, рассказываем об успехах, просим помощи

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

Аватара пользователя
Denjs
Сообщения: 1685
ОС: SuSe 10.2

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение Denjs »

Я имел в виду скрипт, который будет нести полезную функциональность, а не скрипт установки.
QDroid - Среда исполнения и фреймворк для QtScript.
OTPD - Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
Спасибо сказали:
BIgAndy
Сообщения: 1923

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение BIgAndy »

Skull писал(а):
22.09.2010 11:08
P.S. Некомпетентная активность скорее вредна, чем полезна.

+1024 за одним замечанием: Если делаешь для себя, то как бы простибельно.
А вот такими обсуждалками как раз учителей и вспугнули :D
Спасибо сказали:
DoctorORZ
Сообщения: 46

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение DoctorORZ »

Блин...
Я и горд и потерян. Горд тем, что уж никак не думал, что мою проблему будут всерьез решать и обсуждать. Потерян тем, что, как видно, никому, кроме нас (вас) эти проблемы даже незнакомы. Может я зря всё это затеял?
Я конечно некоторых моментов тут пока не понимаю (технических), но вижу - дело идет.
Может быть я не прав, если стал заморачиваться на Альт? Может быть есть более изящные дистрибутивы для моих нужд? (и с моими ТТХ?)
А вообще - спасибо вам.
Кстати, вот по поводу подачи автоматизированных звонков ПК. У кого есть рабочие схемы и софт? Есть желание используя систему экстренного оповещения (ну, или свою проложим, если удастся) сделать автоматизированную подачу звонков (мелодий) или сигналов эвакуации. Хотелось бы услышать. (заведем отдельную ветку? или в личку?)
Спасибо сказали:
BIgAndy
Сообщения: 1923

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение BIgAndy »

DoctorORZ писал(а):
22.09.2010 14:38
Кстати, вот по поводу подачи автоматизированных звонков ПК. У кого есть рабочие схемы и софт? Есть желание используя систему экстренного оповещения (ну, или свою проложим, если удастся) сделать автоматизированную подачу звонков (мелодий) или сигналов эвакуации. Хотелось бы услышать. (заведем отдельную ветку? или в личку?)

Лучше купить 16 канальный программируемый микроконтроллер и повесить его на стену. Не надо будет плат сопряжений и прочей лабуды.
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение sgfault »

Denjs писал(а):
22.09.2010 13:23
В данной TODO-шке я фактически предлагал отказаться от sudo. а от какого пользователя запускать - от рута или спец-созданного думаю - дело вторичное.


Может тогда запускать скрипт не через '#!/bin/bash', а через другую программу, которая будет запускаться с suid и делать execve() ?

Например.
Скрипт, который должен работать от рута

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

# cat ./t.sh

#!./t_exec

IFS="_"
echo ---
echo "$-"
echo "$0: '$*'"
declare -p EUID UID GROUPS


Собственно "другая программа":

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

# cat ./t_exec.c

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
    char *bash_exec[] = { "bash", "-p", NULL};
    int n_bash_exec = 0;
    char **bash_argv = NULL;
    int n_bash_argv = 0;
    int ret = 0;
    int i = 0, n_i = 0;
    char **p = NULL;

    while (bash_exec[i++]);
    n_bash_exec = i - 1;
    n_bash_argv = argc + n_bash_exec - 1;
    printf("n_bsah_exec = %d, argc = %d, n_bash_argv = %d\n", n_bash_exec, argc, n_bash_argv);

    bash_argv = (char **) malloc((n_bash_argv + 1) * sizeof(char*));
    memset(bash_argv, '\0', n_bash_argv + 1);
    i = 0;
    p = bash_exec;
A:
    while (*p) {
        n_i = strlen (*p);
        bash_argv[i] = (char *) malloc((n_i + 1) * sizeof(char));
        strncpy (bash_argv[i], *(p++), n_i);
        bash_argv[i++][n_i] = '\0';
        printf("copied [%d] '%s'\n", i - 1,bash_argv[i - 1]);
    }
    if (p != argv + argc) {
        p = argv + 1;
        goto A;
    }
    printf("bash_argv (%p):\n", bash_argv);
    for (i = 0; i <= n_bash_argv; i++)
        printf("[%d] %p: '%s'\n", i, bash_argv[i], bash_argv[i]);

    ret = execve("/bin/bash", bash_argv, NULL);
    return(ret);
}


Запускаем от пользователя

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

$ id
uid=1003(test_user1) gid=102(test_group1) groups=102(test_group1)

$ ls -l
-r-xr-xr-x 1 root       test_group1   88 2010-09-22 15:46 t.sh*
-r-sr-xr-x 1 root       test_group1 8289 2010-09-22 15:46 t_exec*

$ ./t.sh
---
hpB
./t.sh: ''
declare -ir EUID="0"
declare -ir UID="1003"
declare -a GROUPS='([0]="102")'

$ ./t.sh a b ""
---
hpB
./t.sh: 'a__b'
declare -ir EUID="0"
declare -ir UID="1003"
declare -a GROUPS='([0]="102")'


Вроде ведь то, что надо?

PS. Ну-ка, господа программисты, какую я глупость написал на этот раз? :laugh:
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21269
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение Bizdelnick »

Denjs писал(а):
22.09.2010 14:20
Я имел в виду скрипт, который будет нести полезную функциональность, а не скрипт установки.

А я имел в виду пред/постустановочный скрипт, который будет добавлять пользователя и править при необходимости конфиги. На стадии разработки же это можно и вручную делать.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Skull
Модератор
Сообщения: 2089
ОС: ALT Linux

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение Skull »

Denjs писал(а):
22.09.2010 11:38
В итоге я делаю вывод, что /etc/rc.d/rc.local - это есть прямое соответствие бубунтовскому /etc/rc.local . Я всего-лишь в лоб переписал скрипт предназначенный для бубунты. с сохранением всех авторских механизмов. И описал это в посте.
Там даже специальная ремарка есть: «Однако, в 95% случаев, то, что вы собираетесь записать в этот файл, имеет более подходящее место в системе (etcnet, правила udev и тому подобное).». Возможно, в Ubuntu и валят туда всяких хлам, но не нужно помойку тащить в другие дистрибутивы.
Есть замечания - мы все тут с удовольствием выслушаем мысли о том, почему логика автора из Индонезии, подходящая для Убунты, не подходит для alt-linux. если расскажите как это "надо делать" в Альте.
Я написал ранее — соберите пакет. Это будет технологичное дистрибутивное решение (особенно в случае автообновления с зеркала на сервере Пятой платформы).
А лучше - исправьте и опубликуйте тут новую версию.
Извините, в СПО есть более насущные проблемы.
Критика должна быть конструктивна.
Внимательно читайте то, что Вам пишут, обращая внимание на каждое слово. У специалистов нет времени, чтобы разжёвывать очевидные вещи.
А есть разница в итоге? результат от "запрещена" и от "настроена по умолчанию" - результат один: нельзя делать sudo.
Глупости с точки зрения непосредственной работы. Без нахождения в группе wheel (и установки control sudo wheelonly) вы вообще sudo не запустите, а без настройки вы сможете запустить, только посмотреть пустой список правил.

Видите некомпетентность, ошибку ? не надо тыкать и глумиться. Надо рассказать как должно быть, если уж вы считаете себя более компетентным. Не говоря о том, что все люди ошибаются.
Не учите людей жизни. Вы же сам первый нарушаете это правило, и, не разобравшись, ввязываетесь в спор.
Мы что-то пытаемся делать, а не сидим и ждем с моря погоды. "Частное, пусть даже полуработающее решение от дилетанта лучше, чем отсутствие решения от аттестованного специалиста"
И что будет на выходе? Заметка на форуме, о которой все забудут через месяц? Не преувеличивайте ценность своей активности.

DoctorORZ писал(а):
22.09.2010 14:38
Может быть я не прав, если стал заморачиваться на Альт? Может быть есть более изящные дистрибутивы для моих нужд? (и с моими ТТХ?)
Поверьте, грамотное решение проблемы не зависит от дистрибутива. Просто в сообществе ALT Linux быстрее покажут, что данное решение недистрибутивно или небезопасно. Мне жаль, что за решение проблем берутся активные дилетанты с привычками Windows, плодящие подпорки.
Skull
Спасибо сказали:
Аватара пользователя
Denjs
Сообщения: 1685
ОС: SuSe 10.2

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение Denjs »

Bizdelnick писал(а):
22.09.2010 15:52
Denjs писал(а):
22.09.2010 14:20
Я имел в виду скрипт, который будет нести полезную функциональность, а не скрипт установки.

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

Я вас понял. Про установщик - я полностью с вами согласен.

Skull писал(а):
22.09.2010 17:34
Denjs писал(а):
22.09.2010 11:38
В итоге я делаю вывод, что /etc/rc.d/rc.local - это есть прямое соответствие бубунтовскому /etc/rc.local . Я всего-лишь в лоб переписал скрипт предназначенный для бубунты. с сохранением всех авторских механизмов. И описал это в посте.
Там даже специальная ремарка есть: «Однако, в 95% случаев, то, что вы собираетесь записать в этот файл, имеет более подходящее место в системе (etcnet, правила udev и тому подобное).». Возможно, в Ubuntu и валят туда всяких хлам, но не нужно помойку тащить в другие дистрибутивы.
Я читал заметку, и не нашел более удобного места.
Вы можете предложить "лучшее" место в дистрибутиве для команды восстановления каталога пользователя при загрузке? Почему не предлагаете? это будет уже конструктивно.

Skull писал(а):
22.09.2010 17:34
Есть замечания - мы все тут с удовольствием выслушаем мысли о том, почему логика автора из Индонезии, подходящая для Убунты, не подходит для alt-linux. если расскажите как это "надо делать" в Альте.
Я написал ранее — соберите пакет. Это будет технологичное дистрибутивное решение (особенно в случае автообновления с зеркала на сервере Пятой платформы)

Я вас вообще-то спрашивал "про /etc/rc.local" (+см выше). Пакет собирать пока не из чего, и я об этом уже писал. Сделаем нормальны скрипт и поймем как его лучше всего запускать/использовать - сделаем пакет. и будет ваше "технологичное дистрибутивное решение".

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

Ну что же вы не решаете эти проблемы, уважаемые? почему же вы создаете дистрибутивы, которым "нужны подпорки и костыли"? а?
В итоге - решаем эти проблемы мы. Подпорками и костылями.
Потому что даже дилетантское решение проблемы - это решение проблемы, а не отмазка в стиле
Извините, в СПО есть более насущные проблемы.
.

Вы же - вместо того, что бы помочь или направить эту "сумасбродную деятельность" - и получить в итоге "нормальное технологическое решение" отмазываетесь всеми силами и средствами, называете "дилетантами с привычками виндоус", и фактически - пытаетесь завалить на корню инициативу, которая направлена на решение вполне конкретных проблем.

это официальная позиция Альта в отношении людей/сообщества которые пытается решать "проблемы внедрения на местах" вашего дистрибутива, или ваша самодеятельность? прекратите уже?
или помогайте конкретными техническими советами, или устранитесь пожалуйста.

Ежели будет сделано работающее устраивающее заказчика решение - мы и пакет оформим и на хостинге разработку оформим и т.п. все будет, как надо, не волнуйтесь. Только не мешайте, ок?
QDroid - Среда исполнения и фреймворк для QtScript.
OTPD - Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
Спасибо сказали:
Аватара пользователя
Skull
Модератор
Сообщения: 2089
ОС: ALT Linux

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение Skull »

Denjs писал(а):
22.09.2010 18:02
Я читал заметку, и не нашел более удобного места.
Вы можете предложить "лучшее" место в дистрибутиве для команды восстановления каталога пользователя при загрузке? Почему не предлагаете? это будет уже конструктивно.
Это очевидно — нужно писать модуль PAM. Это будет правильное и красивое решение для очистке при аутентификации.

Я вас вообще-то спрашивал "про /etc/rc.local" (+см выше). Пакет собирать пока не из чего, и я об этом уже писал. Сделаем нормальны скрипт и поймем как его лучше всего запускать/использовать - сделаем пакет. и будет ваше "технологичное дистрибутивное решение".
Извините, это напоминает анекдот: «А чего думать? Прыгать надо!». Когда Вы подходите в задаче с позиций временных подпорок, решение будет заведомо неэффективным при использовании больше чем на вашей машине.
Вы же - вместо того, что бы помочь или направить эту "сумасбродную деятельность" - и получить в итоге "нормальное технологическое решение" отмазываетесь всеми силами и средствами, называете "дилетантами с привычками виндоус", и фактически - пытаетесь завалить на корню инициативу, которая направлена на решение вполне конкретных проблем.
Если Вы не заметили, то она уже завалена (см. признание учителя). Этого следовало ожидать, о чём Вам уже несколько раз ранее говорили.
это официальная позиция Альта в отношении людей/сообщества которые пытается решать "проблемы внедрения на местах" вашего дистрибутива, или ваша самодеятельность? прекратите уже?
Не передёргивайте и не перевешивайте собак. Это не имеет отношения ни к ALT Linux (здесь ратовали за ПСПО5, не имеющего к нам никакого отношения), ни к решению проблем.
или помогайте конкретными техническими советами, или устранитесь пожалуйста.
Предпочту устранится, Вы предпочитаете слышать только своё мнение.
Skull
Спасибо сказали:
DoctorORZ
Сообщения: 46

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение DoctorORZ »

Skull писал(а):
22.09.2010 17:34
Поверьте, грамотное решение проблемы не зависит от дистрибутива. Просто в сообществе ALT Linux быстрее покажут, что данное решение недистрибутивно или небезопасно. Мне жаль, что за решение проблем берутся активные дилетанты с привычками Windows, плодящие подпорки.

Отлично! Тогда мы идем к Вам. Только вот куда именно? Сюда? (но это вроде не официальная техподдержка) Или сюда? (ну, ведь именно Ай-Ти меня учила). Или таки сюда? (однако мою проблему там так и не разрулили - не эту, а другую). Или, может сюда? А может сюда?
Так куда же? Или есть ещё какие-то ресурсы?
Давайте посмотрим, кто быстрее и эффективнее решит данную проблему: официальный разработчик и его техподдержка, или действительно неравнодушные люди?
На всякий случай скинул описание проблемы (создание удобной графической оболочки для управления правами доступа) сюда. (не на форум, а в техподдержку)
Спасибо сказали:
Аватара пользователя
Denjs
Сообщения: 1685
ОС: SuSe 10.2

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение Denjs »

Skull писал(а):
22.09.2010 19:11
Denjs писал(а):
22.09.2010 18:02
Я читал заметку, и не нашел более удобного места.
Вы можете предложить "лучшее" место в дистрибутиве для команды восстановления каталога пользователя при загрузке? Почему не предлагаете? это будет уже конструктивно.
Это очевидно — нужно писать модуль PAM. Это будет правильное и красивое решение для очистке при аутентификации.

Вопрос очистки/восстановления каталогов при _аутентификации_ и не объявлялся решенным на момент появления вашей критики в отношении /etc/rc.d/rc.local ,
вопрос о добавлении _восстановления_при_логоне_ сразу стоял в списках TODO вторым пунктом.

Оригинальный скрипт восстанавливает каталоги _при_перезагрузке_. Я только адаптировал скрипт под ПСПО5Легкий/AltLinux _сохранив_оригинальную_логику_ - и предложив развить скрипт дальше.

У вас есть лучшие идеи куда класть команды которые надо выполнять при _перезагрузке_ (не логоне!) кроме как в /etc/rc.d/rc.local ? нет? тогда вопрос снят.
Будем считать вашу критику и последующее "обсуждение" как следствие недопонимания друг друга.

Модуль для PAM - запомним, спасибо. Но уверен есть более легковесные пути.
QDroid - Среда исполнения и фреймворк для QtScript.
OTPD - Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
Спасибо сказали:
Аватара пользователя
minoru-kun
Сообщения: 621
ОС: Debian GNU/Linux

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение minoru-kun »

Skull, а какое, по вашему, может быть оптимальное решение 2-й проблемы? Я не вижу иных вариантов, кроме как аккуратно править софт.
Спасибо сказали:
Аватара пользователя
Skull
Модератор
Сообщения: 2089
ОС: ALT Linux

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение Skull »

minoru-kun писал(а):
22.09.2010 19:38
Skull, а какое, по вашему, может быть оптимальное решение 2-й проблемы? Я не вижу иных вариантов, кроме как аккуратно править софт.
Да, нужно реализовывать полноценний Kiosk-mode. Он был довольно хорошо сделан в KDE3 (см. http://www.altlinux.org/Ограничения_интерфейса_KDE), но в остальных проектах, увы, возможности слабы. Это потребует очень большого финансирования и длительности реализации. Для начала лучше разобраться и написать хорошую инструкцию по kiosk mode для связки GNOME/Firefox/OpenOffice.org. После проверки на практике будет ясно, что лучше доделывать.

Кстати, инструкцию уже можно будет использовать учителям, пока не будет программных решений.
Skull
Спасибо сказали:
Аватара пользователя
Skull
Модератор
Сообщения: 2089
ОС: ALT Linux

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение Skull »

DoctorORZ писал(а):
22.09.2010 19:26
Отлично! Тогда мы идем к Вам.
Не вопрос. support.altlinux.ru. С купоном на Альт Линукс 5.0 Школьный. Предвидя Ваше негодование: да, жизнь несправедлива и Вы можете спросить у Фурсенко, где деньги за техподдрежку ПСПО и на кого оставили учителей?
Давайте посмотрим, кто быстрее и эффективнее решит данную проблему: официальный разработчик и его техподдержка, или действительно неравнодушные люди?
Вы намеренно противопоставляете нас? Зря, вместе бы решили быстрее.
На всякий случай скинул описание проблемы (создание удобной графической оболочки для управления правами доступа) сюда. (не на форум, а в техподдержку)
Покажите ответ от наших коллег из PingwinSoftware? Возможно, они что дельное присоветуют.
Skull
Спасибо сказали:
Аватара пользователя
Skull
Модератор
Сообщения: 2089
ОС: ALT Linux

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение Skull »

Denjs писал(а):
22.09.2010 19:31
У вас есть лучшие идеи куда класть команды которые надо выполнять при _перезагрузке_ (не логоне!) кроме как в /etc/rc.d/rc.local ? нет? тогда вопрос снят.
/etc/rc.d/rc$(runlevel|cut -c 3).d/
Только скажите, какой смысл привязываться к перезагрузке? Почему именно к ней?

Будем считать вашу критику и последующее "обсуждение" как следствие недопонимания друг друга.
Я рад, что идём к взаимопониманию. :)
Модуль для PAM - запомним, спасибо. Но уверен есть более легковесные пути.
Да, можно сделать скриптами, но это лишь единичное решение. Архитектуру даже такого простого решения лучше прорабатывать заранее (а то будет как с KDE4 :)
Skull
Спасибо сказали:
DoctorORZ
Сообщения: 46

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение DoctorORZ »

Skull писал(а):
22.09.2010 19:57
Вы намеренно противопоставляете нас?

И не думал, просто констатирую факт. В живой журнал пришел человек, который смог убедить меня придти сюда. От Альта я там таких предложений не получал. Хотя, скрывать не буду, и на Вашем форуме есть люди, с которыми общение проходит просто и интересно. С точки зрения непрофессионала. Но, ей-богу, при таком подходе мне приятнее быть с ними, чем с Вами. При всём уважении к техподдержке.
Как только будет ответ - обязательно выложу сюда.
Но, вот что интересно, неужели разработчики Альта при обкатке своего продукта в пилотных регионах не получали подобных просьб? Ну, в таком случае выводов два: предложения были, но на них плюнули, или обкатка была чисто формальной. Как сейчас с опытными зонами - поставили, зарегистрировали (даже с лайв-сд версии) и забыли.
Спасибо сказали:
BDag
Сообщения: 276
ОС: Mandriva Linux Cooker

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение BDag »

хм... на второй странице промелькнуло слово PAM_SCRIPT, который поможет вам запускать скрипт упаковки\распаковки при входе\выходе пользователя

помимо этого PAM_MOUNT поможет организовать автоматическое подклдючение\отключения файловых систем(удаленных) при входе\выходе пользователя, что позволит организовать централизованное хранение информации на рабочих местах (подключение удаленного диска в домашнюю директорию пользователя например в ~/Хранилище).
Спасибо сказали:
Аватара пользователя
Denjs
Сообщения: 1685
ОС: SuSe 10.2

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение Denjs »

Skull писал(а):
22.09.2010 20:05
Denjs писал(а):
22.09.2010 19:31
У вас есть лучшие идеи куда класть команды которые надо выполнять при _перезагрузке_ (не логоне!) кроме как в /etc/rc.d/rc.local ? нет? тогда вопрос снят.
/etc/rc.d/rc$(runlevel|cut -c 3).d/
Только скажите, какой смысл привязываться к перезагрузке? Почему именно к ней?

Ещё раз говорю - никакого. Это решение автора исходного скрипта для его проблемы.
В TODO адаптированного скрипта я писал(ссылка) что "надо-бы привязаться к логону", а не к перегрузке; а выложеный скрипт - промежуточное решение.
Ну вы совсем не читаете что ли что я пишу?
QDroid - Среда исполнения и фреймворк для QtScript.
OTPD - Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение Portnov »

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

libpam-script - PAM module which allows executing a script

ы?
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
BDag
Сообщения: 276
ОС: Mandriva Linux Cooker

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение BDag »

Спасибо сказали:
Аватара пользователя
minoru-kun
Сообщения: 621
ОС: Debian GNU/Linux

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение minoru-kun »

Насчет 2-й задачи. Я считаю, что нужно хранить пермишены в openldap. Полностью идти путем kde3 для нас дороговато, а со скриптами мы точно сядем на какие-нибудь грабли.
Спасибо сказали:
BIgAndy
Сообщения: 1923

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение BIgAndy »

Хехе..
pam_umask
pam_mkhomedir не?
Спасибо сказали:
Аватара пользователя
Skull
Модератор
Сообщения: 2089
ОС: ALT Linux

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение Skull »

Denjs писал(а):
22.09.2010 20:16
В TODO адаптированного скрипта я писал(ссылка) что "надо-бы привязаться к логону", а не к перегрузке; а выложеный скрипт - промежуточное решение.
Ну вы совсем не читаете что ли что я пишу?
Вы пишите слишком много и не по делу. Уж извините.

Скрипт я посмотрел, он ужасен. Ну нельзя писать

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

sudo rsync -a --delete /home/$ofris_user /etc/.ofris/
Скрытым файлом в /etc - неверно!

У нас задача: восстановить каталог «гостевого» пользователя.

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

#!/bin/sh

user="$1"
rsync -aHAXv --delete /etc/skel/ "/home/$user"
chown -R $user:$user "/home/$user"


Конечно, можно сделать отдельные профили, но обычно достаточно /etc/skel

Skull
Спасибо сказали:
Аватара пользователя
Denjs
Сообщения: 1685
ОС: SuSe 10.2

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение Denjs »

Portnov писал(а):
22.09.2010 20:19

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

libpam-script - PAM module which allows executing a script

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

Пока делаю вывод что libpam-script просто нет в Alt-Linux и нет в ПСПО5 и потому это не наш путь... увы...
Думаю, надо использовать более стандартные методы запуск скрипта при логоне. Но важно, что бы все было до начала инициации пользовательских настроек? есть какие мысли?
В конце концов не /etc/profile.d/ и ~/.bash_profile же использовать? (я уже пробовал - при попытке замены каталогов из данных скриптов - сессия даже не начинается)

BIgAndy писал(а):
22.09.2010 20:45
pam_umask
pam_mkhomedir не?

pam_mkhomedir выглядит вкусно, но аналогично вышеописанному - не вижу оных в Аль-линусовых дистрах....
если модуль не включен ни в какой другой пакет для pam - не наш путь...

__________________________________________________
Проработку темы "автовосстановления при логине/логауте" предлагаю приостановить." Во первых писать свой модуль или поддерживать модуль pam-script для Alt - это как-то черезмерно, а во вторых, DoctorORZ кажется говорил, что если свет моргнет - то не стоит огорчать никого исчезнувшими файлами на рабочем столе? (или что-то около того).
Уверен, восстановления по удаленной команде чеоез iTALC будет достаточно.
Но если у кого возникнет решение по тому, как увязать на логон выполнение команды а-ля rsync текущего домашнего каталога "стандартными" механизмами - и при этом не будет ломаться процесс запуска сессии - то это будет очень кстати для расширения полезняшек скрипта.

Автовосстановление каталога пользователя при ребуте в "скрипте заморозки" я потом выведу как отдельную не обязательную опцию - на тот случай, что бы востановление каталогов происходило автоматически, для тех кто пожелает не делать это периодически руками. (вот кстати - причина для завязывания на ребут - потому что некоторые наверняка захотят автоматическое востановление, (пусть и не при перелогоне), но подвязаться к системе авторизации быстро и легко не полчается)

PS: Там есть ещё TODO-шка с отвязыванием от sudo. Надо понять как его запускать, и под какими пользователями и почему. Есть у кого какие мысли?


__________________________________________________
minoru-kun писал(а):
22.09.2010 20:36
Насчет 2-й задачи. Я считаю, что нужно хранить пермишены в openldap. Полностью идти путем kde3 для нас дороговато, а со скриптами мы точно сядем на какие-нибудь грабли.

А если LDAP не настроен? не думаю что хорошо завязываться на технологию которая может не применяться на местах.

Пока мне кажется, надо прорабатывать вариант в сети без домена: "скрипты+ iTALC"(последний в качестве средства удаленного контроля/управления) (написано, что он может также выполнять команды на удаленной машине. Пакет входит в состав ПСПО5Легкий).

PS: А какие грабли предполагаются, в случае скриптов? и как нам может помочь OpenLDAP?

Skull писал(а):
22.09.2010 20:51
Конечно, можно сделать отдельные профили, но обычно достаточно /etc/skel

Предлагаю не лишать учителя возможности настроить состав рабочего стола "по умолчанию".
Потому нужен механизм создания нашего собственного слепка домашнего каталога. копирования из skel не достаточно.
Замещать же /etc/skel своим "слепком домашнего каталога" вижу смысл только если использовать pam_mkhomedir... но это похоже не наш путь (см. выше)

Skull писал(а):
22.09.2010 20:51

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

sudo rsync -a --delete /home/$ofris_user /etc/.ofris/
Скрытым файлом в /etc - неверно!

а куда верно? как верно? почему?
QDroid - Среда исполнения и фреймворк для QtScript.
OTPD - Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение Portnov »

В убунте последней есть какая-то тулза для конфигурирования профилей пользователей. Оно запускает Xnest, в нём логинит указанного пользователя и предоставляет возможность там чего-нить понастраивать (панельки потаскать, ярлычки повесить итп). Если не ошибаюсь, есть возможность отредактированный профиль сохранить как профиль по умолчанию (будет использоваться для вновь создаваемых пользователей и для гостевого входа). Есть возможность эту 'фичу' портировать из убунты в школьные дистры?
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
BDag
Сообщения: 276
ОС: Mandriva Linux Cooker

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение BDag »

Придумывать костыль, вместо того, чтобы собрать нужный пакет, я думаю, это немного странный подход к оптимизации временных затрат. Например данные pam_script имеется в репозитории Mandrvia. pam_mkhomedir в Mandriva установлено по умолчанию. Установленные PAM-модули в дистрибутиве можно посмотреть командой ls /lib{,64}/security.

Для разворачивания данных, ИМХО, лучше использовать файл-образ, который будет монтироваться как домашняя директория пользователя. Чтобы использовать возможность восстановления данных в изначальное состояние, можно воспользоваться средствами lvm (примонтировать срез как домашнюю директорию в этом случае при отмонтировании ресурса, оригинальные данные не изменятся, что позволит при повторном монтировании среза получить исходный вариант).

Для хранения пользовательской информации (файлы пользователей, созданные в процессе работы) лучше хранить на диске сервера, который при входе пользователя будет цепляться в соответствующую директорию пользователя например (~/Хранилище)
Спасибо сказали:
Аватара пользователя
Denjs
Сообщения: 1685
ОС: SuSe 10.2

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение Denjs »

BDag писал(а):
23.09.2010 13:49
Придумывать костыль, вместо того, чтобы собрать нужный пакет, я думаю, это немного странный подход к оптимизации временных затрат. Например данные pam_script имеется в репозитории Mandrvia. pam_mkhomedir в Mandriva установлено по умолчанию.

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

Лучше думать, что мы работаем в жестко-зафиксированных условиях "стандартной поставки системы". и ставить в систему "глубоко-системные" вещи типа нового модуля для системы авторизации - думаю не стоит.

т.е. есть решения правильные/красивые, а есть "просто работающие"/"it-just-works".
Пока предлагаю делать вариант "просто работающее". Если оно будет не правильным - будет потом доделываться при необходимости. Нами или производителем дистрибутива.

Установленные PAM-модули в дистрибутиве можно посмотреть командой ls /lib{,64}/security.

о! в поставке ПСПО5 найден pam_mkhomedir
pam_script не найден, но может вместо него можно использовать pam_exec

Для разворачивания данных, ИМХО, лучше использовать файл-образ, который будет монтироваться как домашняя директория пользователя. Чтобы использовать возможность восстановления данных в изначальное состояние, можно воспользоваться средствами lvm (примонтировать срез как домашнюю директорию в этом случае при отмонтировании ресурса, оригинальные данные не изменятся, что позволит при повторном монтировании среза получить исходный вариант).

Для хранения пользовательской информации (файлы пользователей, созданные в процессе работы) лучше хранить на диске сервера, который при входе пользователя будет цепляться в соответствующую директорию пользователя например (~/Хранилище)

У меня в отношении этого 2 имха:
1) Монтирование каталогов по сети не решает само по себе вопросов восстановления испорченных настроек из эталонного образца.
2) Пока предлагаю думать в направлении "А что будет, если сети нет ?" или не смогли настроить домен? т.е. нужно гарантированно работающее решение из коробки работающее без настройки сразу после установки.
Т.е. в "условиях изолированной машины". А потом уже - можно будет в виде инструкции описать как это совмещать с монтированием каталогов по сети и т.п. - идея в том, что если кто-то способен настроить автомонтирование - то и выполнить инструкцию тоже способен. Но это сейчас за пределами задачи, имхо.

рабочие папки можно монтировать по ssh с учительсткой машины вручную уже после запуска рабочего стола. в ПСПО5 есть отличная утилита GIgolo под ярлыком "Мой компьютер". У меня она отлично монтировала как SMB так и SFTP (SSH) папки раздаваемые на моей домашней машине-сервере.
Такое решение упрощает настройку, запуск и использование системы. имхо. простые решения - они самые надежные.

______________________________________
теперь обновленные рабочие вопросы:
Раз уж подходящие модули PAM есть в поставке PSPO5, то "возможно это наш путь" )))):

Кто сможет описать как настраивать pam_mkhomedir что бы при логоне восстанавливать домашний каталог?
есть ли возможность использовать не /etc/skel а собственную папку с собственным "шаблоном"? (не хочется трогать стандартный шаблон)

Кто может описать как настраивать pam_exec для запуска скриптов при логоне /логауте ?

нужно понять насколько удобно их использование и настройка, что будет в случае ошибок, и насколько трудно автоматизировать настройку данных модулей.
QDroid - Среда исполнения и фреймворк для QtScript.
OTPD - Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
Спасибо сказали:
DoctorORZ
Сообщения: 46

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение DoctorORZ »

Skull писал(а):
22.09.2010 19:57
Покажите ответ от наших коллег из PingwinSoftware? Возможно, они что дельное присоветуют.

Показываю. Вопрос в СТП звучал примерно так: "Есть чУдная виндовая программа от MS (бесплатная) - Windows SteadyState. С её помощью можно защищать компы учеников от вандализма. У меня это программа на втором месте, после антивируса. А нет ли аналогов для линукс систем? Я понимаю, что там всё можно настроить правами и конфигурационными файлами. Но, аналогичная оболочка в графическом интерфейсе сбережет кучу времени и решит 99% проблем для учителей." Без каких либо ссылок на этот или другие форумы.
Первый ответ:
Что вы подразумеваете под "вандализмом". В Linux ничего "ужасного" нельзя сделать, если не знать пароль суперпользователя. Так как только суперпользователь может менять настройки системы, устанавливать или удалять программы. То есть как бы сама необходимость в такой программе отпадает.

Очевидно, что техподдержка очень слабо себе представляет, что могут пытливые школьники. И свято верит, что они законопослушны.
Поэтому мое разъяснение в следующем сообщении:
Под "вандализмом" я подразумеваю умышленное приведение внешнего вида системы в состояние, при котором следующий пользователь не сможет адекватно работать, а именно - удаление ярлыков с рабочего стола или из меню программ (вообще любых ярлыков), удаление панелей или ярлыков с них, намеренное изменение времени, языков, настроек рабочего стола или браузеров, намеренное уничтожение каких либо папок пользователя. Если нужны примеры, пожалуйста:
Ученик намеренно на уроке сносит ярлыки - просит учителя разобраться с этим. Учитель убивает время на ученика - урок сорван. Другой пример - общедоступный ПК в библиотеке. Ученик сносит привычный вид и следующий пользователь уже не может работать в привычной среде - нужно вызывать администратора, который сможет поправить настройки (если сможет - квалификация среднего админа оставляет желает лучшего)

И гениальный ответ:
Софт Подобный Windows SteadyState нам не известен.

Пришлось "подтолкнуть" к нужному решению:
Ну, тогда, возможно, вы сможете предложить оптимальный алгоритм действия для учителя (администратора ПК) в таких ситуациях?

Ответ поражает новизной и качеством. Интересно, с чего они взяли, что у меня есть (будет) сеть? Т.е. локальные ПК не рассматриваются в принципе?
Не держите на рабочем столе лишних ярлыков и важной информации, полный доступ обычный пользователем имеет только к папке /home/имя_пользователя. Доступ к ученическим ресурсам можно вполне осуществить через сеть (т.е. хранить важную информацию на файловом сервере, ресурсы которого можно периодически обновлять в случае чего или делать его бэкап). Остальное зависит пожалуй от пытливости ваших учеников. Поменять например простейшие темы для учетной записи они будут в состоянии. Можете удалить их из системы и оставить лишь одну.

Создается ощущение (второй раз), что внедрение линукса в школы - профанация: никто не знает, что в действительности нужно школе (какие процессы там происходят, чего можно ожидать, к чему быть готовыми, на какой техники и с какими условиями приходится работать)
Спасибо сказали:
Аватара пользователя
Skull
Модератор
Сообщения: 2089
ОС: ALT Linux

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение Skull »

Denjs писал(а):
23.09.2010 02:26
Пока делаю вывод что libpam-script просто нет в Alt-Linux и нет в ПСПО5 и потому это не наш путь... увы...
Потому что это наверняка обёртка над штатным pam_exec (http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/sag-pam_exec.html). Пример:
Add the following line to /etc/pam.d/passwd to rebuild the NIS database after each local password change:

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

password optional pam_exec.so seteuid /usr/bin/make -C /var/yp

В конце концов не /etc/profile.d/ и ~/.bash_profile же использовать?
Верно, они не для всякого DE запускаются. :)

PS: Там есть ещё TODO-шка с отвязыванием от sudo. Надо понять как его запускать, и под какими пользователями и почему. Есть у кого какие мысли?
А зачем? PAM под root запускает, а давать что-то пользователю в руки небезопасно. Тем более то, что его ограничивает. :)

Предлагаю не лишать учителя возможности настроить состав рабочего стола "по умолчанию".
Потому нужен механизм создания нашего собственного слепка домашнего каталога. копирования из skel не достаточно.
Поставьте вместо /etc/skel teacher:default-dir. Это позволит учителю настраивать у себя каталог и раздавать его по сети всем. Естественно, надо настроить доступ к учительскому компу.

а куда верно? как верно? почему?
Во-первых, /etc обычно не такой большой. Во-вторых, небезопасно копировать данные пользователя. В-третьих, это не имеет в обычной практике особого смысла.
Skull
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: защита от вандализма. Блокировка изменения настроек.

Сообщение sgfault »


Denjs, если вы тот свой скрипт еще окончательно не забросили, то вот я его немного переписал. Пока что здесь переписано только все, не относящееся к "собственно сохранению/восстановлению настроек": разбор опций и инициализация данных. Если вас такой вариант интересует, я могу его закончить. (Ах, да, комментарии на английском (не очень грамотно, но зато ascii -), в принципе, если нужно, я могу переделать на русский).

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

#!/bin/bash

#-------------------

# General:
# FIXME:! It seems, like `id` will not handle names with the same uid.
# FIXME:!! Handle 'uid' instead of user name in coreutils format.
# FIXME: Check for readonly variable in functions f_get_*(), f_user_t_*(). I.e
# in ones, which receive name of some global variable to operate on.
# FIXME: Use log_file for errors.
#
# f_get_home():
# FIXME:!!! Rewrite home directory lookup.
#
# f_user_t_add():
# FIXME: Check if constructed object exist and has proper type (exactly,
# are user_t_X_user[], user_t_X_home[], etc exist and are arrays).
# FIXME:? Trailing ',' will not work as empty user.
# But, perhaps, it shall not?
# FIXME:? Check name conflicts.
# Seems like, now conflicts are not possible.

# Variables definition {{{

# Other {{{
declare -i i=0
declare -r OIFS="$IFS"

# }}}
# Debug {{{
i=1
declare -r -i debug_parse_opt=$i    && ((i<<=1))
declare -r -i debug_user_t_add=$i   && ((i<<=1))
i=0
declare -r -i debug_all=$((-1))
declare -r -i debug=0

# }}}
# Logging {{{
declare -r PS_0="${0##*/}"
declare -r PS_I="${PS_0}: Info"
declare -r PS_W="${PS_0}: Warning"
declare -r PS_E="${PS_0}: Error"
declare PS_IND=""
declare PS_IND_STEP="  "
declare -r log_file="/dev/stderr"   # do NOT use stdout here, it may break
                                    # command substitution with functions.

# }}}
# Return values {{{
i=0
declare -r -i RET_SUCCESS=$((i++))
declare -r -i RET_ERR=$((i++))
i=0

# }}}
# Pathes {{{
# No trailing slashes!
declare save_path="./freeze"
save_path="$(echo "$save_path" | sed -e'/^\/$/q; s/\/\+$//')"
declare tmp_path="."
tmp_path="$(echo "$tmp_path" | sed -e'/^\/$/q; s/\/\+$//')"
declare -r save_path tmp_path

# }}}
# Data structures {{{
#
# Data structures implement (as possible)
#
#   struct user_t {
#       char *user;
#       char *home;
#       char *save;
#   };
#   struct user_t *lock;
#   struct user_t *unlock;
#
# For one object (i'll refer to array (struct user_t*) as to object), e.g.
# 'lock', here we'll have:
#   - all 'user' elements are stored into one array user_t_lock_user[],
#   - all 'home' elements are stored into another array user_t_lock_home[],
#   - and all 'save' into another user_t_lock_save[].
#
# So for object named 'X' we'll have here three arrays named
#
#   user_t_X_user[]
#   user_t_X_home[]
#   user_t_X_save[]
#
# Using of objects without name (i.e which correspond to user_t__user[], etc)
# is prohibited (it either simple will not work or break script). For each
# object length (number of elements in 'struct user_t *X') is defined
#
#   n_user_t_X
#
# Also, size of each 'struct user_t' element is
#
#   sizeof_user_t__user
#   sizeof_user_t__home
#   sizeof_user_t__save
#
# Hencem, it's recommended to calculate offset to element 'user' of k-th
# structure in object X like
#
#   user_t_lock_user[k * sizeof_user_t__user]
#
# Here we use two objects: 'lock' and 'unlock'.

declare -r -i sizeof_user_t__user=1
declare -r -i sizeof_user_t__home=1
declare -r -i sizeof_user_t__save=1

declare    -a user_t_lock_user=( )
declare    -a user_t_lock_home=( )
declare    -a user_t_lock_save=( )
declare -i    n_user_t_lock=0
declare    -a user_t_unlock_user=( )
declare    -a user_t_unlock_home=( )
declare    -a user_t_unlock_save=( )
declare -i    n_user_t_unlock=0

# }}}
# Operation modes {{{
i=1
declare -r -i mode_lock=$i                          && ((i<<=1))
declare -r -i mode_lock_all=$((mode_lock | i))      && ((i<<=1))
declare -r -i mode_unlock=$i                        && ((i<<=1))
declare -r -i mode_unlock_all=$((mode_unlock | i))  && ((i<<=1))
declare -r -i mode_status=$i                        && ((i<<=1))
i=0
declare -i mode=0

# }}}

# Variables definition END }}}
# Functions {{{

# f_get_user {{{
f_get_user() {
    # Check user specification and convert it to user name (not uid).
    # Arguments:
    # 1     - variable, to which we should write result (pointer).
    # 2     - user spec in coreutils format.
    # Return value:
    #   RET_SUCCESS - variable pointed by '$1' set to save directory path.
    #   RET_ERR     - some error occurs, content of variable pointed by '$1'
    #               is unspecified.

    #   - Avoid defining variables in this function, since their names may
    #   match with variable name in '$1'. But if define, check for matching
    #   names.

    if [ -z "$1" ]; then
        echo "${PS_E}: f_get_user(): too few arguments"
        return $RET_ERR
    elif eval "[ \"x\${$1+x}\" == 'x' ]"; then
        echo "${PS_E}: f_get_user(): variable '$1' is unset"
        return $RET_ERR
    fi
    if [ -z "$2" ]; then
        eval "$1=\"$(id -urn)\""
        return $RET_SUCCESS
    fi
    # Command substitution below _must_ be escaped - '\$()', - otherwise if
    # `id` returns error, this occurs in "main" sript, so "eval" script will
    # not be executed at all.
    if ! eval "$1=\"\$(id -un \"$2\")\""; then
        echo "${PS_E}: f_get_user(): unknown error"
        return $RET_ERR
    fi
    return $RET_SUCCESS
}

# f_get_user END }}}
# f_get_home() {{{
f_get_home() {
    # Get home directory for specified user.
    # Arguments:
    # 1     - variable, to which we should write result (pointer).
    # 2     - user name.
    # Return value:
    #   RET_SUCCESS - variable pointed by '$1' set to save directory path.
    #   RET_ERR     - some error occurs, content of variable pointed by '$1'
    #               is unspecified.

    #   - Do NOT call before f_get_user(), because we don't check user name
    #   here.
    #   - Avoid defining variables in this function, since their names may
    #   match with variable name in '$1'. But if define, check for matching
    #   names.

    if [ -z "$1" ]; then
        echo "${PS_E}: f_get_home(): too few arguments"
        return $RET_ERR
    elif eval "[ \"x\${$1+x}\" == 'x' ]"; then
        echo "${PS_E}: f_get_home(): variable '$1' is unset"
        return $RET_ERR
    elif [ -z "$2" ]; then
        echo "${PS_E}: f_get_home(): empty user name"
        return $RET_ERR
    fi
    if ! eval "$1=\"/home/$2\""; then
        echo "${PS_E}: f_get_home(): unknown error"
        return $RET_ERR
    fi
    return $RET_SUCCESS
}

# f_get_home() END }}}
# f_get_save() {{{
f_get_save() {
    # Get save directory for specified user _name_.
    # Arguments:
    # 1     - variable, to which we should write result (pointer).
    # 2     - user name.
    # Return value:
    #   RET_SUCCESS - variable pointed by '$1' set to save directory path.
    #   RET_ERR     - some error occurs, content of variable pointed by '$1'
    #               is unspecified.

    #   - Do NOT call before f_get_user(), because we don't check user name
    #   here.
    #   - Avoid defining variables in this function, since their names may
    #   match with variable name in '$1'. But if define, check for matching
    #   names.

    if [ -z "$1" ]; then
        echo "${PS_E}: f_get_save(): too few arguments"
        return $RET_ERR
    elif eval "[ \"x\${$1+x}\" == 'x' ]"; then
        echo "${PS_E}: f_get_save(): variable '$1' is unset"
        return $RET_ERR
    elif [ -z "$2" ]; then
        echo "${PS_E}: f_get_save(): empty user name"
        return $RET_ERR
    fi
    if ! eval "$1=\"$save_path/$2\""; then
        echo "${PS_E}: f_get_save(): unknown error"
        return $RET_ERR
    fi
    return $RET_SUCCESS
}

# f_get_save() END }}}

# f_user_t_add_user() {{{
f_user_t_add_user() {
    # Add user's data (name, home dir, save dir) to specified user_t object.
    # Arguments:
    # 1     - user_t object's name.
    # 2     - list of users in coreutils spec format.
    # Return value:
    # 0     - user's data successfully added to specified object. Incorrect
    #       user specifications (if were) omitted.

    local PS_F="f_user_t_add()"
    ((debug & debug_user_t_add)) \
        && echo "${PS_IND} $PS_F:"
    eval "local PS_IND=\"$PS_IND$PS_IND_STEP\""

    local -i i=0
    local user=""
    local home=""
    local save=""
    # Specified user_t object's data we'll work with.
    local user_t__user="user_t_$1_user"
    local user_t__home="user_t_$1_home"
    local user_t__save="user_t_$1_save"
    local n_user_t="n_user_t_$1"
    local -i ret=$RET_SUCCESS

    ((debug & debug_user_t_add)) \
        && echo "${PS_IND} args: '$*'"
    IFS=","
    # current index (not offset!) in user_t object's data arrays.
    eval "i=\$$n_user_t"
    shift
    [ -z "$1" ] && set -- ','
    for user in $*; do
        ((debug & debug_user_t_add)) \
            && echo "${PS_IND} [$i]: user='$user'"
        f_get_user user "$user" \
            && f_get_home home "$user" \
            && f_get_save save "$user" \
            || continue

        (
            # Ignore duplicate users
            IFS=$'\x0a'
            eval "echo \"\${$user_t__user[*]}\" | fgrep -q -x -e\"$user\""
        ) && continue
        eval "
            $user_t__user[i * sizeof_user_t__user]=\"$user\"
            $user_t__home[i * sizeof_user_t__home]=\"$home\"
            $user_t__save[i * sizeof_user_t__save]=\"$save\"
        "
# FIXME: should we use something like this instead?
#       eval "
#           $user_t__user=( \"\${$user_t__user[@]}\" \"$user\" )
#           $user_t__home=( \"\${$user_t__home[@]}\" \"$home\" )
#           $user_t__save=( \"\${$user_t__save[@]}\" \"$save\" )
#       "
        ((i++))
    done
    eval "$n_user_t=$i"

    IFS="$OIFS"
    return $ret
}

# f_user_t_add_user() END }}}

# f_parse_opt() {{{
f_parse_opt() {
    # Parse options.
    # Arguments:
    # Output of getopt(1).
    # Return value:
    # 0     - options successfully parsed, mode and user_t objects set up
    #       corresponding. All incorrect option arguments omitted.
    local PS_F="f_user_t_add()"
    ((debug & debug_user_t_add)) \
        && echo "${PS_IND} $PS_F:"
    eval "local PS_IND=\"$PS_IND$PS_IND_STEP\""

    local -i ret=0

    while (($#)); do
        case "$1" in
            '-l' | '--lock' )
                ((debug & debug_parse_opt)) \
                    && echo "${PS_IND} --lock found with arg '$2'"

                f_user_t_add_user 'lock' "$2"
                ((mode |= mode_lock))
                ((debug & debug_parse_opt)) \
                    && declare -p ${!user_t_lock_*}
                shift 2
               ;;
            '-L' | '--Lock' )
                ((debug & debug_parse_opt)) \
                    && echo "${PS_IND} --Lock found"

                ((mode |= mode_lock_all))
                shift
               ;;
            '-u' | '--unlock' )
                ((debug & debug_parse_opt)) \
                    && echo "${PS_IND} --unlock found with arg '$2'"

                f_user_t_add_user 'unlock' "$2"
                ((mode |= mode_unlock))
                ((debug & debug_parse_opt)) \
                    && declare -p ${!user_t_unlock*}
                shift 2
               ;;
            '-U' | '--Unlock' )
                ((debug & debug_parse_opt)) \
                    && echo "${PS_IND} --Unlock found"

                ((mode |= mode_unlock_all))
                shift
               ;;
            '-s' | '--status' )
                ((debug & debug_parse_opt)) \
                    && echo "${PS_IND} --status found"

                ((mode |= mode_status))
                shift
               ;;
            '--help' )
                cat <<EOF
Usage: freeze.sh [modes]
Modes:
    -l, --lock, -L, --Lock
        Lock settings.

    -u, --unlock, -U, --Unlock
        Unlock settings.

    -s, --status.
        Print status.

Options:
    -l<user>, --lock=<user>
        Lock user <user>'s settings. If no user name supplied, real (not
        effective) user running script assumed.

    -L, --Lock
        Lock settings for all users.

    -u<user>, --unlock=<user>
        Unlock user <user>'s settings. If no user name supplied, real (not
        effective) user running script assumed.

    -U, --Unlock
        Unlock settings for all users.

    -s, --status
        Print status (who is currently locked).

    --help
        Print this message and exit.

You can use several modes in one call. All operations will be performed in
turn ('lock' perfomed first, then 'unlock' and 'status' the last).

Options '--lock' and '--unlock' are cumulative. So, eventually all users
specified for all '--lock' option instances will be locked, and all users
specified for '--unlock' option instances will be unlocked ('lock' and
'unlock' use separate user lists, duplicate entries are removed, order
preserved).
EOF
                exit 0
               ;;
            '--' )
                shift $#
                ((debug & debug_parse_opt)) \
                    && echo "${PS_IND} end of options"
        esac
    done

    return $ret
}

# f_parse_opt() END }}}

# Functions END }}}
# main() {{{
eval "
    f_parse_opt $(getopt --name="${PS_0}" \
                        --shell="bash" \
                        --options="l::Lu::Ush" \
                        --longoptions="lock::,Lock,unlock::,Unlock,status,help" -- \
                        "$@"
                )
        "
if ((mode & mode_lock)); then
    echo "Lock user or all users"
    declare -p ${!user_t_lock*}
fi
if ((mode & mode_unlock)); then
    echo "Unlock user or all users"
    declare -p ${!user_t_unlock*}
fi
if ((mode & mode_status)); then
    echo "print status"
fi
exit 0

# }}}

Спасибо сказали: