Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Послать сообщение всем пользователям  (Прочитано 6557 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн BAKT

  • Автор темы
  • Участник
  • *
  • Сообщений: 112
    • Просмотр профиля
Нужно послать сообщение из терминалки всем активным пользователям. Пока накропал вот такой вот скрипт:

#!/bin/bash

for i in $(who -u | grep tty | awk '{print $1}');
    do
        echo "username check $i";
        export  XAUTHORITY=/home/$i/.Xauthority
        export DISPLAY='127.0.0.1:0.0'
        zenity --info --title="title" --text="msg" &
    done

Всё работает замечательно, если активен в системе только один пользователь. НО! Если в системе предыдущий пользователь не вышел, а новый пользователь просто "переключил" пользователя на себя, то мы имеем вот такую картину:

who -u | grep tty
test1    tty7         2015-05-08 21:18  даΠ      2828
teacher  tty8         2015-05-08 21:18  даΠ      3246

При таком положении дел при запуске моего скрипта моё сообщение видит только первый юзверь в списке. Возможно ли это как-то исправить?


Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3270
    • Просмотр профиля
Re: Послать сообщение всем пользователям
« Ответ #1 : 08 Мая 2015, 23:22:15 »
Не знаю, не вникал глубоко, но попробуйте команду write.
Пётр.

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Wars ~.o

Оффлайн BAKT

  • Автор темы
  • Участник
  • *
  • Сообщений: 112
    • Просмотр профиля
Re: Послать сообщение всем пользователям
« Ответ #3 : 09 Мая 2015, 01:19:33 »
Не знаю, не вникал глубоко, но попробуйте команду write.

На сколько я помню - оно поможет только если конечный пользователь сидит в консоли, нет?

https://sandalov.org/blog/2024/

$ ls /usr/share/ | grep light
crew@VBox:~$

Цитировать
$ lsb_release -a
No LSB modules are available.
Distributor ID:   Ubuntu
Description:   Ubuntu 12.04.5 LTS
Release:   12.04
Codename:   precise

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

PS: Я забыл уточнить, думал это понятно будет из текста самого скрипта, что конечные пользователи достаточно ленивы и.... необразованны, так что единственный вариант - выводить им сообщение не в консоли, а именно через графический интерфейс. Именно по этому я использую zenity, а не тот же wall.
« Последнее редактирование: 09 Мая 2015, 01:24:12 от BAKT »

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: Послать сообщение всем пользователям
« Ответ #4 : 09 Мая 2015, 02:26:41 »



                      ______ PC2 server X  ip 192.168.1.2
                     /
PC1 ----------------|---------PC3 server X ip 192.168.1.3
 ip 192.168.1.1     \
terminal             \______ PC4  server X ip 192.168.1.4
DISPLAY=192.168.1.4:0.0 zenity --info

PC1 на PC4


Wars ~.o

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3270
    • Просмотр профиля
Re: Послать сообщение всем пользователям
« Ответ #5 : 09 Мая 2015, 09:26:48 »
У вас же там цикл по пользователям, т.е. скрипт посылает сообщение
всем пользователям поочерёдно.
write или, как у меня в Debian, bsd-write, работает и в X-ах,
но она интерактивная. Надо ввести команду с именем пользователя,
она будет ждать ввода сообщения. Если его ввести, то оно будет
послано этому пользователю. Т.е. чтобы использовать её в скрипте,
надо её вызывать через expect. Сам я никогда ею не пользовался.

Пользователь решил продолжить мысль 09 Мая 2015, 09:34:28:
Кстати, я ошибся. bsd-write может послать сообщение и сразу и после этого закончиться,
т.е. без expect. Именно в форме
echo "my message" | bsd-write peter /dev/pts/1при этом на /dev/pts/0 она сразу же заканчивается, зато на терминале,
на который вывелось сообщение, над нажимать Ctrl+C.
« Последнее редактирование: 09 Мая 2015, 09:34:28 от Peter_I »
Пётр.

Оффлайн BAKT

  • Автор темы
  • Участник
  • *
  • Сообщений: 112
    • Просмотр профиля
Re: Послать сообщение всем пользователям
« Ответ #6 : 09 Мая 2015, 14:05:16 »
ОК. Может я как-то не так объясняю?... Вот задача целиком:

Я работаю в школе, где потихоньку, на смену win ввожу Ubuntu и едUbuntu. Сами учителя, поверьте мне, люди ленивые и ограниченные. Выучить для них что-то новое, что касается компа - дело практически нереальное. Не говоря уже о том, что сидеть в консоли им просто нет необходимости.

В одном кабинете может вести уроки несколько учителей, каждому из которых нужна своя учётная запись. Регулярно учителя не выходят из своих сеансов, а следующий просто входит под собой. Таким образом у нас в системе оказывается два и более активных пользователя. Моя проблема, в основном, состоит в том, что уже несколько раз я сталкивался с ситуацией, когда я со своей машины по ssh начинаю апдейт софта (обычно это в конце дня), а учитель тупо вырубает машину кнопкой или ресетом. Для этого я и пытаюсь выводить им ГРАФИЧЕСКОЕ окно с предупреждением.

Как я понимаю пакеты типа write, wall и т.д. годятся только в том случае, если пользователь, хотя бы, сидит в эмуляторе консоли, нет? При этом тот же wall даже не все эмуляторы терминала понимают. Тот же LXTerminal в упор не видит посланное сообщение, а запущенный рядом xterm - нормально отрабатывает и показывает.

Итак:

- нужно послать сообщение через ssh
- послать нужно всем активным пользователям
- послать нужно так, чтобы пользователю было выведено графическое окно, а не через терминал\эмулятор терминала

Частично с этим справляется мой скрипт из первого сообщения. Частично, потому, что сообщение выводится ТОЛЬКО первому найденному пользователю. По этому и прошу совета.

Если я копаю не в том направлении, то помогите, пожалуйста.






Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: Послать сообщение всем пользователям
« Ответ #7 : 09 Мая 2015, 14:31:17 »
BAKT,
Цитировать
who -u | grep tty
test1    tty7         2015-05-08 21:18  даΠ      2828
teacher  tty8         2015-05-08 21:18  даΠ      3246
тогда терминал команду отправить.
echo Привет | mail teacherа оно нужно в терминал каждый Enter то будет сообши вывод.
Wars ~.o

Оффлайн BAKT

  • Автор темы
  • Участник
  • *
  • Сообщений: 112
    • Просмотр профиля
Re: Послать сообщение всем пользователям
« Ответ #8 : 09 Мая 2015, 15:25:29 »
И что это мне даст? Сообщение в консоли для пользователя, что у него есть новое сообщение? В консоли, которую пользователь В ПРИНЦИПЕ не открывает! Не открывает от слова НИКОГДА. Потому, что не хочет, не умеет и, что самое печальное, не хочет учиться!

Мне нужно окно на экране, которое было бы сразу видно, чтобы даже самая "тёмная" 60-70 летняя бабка не додумалась нажать кнопку на системнике!



или



Ребят, я НЕ спрашиваю "как мне вывести сообщение пользователю", я спрашиваю "ПОЧЕМУ если в системе залогинены двое, то послать я могу только первому из списка? и как это обойти?"
« Последнее редактирование: 15 Апреля 2019, 22:43:20 от BAKT »

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Wars ~.o

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3270
    • Просмотр профиля
Re: Послать сообщение всем пользователям
« Ответ #10 : 09 Мая 2015, 16:47:36 »
В X-ах не /dev/tty, а /dev/pts/x.
Ещё для вывода всплывающих сообщений есть notify-send.
Пётр.

Оффлайн BAKT

  • Автор темы
  • Участник
  • *
  • Сообщений: 112
    • Просмотр профиля
Re: Послать сообщение всем пользователям
« Ответ #11 : 09 Мая 2015, 17:09:19 »
ОК, я нашёл в чём проблема.

В моём скрипте

#!/bin/bash

for i in $(who -u | grep tty | awk '{print $1}');
    do
        echo "username check $i";
        export  XAUTHORITY=/home/$i/.Xauthority
        export DISPLAY='127.0.0.1:0.0'
        zenity --info --title="title" --text="msg" &
    done

"export DISPLAY" задан статично. Тогда как у каждого залогиненного пользователя этот параметр свой.

crew@vbox:~$ echo $DISPLAY
:0.0

test@vbox:~$ echo $DISPLAY
:1

test2@vbox:~$ echo $DISPLAY
:2


и т.д. Нюанс только в том, что у меня не получается получить эти данные при подключении к машине через ssh.

Таким образом, если в скрипте вручную менять
export DISPLAY='127.0.0.1:0.0'
на
export DISPLAY='127.0.0.1:1'
 
export DISPLAY='127.0.0.1:2'

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

Отсюда вопрос - как узнать какой дисплей сейчас принадлежит какому пользователю? И можно ли это подставить в скрипт?

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: Послать сообщение всем пользователям
« Ответ #12 : 09 Мая 2015, 17:39:00 »
да, процесс X :0 и X :1.
а ну покажи.
ps aux | grep X?

а что я писал?
Цитировать
$ ls /usr/share/ | grep light
crew@VBox:~$
???
Wars ~.o

Оффлайн BAKT

  • Автор темы
  • Участник
  • *
  • Сообщений: 112
    • Просмотр профиля
Re: Послать сообщение всем пользователям
« Ответ #13 : 09 Мая 2015, 17:56:42 »
да, процесс X :0 и X :1.
а ну покажи.
ps aux | grep X?

ps aux | grep X
root      1219  0.0  4.5 144832 93664 tty7     Ss+  15:46   0:02 /usr/bin/X :0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch -background none
root      8194 23.6  1.4  82100 30668 tty8     Ss+  16:34  15:49 /usr/bin/X :1 -auth /var/run/lightdm/root/:1 -nolisten tcp vt8 -novtswitch
test2     8397  0.0  0.2  28192  4584 ?        Ssl  16:34   0:00 /usr/bin/lxsession -s LXDE -e LXDE
test2     8498  0.0  0.5 121196 11512 ?        Sl   16:34   0:00 lxpanel --profile LXDE
test2     8500  0.0  0.5 122956 11840 ?        Sl   16:34   0:00 pcmanfm --desktop --profile LXDE
root      9076 20.1  1.1  75080 23672 tty9     Ss+  16:35  13:20 /usr/bin/X :2 -auth /var/run/lightdm/root/:2 -nolisten tcp vt9 -novtswitch
test1     9286  0.0  0.2  28192  4584 ?        Ssl  16:35   0:00 /usr/bin/lxsession -s LXDE -e LXDE
test1     9388  0.0  0.5 121196 11332 ?        Sl   16:35   0:00 lxpanel --profile LXDE
test1     9390  0.0  0.5 122956 11680 ?        Sl   16:35   0:00 pcmanfm --desktop --profile LXDE
root     10030  0.0  0.0   4388   828 pts/3    S+   17:41   0:00 grep --color=auto X

а что я писал?
Цитировать
$ ls /usr/share/ | grep light
crew@VBox:~$
???


У меня в принципе такой папки нет в /usr/share/. Потому и показал выводы ls и какая у меня ОСь.
Если я правильно понимаю, то ты предлагал отключить nolisten? Нагуглил вот эту тему, отключил, только что это мне дало?

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: Послать сообщение всем пользователям
« Ответ #14 : 09 Мая 2015, 18:12:58 »
Цитировать
root      1219  0.0  4.5 144832 93664 tty7     Ss+  15:46   0:02 /usr/bin/X :0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch -background none
root      8194 23.6  1.4  82100 30668 tty8     Ss+  16:34  15:49 /usr/bin/X :1 -auth /var/run/lightdm/root/:1 -nolisten tcp vt8 -novtswitch

видите?
всё норм, ты правильнр пишет дисплав=:1 зеюиту у себе, а -nolisten tcp это запретит ип адресс, только
одно 127.0.0.1:1 или :1 .
Wars ~.o

 

Страница сгенерирована за 0.02 секунд. Запросов: 19.