LINUX.ORG.RU
решено ФорумAdmin

Отправка GUI сообщений нескольким хостам через ssh (bash)

 , ,


1

1

Доброго времени суток, только начинаю освоение Linux, в данный момент это Linux Mint 19.1 Cinnamon , по работе иногда приходится сообщать о чём-либо сотрудникам, для этого есть чат в WhatsApp, но обычно они за ним не следят (зато следят за клипами на ютубе), поэтому я хотел реализовать отправку сообщений через ssh сразу всем сотрудникам. В данный момент они используют тот же дистрибутив, на удаленных машинах уже лежат ключ, в данный момент я с горем (гуглом) поплам написал (накопипастил) вот такой скрипт:

#!/bin/bash
set -x

LOG="info.log"

HOSTS="
192.168.1.143
192.168.1.144
"
for H in $HOSTS
do
ssh $H 'sudo -u user DISPLAY=:0.0 zenity --info --title="Системный Администратор" --text="Проверка системы уведомлений"'
done >>$LOG 

1.Он работает, но: После подключения к первому хосту - скрипт требует от меня взаимодействия, например, у первого хоста нет ключа, и вместо того, чтобы отправить команду второму хосту, скрипт настойчиво требует пароль от первого и пока не получит любой ввод, не начнет подключение ко 2-му.

2. Отправляю команду на 2й хост, команда выполняется успешно (на удаленной машине выскакивает окно), НО скрипт не продолжает выполнение, пока на удаленном компе не нажмут ОК.

3. Используется zenity т.к первое, что удачно заработало из найденного в интернете без установки доп. ПО + ,как я понял, можно поменять размер текста и окна, что очень важно для более взрослых сотрудников.

4. Я понимаю, что, возможно, подобный вопрос уже задавался n^12 раз, но решения конкретно моей проблемы я не нашёл.

5. Мне не принципиально использования именно такой схемы/кода и я готов работать/читать/смотреть любую информацию.

Мой первый пост, не убивайте :(

Ответ на: комментарий от Vsevolod-linuxoid

Не помогло

Ноль реакции. Пробую вручную вводить в терминал. Попробовал уже и & и nohup , пока что безуспешно. Гугл говорит, что notify-send «не умеет в сеть»... Можем с вами связаться сейчас как-нибудь? У меня в профиле есть страница в вк... или запрещено правилами?

anaxita
() автор топика

по работе иногда приходится сообщать о чём-либо сотрудникам, для этого есть чат в WhatsApp, но обычно они за ним не следят (зато следят за клипами на ютубе), поэтому я хотел реализовать отправку сообщений через ssh сразу всем сотрудникам

Решать социальные проблемы с помощью технических средств - это такое

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

Социум - тоже важно

Мобильная связь - чем не решение соц. проблем современного мира?

По сабжу: Через тот же zenity, как я понял, можно не просто отправлять сообщения, а также различные поля и формы, которые можно заполнить, например на смену пароля и прочие штуки, просто я до этого не дорос.

По коду: в данный момент понятно, что скрипт ждёт ответа от zenity 0-5 в зависимости от того, как было закрыто окно - это первая проблема. Вторая, как и была изначально - почему скрипт (цикл) не продолжает работу, а сидит и ждёт завершения предыдущей команды...

anaxita
() автор топика
Ответ на: Социум - тоже важно от anaxita

Предварительно ssh ключи эспортируй на пользователькие машины что бы был автологин в их сессии. Админу вбивать пароль моветон


#!/bin/bash
set -x

LOG="info.log"

HOSTS="
user@192.168.1.143
user@192.168.1.144
"

for H in $HOSTS 
do
ssh -X $H 'DISPLAY=:0 notify-send "hello"'
done >>$LOG 

Ещё есть вот такой костыльинструмент https://github.com/itsamenathan/libnotify-over-ssh

Deleted
()
Последнее исправление: Deleted (всего исправлений: 3)

Ваша задача решается по другому

1 Делается сервер на котором есть процесс раздающий сообщения

2 На клиентах есть процесс слушающий постоянно сервер

Реализовать способов много, например у Firebird есть механизм POST_EVENT, можно налепить приложение на этом https://it.wikireading.ru/36885

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

Да просто оповещения это норм, ну типа «Приехала зарплата!» для тех кто возжелал получать наличкой :D

А на самом деле весело что вроде как нет так сказать «из коробки» массовых оповещений кроме конечно же wall

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

В идеале конечно микросервер и клиентики склепать, только вот ТС сказал что он только-только вникает, я хз или в job или хотя бы на гите простеший клиент/сервер найти и заюзать.

Deleted
()
Ответ на: Не помогло от anaxita

Можем с вами связаться сейчас как-нибудь? У меня в профиле есть страница в вк... или запрещено правилами?

1) Это запрещено духом форумов (не у тебя одного может быть такая проблема). 2) Не ясно, чем это лучше этого форума. 3) С чего ты решил, что я советую навярняка, а не перебираю варианты? Прочти инфу в моем профиле.

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

