GNU/Linux >> Linux の 問題 >  >> Linux

root として notify-send を実行する

ubuntu 14.04 の通知サービスが変更されました .

org.freedesktop.Notifications.service のように呼ばれるようになりました

Notification On Screen Display の詳細については、こちらをご覧ください。 可能性。

また、次のコマンド ラインを使用して独自のメッセージを送信することもできます

<ブロック引用>

[email protected] ~$ notify-send 「メッセージ本文」

udev によって起動されるスクリプトを更新するだけです

notify-send の実行に関連する問題を回避するには ルートとしてコマンドを実行してください。

通常のユーザーとして実行してみてください。つまり、

su <YOURUSER> -c 'notify-send “Text of message”'

Fabio Aのソリューションを試しました。しかし、私の Arch Linux インストールでは一貫して動作していないことに気付きました。問題は who でした tty1 セッションのポート番号が表示されませんでした:

$ who
john       tty1         2021-03-21 09:02

exec startx 経由で i3 を実行しています 私のArchインストールで。一方、 who の出力が Ubuntu デスクトップ インストールでは、完全に異なって見えました。ここでは、表示番号が表示されます:

$ who
john       :0           2021-03-21 09:49 (:0)

だから私は who を取り除くための別の解決策を探していました 指図。 ps aux であることがわかりました 表示番号とユーザー名の両方を含むこの便利なエントリが含まれています:

$ ps aux | grep xinit
john 785 763 0 19:14 tty1 S+ 0:00 xinit /home/john/.xinitrc -- /etc/X11/xinit/xserverrc :0 vt1 -keeptty -auth /tmp/serverauth.gGcqw2rJXG

これは私が書いた新しいスクリプトです:

#/bin/bash

xinit_pid=$(pgrep xinit)

if [ -n "xinit_pid" ]; then
    xinit_ps=$(ps --no-headers -f $xinit_pid | head -n 1)
    display=$(echo "$xinit_ps" | grep -Po " :[0-9]+ " | tr -d " ")
    user=$(echo "$xinit_ps" | cut -d " " -f 1)
    uid=$(id -u $user)
    echo "Display environment: $display $user $uid"
    sudo -u $user DISPLAY=$display DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus notify-send "[email protected]"
else
    echo "Warning: Could not find xinit process!"
fi

他のスクリプトは、次の方法でこのスクリプトを呼び出すことができます:

bash /opt/notify-send-helper Title Message -t 5000

補足:dunstify を使用しています notify-send の代わりに . dunstify ID を通知に割り当てることができるという利点があります。同じ ID の最新の通知のみが表示されます。

編集:私はプロセス「Xorg」を照会していました。しかし、不思議なことに、あるマシンでこのプロセスがルートとして実行されていることに気付きました。代わりに「xinit」プロセスに切り替えましたが、これはまったく同じように機能しますが、通常のユーザーによって常に実行されているようです.


root として実行されているバックグラウンド スクリプトからデスクトップ通知を送信するには
(X_user と X_userid をそれぞれ X を実行しているユーザーとユーザー ID に置き換えます):

sudo -u X_user DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/X_userid/bus notify-send 'Hello world!' 'This is an example notification.'

これは https://wiki.archlinux.org/index.php/Desktop_notifications から取得しました


tomy の回答と hongo の別の質問への回答を組み合わせると、問題がエレガントに解決されます。

function notify-send() {
    #Detect the name of the display in use
    local display=":$(ls /tmp/.X11-unix/* | sed 's#/tmp/.X11-unix/X##' | head -n 1)"

    #Detect the user using such display
    local user=$(who | grep '('$display')' | awk '{print $1}' | head -n 1)

    #Detect the id of the user
    local uid=$(id -u $user)

    sudo -u $user DISPLAY=$display DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus notify-send "[email protected]"
}

この関数は root として実行されるスクリプトでそのまま使用できます notify-send のドロップイン置換として コマンド。


Linux
  1. Plesk12のルートに代わって実行中のタスクから保護する

  2. どのシェルで実行していますか?

  3. スクリプトが実行されていることを確認しますか?

  1. ルートとして実行している場合でも、ファイルを削除できませんか?

  2. ルートとしてコマンドラインからソフトウェアセンターを実行していますか?

  3. MySQLルートパスワードをリセットする

  1. Linuxの権限101

  2. Notify-Send With Cronを使用していますか?

  3. ルートパスワードを変更するにはどうすればよいですか?