Como posso executar um programa como outro usuário em todos os sentidos?

4

Antecedentes

Estou tentando reiniciar alguns programas ( mail-notification e stalonetray ) regularmente, pois eles parecem morrer com frequência. Desejo defini-las novamente sempre que o NetworkManager se reconectar. Por isso, eu os tenho acionados por um script em /etc/NetworkManager/dispatcher.d/ .

Script

Eu posso criar um script da seguinte forma.

#!/bin/bash
sudo -u foo_user pkill mail-notificati -x
sudo -u foo_user DISPLAY=:0 mail-notification &

Isso funciona bem se eu o executar diretamente como usuário. No entanto, se eu chamá-lo do script da raiz, ele falhará. Eu sou solicitado a inserir as senhas para mail-notification ; não é possível ler o Chaveiro do Gnome.

Como posso executar este programa como foo_user em todos os aspectos?

    
por Sparhawk 29.09.2015 / 06:42

2 respostas

1

Se você deseja interagir com uma GUI a partir de um processo que não é iniciado a partir dessa GUI, é necessário definir algumas variáveis de ambiente: pelo menos DISPLAY , possivelmente also XAUTHORITY se não for no local padrão, e para muitos programas modernos você precisa defina DBUS_SESSION_BUS_ADDRESS .

Mas uma abordagem mais confiável para o seu problema seria não reiniciar esses programas do NetworkManager. Além da dificuldade de lançá-los com êxito, você também precisa se preocupar se está conectado ou não, e se pode haver outros usuários e outros monitores a serem considerados, e assim por diante. Em vez disso, mate esses programas, mas não os reinicie. Em sua sessão normal, em vez de iniciá-los diretamente, inicie-os de um supervisor que os reinicia, se eles morrerem. Eu acho que o systemd inclui essa funcionalidade (mas eu não sei como usá-lo); ou você pode usar programas de supervisor dedicados como monit , supervisionar ,…

    
por 30.09.2015 / 03:23
1

Você sempre pode usar o bom e velho su :

man 1 su

Este comando abre um sub-shell como o usuário que você deseja representar. Como root, você pode usá-lo sem ser solicitado por uma senha.

su foo_user -c whatevercommandyouwant

Funciona a partir de scripts também.

    
por 01.10.2015 / 11:25