Хитрожопый Всеволод :D Не не так, а Всеволод ясно солнышко первый - Хитрожопый )))))))))))))))))))))

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

Не помогло

Код выполнился, но уведомления на удаленном хосте не было, через

Уточню пару моментов 1. Ключ уже на удаленной машине есть 2. Использую sudo -u user т.к доступ есть к админке (sudo), а команды надо выполнить в активной сессии user. ----------------

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

anaxita
() автор топика
Ответ на: Не помогло от anaxita

Дело не в синтаксисах notify-send работает через dbus, вот и облом. zenity ЕМНИП всегда требует ввода, вот и облом. Может где и есть решение из коробки для гуя, но я хз какое. А дорос не дорос эт всё херня берёшь какойнить питон и пример типа https://habr.com/ru/post/149077/ и делаешь себе клиент сервер (клиент делаешь циклом что бы он всегда опрашивал сервер, и если что есть запускал notify-send уже по нормальному прямо в сессии пользователя) а сервер лишь шлёт 0-ничего не0 вывести как сообщение.Таким образом и растёшь. Обычные питоноскрипты. Или жди залётного, может кто-что подскажет. Или напиши в https://www.linux.org.ru/forum/job/ и за тебя всё сделают

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

Я так понимаю, в баш скрипте (ну и вообще в линуксе) можно использовать код от питона и других языков? и возможно даже вместе? И по вашей ссылке примерно показано как создать относительно простое решение моей проблемы... верно понял? Питон от баш или си шарп синтаксисом и сложностью сильно отличается? Пока что по работе что-то вроде полу хелп деск эникейщика, которому впихнули asterisk с битриксом и сказали избавиться от винды... вот теперь варюсь в этом, на аутсорсе ребята слишком дорогие оказались...поэтому вот пытаюсь во всем сразу немного разбираться. Сори за тупые вопросы.

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

баш скрипте (ну и вообще в линуксе) можно использовать код от питона и других языков?

Ну, да. Видал шебанг #! эта хрень указывает что после неё пойдёт программа, а на следующей строке пойдёт то что эта команда будет исполнять. В твоём случае это баш, но можно написать там python и тогда далее должен быть код на python. Можно в баше вызывать питон, а в питоне баш и как угодно ещё. Но лучше что-то одно. Хотя зависит от случая. Баш в принципе командный интерпретатор и служит для исполнения внешних команд, всё что ты вводишь в терминале ты водишь в баш/ или иной шел не важно.

И по вашей ссылке примерно показано как создать относительно простое решение моей проблемы… верно понял?

Ну тип того. Хотя если вообще непонятно могут быть сложности, но тут гордость лелеять не надо, просто копипастишь и играешься пока не поймёшь как оно работает, а потом для доработки гуглишь «как в python запустить внешнюю команду» и тому подобное.

Питон от баш или си шарп синтаксисом и сложностью сильно отличается?

Если с языками (любыми) дело имел мало то сильно.

Пока что по работе что-то вроде полу хелп деск эникейщика, которому впихнули asterisk с битриксом и сказали избавиться от винды… вот теперь варюсь в этом, на аутсорсе ребята слишком дорогие оказались…поэтому вот пытаюсь во всем сразу немного разбираться. Сори за тупые вопросы.

Все с чего-то начинают. Но тебе полюбому придётся какойто скриптовый язык общего назначения учить python или lua не знаю что понравится для автоматизации.

Попробуй пример с хабра воспроизведи на своей машине, потом подумай как сделать так что бы клиент постоянно опрашивал сервер, затем сделай так что бы он запускал команду уведомления если у сервера есть сообщение и когда всё будет готово добавишь скрипт клиента в автозагрузку всех машин где требуются уведомления и всё. Никаких ssh не надо, просто будешь серверу давать строку, а он отдавать её клиентам.

Или ща придёт человек внезапно сюда и даст готовое решение. Время 5 утра, мля пора спать

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

