AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 425211
Accepted
AlmuHS
AlmuHS
Asked: 2018-02-20 07:30:32 +0800 CST2018-02-20 07:30:32 +0800 CST 2018-02-20 07:30:32 +0800 CST

Como posso enviar uma notificação com o polkit 0.106?

  • 772

Estou desenvolvendo um aplicativo para não esquecer o pendrive.

Este aplicativo deve bloquear o desligamento se um pendrive estiver conectado à máquina. Conforme este formulário, caso o usuário queira desligar o sistema enquanto um pendrive estiver conectado, o sistema mostra uma notificação para alertar que deve desligar o pendrive para desbloquear o desligamento.

Para detectar o evento de desligamento, defino uma regra de polkit que chama um script para verificar se algum pendrive está conectado ao sistema.

Se houver algum pendrive conectado, a regra do polkit chama para notificar-enviar através do script send_notify.sh, que executa este comando:

notify-send "Pendrive-Reminder" "Extract Pendrive to enable shutdown" -t 5000

A regra do polkit é esta:

polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.consolekit.system.stop" ||
        action.id == "org.freedesktop.login1.power-off" ||
        action.id == "org.freedesktop.login1.power-off-multiple-sessions" || 
        action.id == "org.xfce.session.xfsm-shutdown-helper")  
    {

        try{    
            polkit.spawn(["/usr/bin/pendrive-reminder/check_pendrive.sh", subject.user]);        
            return polkit.Result.YES;

        }catch(error){
            polkit.spawn(["/usr/bin/pendrive-reminder/send_notify.sh", subject.user]);
        return polkit.Result.NO;
     }
   }
  }

Mas. depois de colocar esta regra de polkit e pressionar o botão de desligamento, meu usuário não recebe nenhuma notificação.

Eu depurei a regra e verifiquei se o segundo script foi executado, mas notify-sendnão mostra a notificação para o meu usuário.

Como posso resolver isso?

ATUALIZAR:

Eu tentei modificar o script assim:

#!/bin/bash

user=$1

XAUTHORITY="/home/$user/.Xauthority"
DISPLAY=$( who | grep -m1 $user.*\( | awk '{print $5}' | sed 's/[(|)]//g')

notify-send "Extract Pendrive to enable shutdown" -t 5000

exit 0

O usuário é passado como parâmetro pelo pòlkit

Mas o problema continua

ATUALIZAÇÃO: Acabei de ver esse bug https://bugs.launchpad.net/ubuntu/+source/libnotify/+bug/160598 que não permite enviar notificações como root.

Mais tarde vou testar para modificar a solução alternativa alterando o usuário

UPDATE2: Depois de alterar o código para this. o problema continua:

#!/bin/bash

export XAUTHORITY="/home/$user/.Xauthority"
export DISPLAY=$(cat "/tmp/display.$user")

user=$1
su $user -c 'notify-send "Pendrive Reminder" "Shutdown lock enabled. Disconnect pendrive to enable shutdown" -u critical'
linux shutdown
  • 3 3 respostas
  • 538 Views

3 respostas

  • Voted
  1. mviereck
    2018-02-20T10:11:20+08:002018-02-20T10:11:20+08:00

    polkit (e pkexec) excluem variáveis ​​de ambiente DISPLAYe XAUTHORITYque são necessárias para acesso X. notify-sendfalha porque não pode acessar o monitor.

    Na página de manual do pkexec :

    Como resultado, o pkexec não permitirá que você execute aplicativos X11 como outro usuário, pois as variáveis ​​de ambiente $DISPLAY e $XAUTHORITY não estão definidas. Essas duas variáveis ​​serão retidas se a anotação org.freedesktop.policykit.exec.allow_gui em uma ação for definida como um valor não vazio

    Não estou familiarizado com polkit; talvez você possa definir org.freedesktop.policykit.exec.allow_guiapenas para esta regra, ou existem outras possibilidades. Desculpe não poder fornecer uma solução pronta.

    No entanto, o ponto principal é fornecer DISPLAYe XAUTHORITYpara notify-send.

    (Não me bata: uma solução suja seria hardcoding DISPLAY=:0e XAUTHORITY=...em seu script de notificação. Esteja ciente de que isso pode falhar se algo mudar).


    Editar: com base na discussão acima, uma solução alternativa que deve funcionar com vários usuários e sem XAUTHORITY:

    No login do X, um script deve ser executado automaticamente (talvez alguma .desktopconfiguração em ~/.config/autostart):

    #! /bin/bash
    # allow polkitd access to X. 
    # xhost is an alternative to XAUTHORITY authentication
    xhost +SI:localuser:polkitd
    # store DISPLAY for each user
    echo $DISPLAY > /tmp/display.$USER
    

    No seu script polkit inclua

    export DISPLAY=$(cat /tmp/display.$user)
    
    • 0
  2. AlmuHS
    2018-02-26T11:20:28+08:002018-02-26T11:20:28+08:00

    @mviereck

    Tentei criar um arquivo de política polkit para notificar-enviar, com este conteúdo

    <policyconfig>
    <action id="org.freedesktop.notify-send">
    <description>Launch notify-send command</description>
    <message>Authentication is required to run the gedit</message>
    <icon_name>accessories-text-editor</icon_name>
    <defaults>
        <allow_any>yes</allow_any>
        <allow_inactive>yes</allow_inactive>
        <allow_active>yes</allow_active>
    </defaults>
    <annotate key="org.freedesktop.policykit.exec.path">/usr/bin/notify-send</annotate>
    <annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
    </action>
    

    coloquei esse arquivo/usr/share/polkit-1/actions/org.freedesktop.policykit.notify-send.policy

    Mas, depois de pressionar o botão desligar, o menu de desligamento demorou muito para ser exibido e a notificação não apareceu

    • 0
  3. Best Answer
    AlmuHS
    2018-03-24T15:48:00+08:002018-03-24T15:48:00+08:00

    Por fim, criei um cliente dbus, iniciado como usuário, que recebe sinal do systembus e mostra notificação ao usuário.

    O código do cliente dbus está em https://github.com/AlmuHS/Pendrive_Reminder/blob/work-in-progress/dbus-client/client.py

    No send-notify.shscript, eu apenas adicionei

     dbus-send --system /org/preminder/mensaje org.preminder.App
    

    Executando o cliente dbus como usuário, a notificação é mostrada corretamente

    Agora estou tentando que o cliente possa ser iniciado automaticamente quando o usuário conectar o pendrive

    Continue em Como iniciar um cliente dbus a partir de um script?

    • 0

relate perguntas

  • Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

  • Necessidade de algumas chamadas de sistema

  • astyle não altera a formatação do arquivo de origem

  • Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve