запретить две одинаковых сессии
Модераторы: dimbor, Модераторы разделов
запретить две одинаковых сессии
Одинаковых - в смысле свой rootless-скрипт. Относиться к тому самому тулбару xfce4-panel. Некоторые умудряются запускать оный по два раза..
Что думается - перенести команду запуска xfce4-panel в скрипт на баше и в начале скрипта проводить некие проверки. Но не хотелось бы ориентироваться на запущенность panel под user, хотелось бы инфо вытаскивать из NX. А вот тут опыта уже ноль..
Никто не реализовывал ничего подобного?
PS может, тупо запретить nx запускать две сессии одного юзера? но как?
Что думается - перенести команду запуска xfce4-panel в скрипт на баше и в начале скрипта проводить некие проверки. Но не хотелось бы ориентироваться на запущенность panel под user, хотелось бы инфо вытаскивать из NX. А вот тут опыта уже ноль..
Никто не реализовывал ничего подобного?
PS может, тупо запретить nx запускать две сессии одного юзера? но как?
Re: запретить две одинаковых сессии
Не устаю делиться единственной ссылкой - Advanced Bash-Scripting Guide.
Рай на отдельно взятом Вашем сервере кроме Вас вряд ли кто устроит.
Рай на отдельно взятом Вашем сервере кроме Вас вряд ли кто устроит.
Re: запретить две одинаковых сессии
dimbor, спасибо конечно, но эта ссылка мне известна ) Я не прошу готовый скрипт, я прошу поделиться идеей.
Re: запретить две одинаковых сессии
Я сам сейчас озадачен подобной проблемой. Надеюсь, ситуация на работе сложится так, что я найду время на ее решение. Всвязи с этим у меня вопрос: Могу я к Вам обратиться за помощью в решении этой проблемы?
Re: запретить две одинаковых сессии
ко мне?? Ну как найду решение, ессно тут выложу. Очень хочется это сделать средствами NX, ибо конфигурационные файлики уже разосланы, в строке запуска не скрипт а сразу софт (xfce4-panel), а перенастраивать клиенты ох как лень )
А средствами скрипта - надо изучить синтаксис файла, который идет в поставке RX и отвечает за убийство суспендед сессий и на его основе делать так: проверяем запущенность сессии юзера, если есть - убиваем..
а далее свои запуски
Re: запретить две одинаковых сессии
Не правильно
Вы сначала разберитесь что происходит при запуске второй сессии...
Во первых ее запуск можно подавить установкой ENABLE_AUTORECONNECT=1, при этом клиент запрашивает список сессий, получает, выдает серверу restoresession, сервер выполняет server_startrestore_session("resume"), при этом он сначала вводит сессию в состояние "suspend", а потом поднимает.
Вот на этапе
;;
restoresession*)
server_startrestore_session("resume")
надо вставить проверку на $SESSION_CONT_USER, и дать отбой клиенту, тогда и вторая сессия не поднимется и первую не будет лихорадить, только не "в лоб", а добавив еще одну переменную в node.conf и обработав ее аналогично переменной DISABLE_PERSISTENT_SESSION в nxloadconfig, ну обозвать как то так: ENABLE_ONE_SESSION_LIMIT, а нужно это чтобы оставить возможность перехвата сессии некоторым пользователям на другом компе, себе например.
Вы сначала разберитесь что происходит при запуске второй сессии...
Во первых ее запуск можно подавить установкой ENABLE_AUTORECONNECT=1, при этом клиент запрашивает список сессий, получает, выдает серверу restoresession, сервер выполняет server_startrestore_session("resume"), при этом он сначала вводит сессию в состояние "suspend", а потом поднимает.
Вот на этапе
;;
restoresession*)
server_startrestore_session("resume")
надо вставить проверку на $SESSION_CONT_USER, и дать отбой клиенту, тогда и вторая сессия не поднимется и первую не будет лихорадить, только не "в лоб", а добавив еще одну переменную в node.conf и обработав ее аналогично переменной DISABLE_PERSISTENT_SESSION в nxloadconfig, ну обозвать как то так: ENABLE_ONE_SESSION_LIMIT, а нужно это чтобы оставить возможность перехвата сессии некоторым пользователям на другом компе, себе например.
Re: запретить две одинаковых сессии
Огорчить Вас придется - не получится так. Скрипт выполняется от рута, а сессию запускает юзер. Прав не хватит (см. nxserver --list от одного и другого).
Предлагается такой алгоритм: в nxnode имеется функция startsession(). В ее начало (при $1 != "restore") вставляется код который перебирает у юзера ~/.nx/C-*/pids/apps/*, по пидам получает ком. строки приложений и сравнивает с запускаемым в сессии. При совпадении банкет прерывается (return 1). Для $type="unix-application" переменная $application и будет запускаемым. В остальных случаях (unix-kde,unix-gnome,...) надо будет еще выдергивать переменные строк запуска этих зверей из конфига.
Upd: Прочитал предыдущий ответ и понял, что усложняю. Если "в тупую" не больше одной сессии в одни руки, то ничего не надо сравнивать. Пид есть? Живой? -> запускаться дальше ни хачу!
Re: запретить две одинаковых сессии
ну в скрипты самого!! NX я еще не лазил..
Djelf писал(а): ↑19.07.2010 12:19Не правильно
Вы сначала разберитесь что происходит при запуске второй сессии...
Во первых ее запуск можно подавить установкой ENABLE_AUTORECONNECT=1, при этом клиент запрашивает список сессий, получает, выдает серверу restoresession, сервер выполняет server_startrestore_session("resume"), при этом он сначала вводит сессию в состояние "suspend", а потом поднимает.
Ну, у меня настроено ENABLE_AUTORECONNECT=1, никто никого не лихорадит - вторая сессия поднимается молча
Кстати существует nxserver-usermode --list $USER
Но неработает у меня )
Re: запретить две одинаковых сессии
Вторая с тем же самым именем? И поднимается? Значит с остальными ключами перешаманили...
Естественно, nxserver-usermode работает для сессий запущенных в usermode (не от nx, а от самого пользователя).
Re: запретить две одинаковых сессии
Я так понял, что для второй переменной надо дорабатывать скрипты nx и обрабатывать ее, или нет?
Речь о ENABLE_ONE_SESSION_LIMIT?
Или DISABLE_PERSISTENT_SESSION?
>запущенных в usermode (
много нового счас узнаю похоже)
Re: запретить две одинаковых сессии
Итак, решил идти по пути без доработки RX ибо оставим это на голову разработчиков. Принцип простой. Все юзеры входят в RX с панелькой xfce4-panel, которая будет запускаться только через свой скрипт. Который вначале будет что то проверять и только потом реагировать на то, на се..
Тут два варианта проверки.
1) Проверить, запущенна ли сессия у текущего пользователя. Как??? Без прав root неполучается.. Пробовал анализом /var/lib/nxserver/db/.. но туда тоже доступ только у руга, утилитами nxserver и -usermode то же самое..
2) Проверять на запущенность например ту же xfce4-panel у текущего пользователя. Пока возможно так: ps axfu | grep who | grep "\_ xfce4-panel"
Вопрос: что лучше делать далее? Как можно закрыть все сессии юзера, все программы от имени юзера (очень желательно, как то так получается что через какое то время работы остаются куча процесов юзера вне сессий)?
По поводу остающихся процессов.. Вот сейчас через nxsadmin закрыл свои сессии.. подключился по ssh
Тут два варианта проверки.
1) Проверить, запущенна ли сессия у текущего пользователя. Как??? Без прав root неполучается.. Пробовал анализом /var/lib/nxserver/db/.. но туда тоже доступ только у руга, утилитами nxserver и -usermode то же самое..
2) Проверять на запущенность например ту же xfce4-panel у текущего пользователя. Пока возможно так: ps axfu | grep who | grep "\_ xfce4-panel"
Вопрос: что лучше делать далее? Как можно закрыть все сессии юзера, все программы от имени юзера (очень желательно, как то так получается что через какое то время работы остаются куча процесов юзера вне сессий)?
По поводу остающихся процессов.. Вот сейчас через nxsadmin закрыл свои сессии.. подключился по ssh
Код: Выделить всё
[who@server-a ~]$ ps axfu | grep "who"
root 14340 0.0 0.0 110460 4520 ? Ss Jul15 0:00 \_ sshd: who [priv]
who 14342 0.0 0.0 110612 2392 ? S Jul15 0:00 | \_ sshd: who@notty
root 18983 0.0 0.0 110460 4524 ? Ss Jul16 0:00 \_ sshd: who [priv]
who 18986 0.0 0.0 110612 2396 ? S Jul16 0:00 | \_ sshd: who@notty
root 17476 0.0 0.0 110460 4552 ? Ss 11:27 0:00 \_ sshd: who [priv]
who 17485 0.0 0.0 110612 2488 ? S 11:27 0:00 \_ sshd: who@pts/28
who 17486 0.0 0.0 86276 2676 pts/28 Ss 11:27 0:00 \_ -bash
who 17964 0.0 0.0 84424 2780 pts/28 R+ 11:28 0:00 \_ ps axfu
who 17965 0.0 0.0 63228 796 pts/28 S+ 11:28 0:00 \_ grep who
nx 14333 0.0 0.0 28372 1832 ? Sl Jul15 0:00 /usr/bin/expect /usr/bin/nxnode-login -- ssh who 50022 /usr/bin/nxnode --slave
nx 14335 0.0 0.0 56316 3088 pts/3 Ss+ Jul15 0:00 \_ ssh -2 -x -l who 127.0.0.1 -o NumberOfPasswordPrompts 1 -p 50022 /usr/bin/nxnode --slave
who 14758 0.0 0.0 64356 952 ? S Jul15 0:00 /bin/bash /usr/bin/nxnode --slave
who 14760 0.0 0.0 64488 1896 ? S Jul15 0:00 \_ /bin/bash /usr/bin/nxnode --startsession
who 15058 0.0 0.0 64488 1404 ? S Jul15 0:00 \_ /bin/bash /usr/bin/nxnode --startsession
who 15062 0.0 0.0 66808 1952 ? S Jul15 0:00 \_ /bin/bash /usr/bin/nxnode --startsession
who 15298 0.1 0.4 216228 57080 ? S Jul15 13:30 | \_ /usr/bin/nxagent -persistent -R -name NX - who@server-a:1020 - server-a-panel (GPL Edition) -option /home/who/.nx/C-server-a-1020-8A2BEC8362BE4AA14BF55A55A5018FDC/options -nolisten tcp :1020
who 15065 0.0 0.0 61240 720 ? S Jul15 0:00 \_ tee /home/who/.nx/C-server-a-1020-8A2BEC8362BE4AA14BF55A55A5018FDC/session
who 15066 0.0 0.0 64620 1500 ? S Jul15 0:00 \_ /bin/bash /usr/bin/nxnode --startsession
who 15411 0.0 0.0 15176 528 ? S Jul15 0:00 /usr/bin/dbus-launch --exit-with-session /usr/bin/nxredir xfce4-panel
who 15412 0.0 0.0 34884 968 ? Ss Jul15 0:00 /bin/dbus-daemon --fork --print-pid 4 --print-address 6 --session
who 31131 0.0 0.0 167468 5708 ? Ss Jul15 0:00 kdeinit Running...
who 31136 0.0 0.0 172128 7516 ? S Jul15 0:00 \_ klauncher [kdeinit]
who 31134 0.0 0.0 132976 3588 ? S Jul15 0:00 dcopserver --nosid --suicide
who 31138 0.0 0.0 171372 9532 ? S Jul15 0:00 kded
who 31142 0.0 0.1 231464 14584 ? S Jul15 0:00 knotify [kdeinit]
who 31145 0.0 0.0 80856 10224 ? S Jul15 0:00 /usr/bin/artsd -F 10 -S 4096 -s 60 -m artsmessage -l 3 -f
who 4858 0.0 0.1 189124 17144 pts/15 Ss+ Jul16 0:00 kdesu /usr/sbin/nxsadmin
nx 18972 0.0 0.0 28372 1832 ? Sl Jul16 0:00 /usr/bin/expect /usr/bin/nxnode-login -- ssh who 50022 /usr/bin/nxnode --slave
nx 18974 0.0 0.0 56316 3084 pts/1 Ss+ Jul16 0:00 \_ ssh -2 -x -l who 127.0.0.1 -o NumberOfPasswordPrompts 1 -p 50022 /usr/bin/nxnode --slave
who 19422 0.0 0.0 64356 956 ? S Jul16 0:00 /bin/bash /usr/bin/nxnode --slave
who 19424 0.0 0.0 64488 1896 ? S Jul16 0:00 \_ /bin/bash /usr/bin/nxnode --startsession
who 19716 0.0 0.0 64488 1404 ? S Jul16 0:00 \_ /bin/bash /usr/bin/nxnode --startsession
who 19723 0.0 0.0 66808 1952 ? S Jul16 0:00 \_ /bin/bash /usr/bin/nxnode --startsession
who 19949 0.0 0.1 190936 23964 ? S Jul16 0:00 | \_ /usr/bin/nxagent -persistent -R -name NX - who@server-a:1018 - server-a-panel (GPL Edition) -option /home/who/.nx/C-server-a-1018-9B753ACD8DA1CFDCFD96C2B482201BC2/options -nolisten tcp :1018
who 19729 0.0 0.0 61240 720 ? S Jul16 0:00 \_ tee /home/who/.nx/C-server-a-1018-9B753ACD8DA1CFDCFD96C2B482201BC2/session
who 19731 0.0 0.0 64620 1500 ? S Jul16 0:00 \_ /bin/bash /usr/bin/nxnode --startsession
who 20066 0.0 0.0 15176 524 ? S Jul16 0:00 /usr/bin/dbus-launch --exit-with-session /usr/bin/nxredir xfce4-panel
who 20067 0.0 0.0 34884 972 ? Ss Jul16 0:00 /bin/dbus-daemon --fork --print-pid 4 --print-address 6 --session
Re: запретить две одинаковых сессии
Это как раз не проблема:
Код: Выделить всё
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char *env= getenv("USER");
char *mycmd = "/usr/bin/nxserver --list ";
char buf[255]="";
strcat(buf,mycmd);
strcat(buf,env);
setuid(0);
system(buf);
return 0;
}
cc inputfile -o nxuserlist
на nxuserlist владелец root и suid, все... будет делать nxserver --list $USER
Re: запретить две одинаковых сессии
[root@server-a scripts]# cc inputfile -o nxuserlist
inputfile: file not recognized: File format not recognized
collect2: выполнение ld завершилось с кодом возврата 1
в inputfile положил Ваш код..
поправка..
[root@server-a scripts]# cc inp.cc -o nxuserlist
inp.cc: In function ‘int main()’:
inp.cc:13: ошибка: нет декларации ‘setuid’ в этой области видимости
inputfile: file not recognized: File format not recognized
collect2: выполнение ld завершилось с кодом возврата 1
в inputfile положил Ваш код..
поправка..
[root@server-a scripts]# cc inp.cc -o nxuserlist
inp.cc: In function ‘int main()’:
inp.cc:13: ошибка: нет декларации ‘setuid’ в этой области видимости
Re: запретить две одинаковых сессии
А... ну да... расширение у файла должно быть ".c" или "cc -x c inputfile -o nxuserlist"
ну и sudo apt-get install build-essential (может чего не хватает).
ну а скомпилированный вот:
ну и sudo apt-get install build-essential (может чего не хватает).
ну а скомпилированный вот:
Re: запретить две одинаковых сессии
Взял скомпилированный.
[who@server-a lib]$ /usr/sbin/nxlist
NXSERVER - Version 3.2.0-74-SVN OS (GPL, using backend: 3.4.0)
Usage: nxserver <option>
--passwd: Change password
[who@server-a lib]$ /usr/sbin/nxlist
NXSERVER - Version 3.2.0-74-SVN OS (GPL, using backend: 3.4.0)
Usage: nxserver <option>
--passwd: Change password
Re: запретить две одинаковых сессии
А права кто ставить будет?
sudo chown root:root ./nxlist
sudo chmod 4555 ./nxlist
sudo chown root:root ./nxlist
sudo chmod 4555 ./nxlist
Re: запретить две одинаковых сессии
права rwx --- ---, UID стоит, владелец root/root
пардоньте, работает, и наконец понял смысл действа)
пардоньте, работает, и наконец понял смысл действа)
Re: запретить две одинаковых сессии
однако в ступор меня ввела следующая мысль. Как в скрипте проверять наличие запущенных сессий, если одна сессия в любом случае запустится - текущая? ))
Вот первый вариант и отпал, остается доработка NX под контроль сессий..
Давайте немного обновим память..
Для этого не нужно дорабатывать NX? Достаточно разобраться с ключами в node.conf ?
Вот первый вариант и отпал, остается доработка NX под контроль сессий..
Давайте немного обновим память..
Во первых ее запуск можно подавить установкой ENABLE_AUTORECONNECT=1, при этом клиент запрашивает список сессий, получает, выдает серверу restoresession, сервер выполняет server_startrestore_session("resume"), при этом он сначала вводит сессию в состояние "suspend", а потом поднимает.
Для этого не нужно дорабатывать NX? Достаточно разобраться с ключами в node.conf ?
Re: запретить две одинаковых сессии
2Djelf: Мой знакомый рейдер фабрику по производству костылей не знает, куда девать. Не интересует? Обещает быть бешеная прибыль.
В смысле, зачем такие навороты? - Вся инфа о сессиях есть у юзера в каталогах .nx/C-*
На этот случай под сессию экспортируется $NXSESSIONID. Проверяй - не хочу.
Re: запретить две одинаковых сессии
>На этот случай под сессию экспортируется $NXSESSIONID. Проверяй - не хочу.
Ага! Спасибо! Будем искать инфо как инвертировать условие grep )
Ага! Спасибо! Будем искать инфо как инвертировать условие grep )
Re: запретить две одинаковых сессии
А зачем?
Код: Выделить всё
[ -n "$(echo "$varrr" | grep "$NXSESSIONID")" ] && echo "Есть более другие сессии"
Upd: Туплю. Там вместо grep должно быть что-то вроде sed 's/^*'"$NXSESSIONID"'//'
Re: запретить две одинаковых сессии
До этого я еще не дошел)) Пытаюсь разложить инфо по полочкам
получается
проблема в том что nxlist выдает всю инфу не разбивая сессии построчно, как nxserver --list
вот препятствие для проверок типа
Код: Выделить всё
for f in `/usr/sbin/nxlist | grep '127.0.0.1'`; do
sessiontype=`echo $f | grep status | cut -d= -f2`
user=`echo $f | grep userName | cut -d= -f2`
sessionid=`echo $f | grep sessionId | cut -d= -f2`
#echo "$sessiontype - $user - $sessionid"
#f=`/usr/sbin/nxlist | grep '127.0.0.1'`
echo $f
done
получается
Код: Выделить всё
127.0.0.1 1011 who 192.168.1.222 8705F399032063F06DF39C6A471EAEE3 127.0.0.1 1056 who 192.168.1.222 985064A19E7B116AD931380E68A15BA2
[who@server-a bin]$ ./server-a-panel
127.0.0.1
1011
who
192.168.1.222
8705F399032063F06DF39C6A471EAEE3
127.0.0.1
1056
who
192.168.1.222
985064A19E7B116AD931380E68A15BA2
проблема в том что nxlist выдает всю инфу не разбивая сессии построчно, как nxserver --list
Код: Выделить всё
127.0.0.1 1011 who 192.168.1.222 8705F399032063F06DF39C6A471EAEE3
[who@server-a bin]$ echo $NXSESSIONID
server-a-1011-8705F399032063F06DF39C6A471EAEE3
вот препятствие для проверок типа
Код: Выделить всё
[ -n "$(echo "$varrr" | grep "$NXSESSIONID")" ] && echo "Есть более другие сессии"
Re: запретить две одинаковых сессии
Да ну? Крутя забубенные циклы и не окавычивая переменные, еще не такие чудесные эффекты можно получить.
Ваша проблема решается двумя строчками, проверено:
Код: Выделить всё
cursess="$(echo "$NXSESSIONID" | sed 's/'"$HOSTNAME"'-//' | cut -d- -f2)"
[ -n "$(/usr/bin/nxlist | grep 127.0.0.1 | cut -f5 | sed '/^'"$cursess"'$/d')" ] && echo "Есть более другие сессии." || echo "Одын, совсэм одын!"
Даже nxlist для проверки пришлось стянуть, хотя я бы сделал через sudo.
Все вытекает из ссылочки, которую я уже давал. Могу еще раз дать.
Re: запретить две одинаковых сессии
спасибо
неохота каждому давать судо.. ой как неохота..
неохота каждому давать судо.. ой как неохота..
Re: запретить две одинаковых сессии
А на nxserver --terminate страшновато.. а прийдется, чтобы закрывать сессию ранее запущенную, или в суспенд кидать..
Вопрос: не подскажете как проверять результат nxclient --dialog yesno?
Re: запретить две одинаковых сессии
Не понял. Речь идет о ритуальном самоубийстве сессии? Тогда куда слать телеграммы? А главное, зачем?
Зря не обратили внимание на мою точку зрения по этой проблеме. Не надо никого "мочить в сортире" ©, надо мягко препятствовать запуску.
Upd:
cat nxdialog
Зря не обратили внимание на мою точку зрения по этой проблеме. Не надо никого "мочить в сортире" ©, надо мягко препятствовать запуску.
Upd:
cat nxdialog
Код: Выделить всё
dialog_yesno()
{
$DIALOG --stdout --title "$DIALOG_CAPTION" --yesno "$DIALOG_MESSAGE" 0 0
RC=$?
[ $RC -eq 0 ] && return 2
[ $RC -eq 1 ] && return 0
}
Re: запретить две одинаковых сессии
>Зря не обратили внимание на мою точку зрения по этой проблеме. Не надо никого "мочить в сортире" ©, надо мягко препятствовать запуску.
Именно реализация: не очень хочется лезть в дебри NX ) Если имеется ввиду не реализация а результат (запускаться не хочу) то так нет проблем и с текущей реализации задачи сделать, но..
Вдруг xfce4-panel подвисла? Вдруг и 1С-ка подвисла? Вдруг.... ??
Холтелось бы выдавать вменяемое предупреждение, что сессия не одна и иметь вариант по подтверждению "мочить в сортире" все что шевелиться)
Или есть другие идеи?
По диалогу: мне бы примерчик пользования.. Присвоил строку запуска окна переменной, пытаюсь в другом окне ее вывести - пусто..
Именно реализация: не очень хочется лезть в дебри NX ) Если имеется ввиду не реализация а результат (запускаться не хочу) то так нет проблем и с текущей реализации задачи сделать, но..
Вдруг xfce4-panel подвисла? Вдруг и 1С-ка подвисла? Вдруг.... ??
Холтелось бы выдавать вменяемое предупреждение, что сессия не одна и иметь вариант по подтверждению "мочить в сортире" все что шевелиться)
Или есть другие идеи?
По диалогу: мне бы примерчик пользования.. Присвоил строку запуска окна переменной, пытаюсь в другом окне ее вывести - пусто..
Код: Выделить всё
res=`/usr/bin/nxclient --dialog yesno --caption "Есть запущенные сессии" --message "У Вас уже есть запущенные сессии. Сбросить их?" --class warning`;
exec /usr/bin/nxclient --dialog ok --caption "Результат" --message "$res" --class info;
Re: запретить две одинаковых сессии
поддался интуиции: ветка "нет" срабатывает ) "да" не хочет..
Код: Выделить всё
if [ `/usr/bin/nxclient --dialog yesno --caption "Есть запущенные сессии" --message "У Вас уже есть запущенные сессии. Сбросить их?" --class warning` ]; then
/usr/bin/nxclient --dialog ok --caption "Результат" --message "Да" --class info
else
/usr/bin/nxclient --dialog ok --caption "Результат" --message "Нет" --class info
fi