Копирнул код по сокетам питона...он не запустился потому что ему не понравилась ВИЗУАЛЬНАЯ вложенность цикла! Отступы, пробелы Вопрос: Что я вам плохого сделал? За что вы меня так? Это способ намекнуть, что лучше на панель, да? :(

---------- Клиент-сервер на своем компе вроде запустил, вроде бы даже подключилось... только я так и не понял, как передать команду линуксовую?

sock.send('chorome')
не работает...гуглю, но толку нет.

anaxita
() автор топика
Ответ на: Не помогло от anaxita

Попробовал уже и & и nohup , пока что безуспешно.

Только что попробовал аналогичный скрипт (тот, который в ОП, правда с одним хостом, в цикле с другой переменной), с добавлением & после команды ssh (ВНЕ кавычек) — всё отработало нормально, появилось несколько окон не дожидаясь каких либо действий/ввода.

spectr00 ★★★
()
  1. Настрой авторизацию по ключам, без этого жизни нет.

  2. Простое не изящное решение ssh '....' &

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

Вы код-то смотрели? Именно эту конструкцию и использую, но не работает.

Почему уже третий человек предлагает авторизацию по ключам, если в самом первом сообщении я указал, что ключ на хостах есть, и в коде нигде пароль я не передаю... Или так принято на форумах?

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

http://i.imgur.com/6SOtMVL.png Вот что выдает команда, если я закрою свой терминал - то на удаленном хосте окно остается, всё ок, но суть в том, что в моем терминале команда всё еще ждала ответа, следовательно, следующий круг цикла перебора хостов не запустится, причем даже с continue

anaxita
() автор топика
ssh $H 'sudo -u user DISPLAY=:0.0 zenity --info --title="Системный Администратор" --text="Проверка системы уведомлений"' &

просто в конце добавить '&' - запустить команду в фоне и не ждать ее завершения

zaz ★★★★
()
Последнее исправление: zaz (всего исправлений: 1)

Для того чтобы не спрашивало при первом подключении к хосту (верификация приватного ключа хоста) можно указать опцию

ssh -o StrictHostKeyChecking=no $H '....'

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

В условиях цикла код не отрабатывает. Первый раз команда отправляется, а дальше терминал ждёт ответа от хоста. Просто попробуйте отправить сообщение себе и на выдуманный второй хост и увидите, что пока не нажмете ОК - терминал на выдуманный хост даже не дунет. ХЕЛП :(

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

если в самом первом сообщении я указал, что ключ на хостах есть

В топике

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

Видимо действительно «так принято на форумах» что у всех со зрением что-то не то.

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

Хм, неверно поняли информацию... значит я неверно её донёс, признаю ошибку, виноват.

В общем ситуация следующая: код такой же как в топике, на обоих хостах есть ключ и запись в sudoers, вручную из терминала команда выполняется, но всё так же ждёт результат выполнения команды. Всевозможные добавки в виде & и nohup попробовал, даже пробовал запустить удаленно терминал и уже в нем выполнить команду - бестолку, всё замирает после первой команды.

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

Просто попробуйте отправить сообщение себе и на выдуманный второй хост и увидите, что пока не нажмете ОК - терминал на выдуманный хост даже не дунет.

Kubuntu 18.04

Код:

#!/bin/bash
set -x

LOG="info.log"

HOSTS="
localhost
localhost
localhost
"
for H in $HOSTS
do
ssh $H 'sudo -u ifignat1 DISPLAY=:0.0 zenity --info --title="Системный Администратор" --text="Проверка системы уведомлений" 2>/dev/null' &
echo host $H done
done

Вот результат

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

Обращаю внимание, что символ & относится в данном случае к команде ssh, а не zenity или скрипту в целом...

2>/dev/null добавил чтобы GTK-шные сообщения не портили скриншот.

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

Оповещения есть, но люди их игнорируют. Значит надо такие оповещения запилить, чтобы прямо в мозги залезали!

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

Разобрались, проблема была в том, как linux mint 19.1 cinnamon запускает скрипт, если запускать двойным щелчком, то система предлагает показать, либо запустить в терминале. Но запуск в терминале видимо какой-то багованный.

Сейчас запустил вручную скрипт через ./script.sh и всё отработало как надо. В общем повод сменить дистрибутив.

Тему можно закрывать, СПАСИБО.

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

Первый раз команда отправляется, а дальше терминал ждёт ответа от хоста.

Ничего он не ждет, то что в вашем скрине http://i.imgur.com/6SOtMVL.png это не более чем выхлоп на терминал. Но это не означает что нельзя набрать команду.

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

если запускать двойным щелчком
administrator
В общем повод сменить дистрибутив.

«Пора переустанавливать шиндоуз»

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

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

При запуске напрямую из терминала через ./script.sh проблема ушла. Проблема была в том, «как» ось запускала скрипт.

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

Оповещения есть, но люди их игнорируют. Значит надо такие оповещения запилить, чтобы прямо в мозги залезали!

SMS «Мама мне срочно нужны деньги, положи 500 руб на вот этот номер xxxxxxx» Говорят срабатывает :)
А если серьезно, то мне кажется даже удары током не помогут. В разное время, начиная с dos, уж делали прямо сильно красные предупреждения, ответ как обычно «а я не читал» и нажал «кнопка».

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

он не запустился потому что ему не понравилась ВИЗУАЛЬНАЯ вложенность цикла! Отступы, пробелы

https://pythonworld.ru/osnovy/sintaksis-yazyka-python.html

Что я вам плохого сделал? За что вы меня так?

o_O? Всё нормально, ты был не в курсе форматирования отступами, а не скобками или операторами, теперь ты в курсе.

Это способ намекнуть, что лучше на панель, да? :(

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

Клиент-сервер на своем компе вроде запустил, вроде бы даже подключилось…

Никаких вроде, тут либо да либо нет. Ты продключаешься.

только я так и не понял, как передать команду линуксовую?

тебе не надо слать команду, тебе надо слать текст.

Ладно хрен с тобой во тебе рабочий вариант

Server

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import socket

sock = socket.socket()
sock.bind(('', 9090))
sock.listen(1)
conn, addr = sock.accept()

print 'connected:', addr

while True:
    data = conn.recv(1024)
    if not data:
        break
    print data;
    conn.send('"йя админ йя глаголю"')

conn.close()

Client

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import time
import socket 

sock = socket.socket()
sock.connect(('localhost', 9090))

while True:
    time.sleep(3)
    sock.send('ping')
    data = sock.recv(1024)
    print data 
    os.system("notify-send "+data)

sock.close()

А теперь придумай так что бы ты серверу как то передавал сообщение для рассылки и это сообщение передавалось на хост только 1 раз

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

Ошейники с пьезоэлементом от зажигалки )) Бодрит!

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

