So I logged into one user account
su username
Não, você não fez.
Você não está efetuando login. Você está aumentando os privilégios de sua sessão de login existente com su username .
systemctl com a opção --user localiza seu Desktop Bus por usuário, gerenciado pelo usuário do Desktop Bus por usuário, e através desse barramento se comunica com sua instância por usuário de systemd que gerencia sua conta user servics.
su não é um mecanismo de login . Ele funciona dentro de uma sessão de login interativa existente. Nessa sessão, seus processos possuem variáveis de ambiente que informam onde seu diretório de tempo de execução por usuário é ( XDG_RUNTIME_DIR ), onde o Desktop Bus por usuário é ( DBUS_SESSION_BUS_ADDRESS ) e outras coisas como onde seu servidor X está ( DISPLAY ).
Em particular, DBUS_SESSION_BUS_ADDRESS pode implicitamente referenciar XDG_RUNTIME_DIR ou pode nomear explicitamente o mesmo caminho. Esse caminho geralmente será algo como /run/user/1001/bus para o soquete de acesso do agente do Desktop Bus (presumindo que seu ID do usuário seja 1001, por exemplo).
Essas variáveis não são alteradas por su . Tem havido um longo caminho de ida e volta por muitos anos, incluindo os comportamentos de outros comandos similares, como pkexec .
A conseqüência disso é que se você su para um segundo usuário em sua sessão de login, executando systemctl como segundo usuário tenta se conectar a um soquete de acesso ao agente Desktop Bus localizado em um diretório privado para o primeiro usuário . O usuário 1002 (para escolher um ID de usuário para seu segundo usuário por exemplo) não pode acessar /run/user/1001 nem nada dentro dele, e mesmo se xe tivesse lido + executar acesso a esse diretório xe não pode acessar /run/user/1001/bus porque isso apenas concede acesso ao usuário 1001 também.
Naturalmente, isso não é o corretor direito do Desktop Bus para falar em primeiro lugar. Você deseja conversar com o corretor do Desktop Bus do usuário do segundo e por meio da instância por usuário do segundo usuário de systemd .
A solução simples é como parte do su para definir essas variáveis de ambiente para as apropriadas para a segunda conta de usuário, apontando para o Desktop Bus do segundo usuário:
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1002/bus su username -c 'systemctl --user'
Claro que, em tais circunstâncias, uso uma ferramenta útil para definir isso, userenv , o que me permite não ter que digitar longhand esse endereço de barramento:
su username -c 'userenv --set-dbus systemctl --user'
Leitura adicional
- link
- link
- Jonathan de Boyne Pollard (2014). Não abuse do su para eliminar privilégios de usuário . Respostas frequentemente dadas.
- Jonathan de Boyne Pollard.
userenv. páginas de manual do conjunto de ferramentas. Softwares. - link