notify-send не работает через SSH

Я хочу использовать ПК A для отправки уведомления на ПК B через SSH, но я не видел уведомления на B.

ssh user_name@B_ip 'notify-send hello'

Я также попробовал это: использовать SSH на B, чтобы войти в A, а затем войти в B назад и затем отправить уведомление. Однако это все еще не сработало. Не видел уведомления на B тоже.

3 ответа

Решение

Вы должны установить переменную DISPLAY

DISPLAY=:0.0 notify-send hello

Для получения дополнительной информации об этой переменной см. Это.

Уведомления отправляются через dbus (сеанс пользователя). Вам нужно туннелировать сокет dbus через SSH, чтобы программа, работающая на другом компьютере, могла отправлять уведомления на ваш рабочий стол.

Рабочий процесс:

  1. Выставьте сокет dbus на локальный TCP-порт (доступно только с локального хоста)
  2. Обратный туннель этого локального TCP-порта на удаленной машине (используя SSH)
  3. На удаленной машине выставьте этот TCP-порт как абстрактный сокет.
  4. Сообщите notify-send, к какому сеансу dbus подключиться (созданный абстрактный сокет)

@local представляет ваш рабочий стол, а @remote представляет машину, к которой вы подключаетесь по ssh.

  1. Перенаправить локальный порт:7272 в абстрактный сокет dbus (гуид будет использоваться позже)
      @local $ echo $DBUS_SESSION_BUS_ADDRESS
unix:abstract=/tmp/dbus-pH1JnDeLNA,guid=5fe0907d81e722390f1ce02d6033ad76
@local $ socat TCP-LISTEN:7272,reuseaddr,fork ABSTRACT-CONNECT:/tmp/dbus-pH1JnDeLNA
  1. Восстановить переадресацию порта 7272 с удаленного хоста (заменить $REMOTE_HOSTNAME)
      @local $ ssh -R localhost:7272:localhost:7272 $REMOTE_HOSTNAME
  1. Перенаправить абстрактный сокет на локальный хост:7272
      @remote $ socat ABSTRACT-LISTEN:/tmp/custom_dbus_name,fork TCP:localhost:7272
  1. Запустить уведомление-отправить
      @remote $ export DBUS_SESSION_BUS_ADDRESS='unix:abstract=/tmp/custom_dbus_name,guid=5fe0907d81e722390f1ce02d6033ad76'
@remote $ notify-send "Hello, World"

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

      export DBUS_SESSION_BUS_ADDRESS=unix:path=$XDG_RUNTIME_DIR/bus
notify-send "Test Test" "testing..."

ДИСПЛЕЙ может быть другим или не установленным в Wayland.

Другие вопросы по тегам