Тоже не сработает. Пожалуются что софт «не работает». Т.е. получаеться опять мимо. И вот это

Ошейники с пьезоэлементом от зажигалки

Тоже пожалуются, что софт током бьет.

ЗЫ Это я со своей многолетней практики пишу, до анального устройства не добрались конечно, но и предупреждения какие не делай, пофиг.

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

Спасибо за ваше терпение!)

Ну я вижу conn.send('«йя админ йя глаголю»'), только не могу понять куда этот текст передался... как с ним работать... я так понимаю там можно и команду передать, но как её прочитать =/

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

Клиент раз в 3 кекуды шлёт серверу ping тот отвечаент сообщением «йя админ йя глаголю» клиент получает его и склеивает с командой notify-send и исполняет на хосте клиента notify-send "йя админ йя глаголю" ты передаёшь не команды, а текст который клиент будет выводить. «йя админ йя глаголю» это data на Client. ping это data на сервере

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

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

как с ним работать… Можешь написать там другой текст, можешь завести переменную куда будешь писать сообщениетектовое, можешь писать сообщение в файл откуда сервер будет читасть и если файл не пуст рассылать всем сообщение.

как её прочитать

print data видишь? всё что передаётся печатается

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

ЗЫ Вот вспомнил, когда-то давно для оповещения диспетчеров забубенил wav-чик запуска pinball от nt4. По жалобам диспетчеров, вставляло не хило :) Просыпались мгновенно :) Поменяли на более «ласковое». Но это же только для случая когда человек спит.

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

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

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

Возьму на вооружение, как оповещение о новой сделке, а то вечно «ой я не слышал, не видел, окно не всплывало, смска не приходила»

Дарю решение. Развешиваем по офису матюгальники от системы ЧС :)))))) Фиг потом докажешь «что не слышал» под «неоспоримой кипой доказательств» в виде внезапных приступов энуреза/нервных-расстройств и заявлений в ментовку от жителей близ лежащих домов :)))))

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

ЗЫ Теперь вполне серьезно. Звук сообщения должен быть циклическим, до нажатия на кнопку «ок», может же чел «пописать отойти», если дальнейшие разборки играют роль, то при нажатии «ок» обязательна запись в базу. Но это уже к усложненной системе, когда даже ребут не поможет (в виде отмазки у меня комп перезагрузился и я не заметила).

anc ★★★★★
()

Оповещение, проигнорировав которое, пользователь не лишился части зарплаты - бессмысленно.

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