AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 423632
Accepted
Jon Skarpeteig
Jon Skarpeteig
Asked: 2018-02-13 08:05:27 +0800 CST2018-02-13 08:05:27 +0800 CST 2018-02-13 08:05:27 +0800 CST

systemctl --user 不适用于 www-data 用户

  • 772

systemctl --user对于桌面用户来说似乎工作正常:

dev@dev-VirtualBox:~$ systemctl --user > /dev/null
dev@dev-VirtualBox:~$ echo $?
0

但是在 www-data 用户下运行相同的命令时,我得到了意外的响应

dev@dev-VirtualBox:~$ sudo su www-data -s /bin/bash
www-data@dev-VirtualBox:~$ systemctl --user > /dev/null 
Failed to connect to bus: No such file or directory 
www-data@dev-VirtualBox:~$ echo $? 
1

如何在systemctl --user这里启用?

运行 Ubuntu 16.04

systemd not-root-user
  • 4 4 个回答
  • 7772 Views

4 个回答

  • Voted
  1. JdeBP
    2018-02-13T09:08:25+08:002018-02-13T09:08:25+08:00

    systemd的每用户实例由登录进程(pam_systemdPAM)的钩子启动,用于普通的虚拟/真实终端登录和通过 SSH 或其他方式进行的远程登录。

    您没有登录。 您正在使用 增加现有登录会话的权限sudo su www-data。(顺便说一句,这是多余的。 无需您以超级用户身份运行命令sudo -u www-data即可直接进入www-data。)您还没有调用钩子。

    因此www-data, systemd 的每用户实例尚未启动,并且systemctl --user找不到可与之交谈的内容。

    您可以手动启动它:

    % sudo install -d -o www-data /run/user/`id -u www-data`
    % sudo systemctl start user@`id -u www-data`

    (如果您以错误的顺序执行这些操作,则停止服务并以正确的顺序执行它们。以错误的顺序执行它们最终会导致运行时目录为空且缺少 D-Bus 和其他套接字文件的状态,但服务正在运行,永远不会与客户端通信。)

    一个小问题是您的DBUS_SESSION_BUS_ADDRESS变量需要更改,以便桌面总线客户端程序systemctl在您以其他帐户的权限运行它们时与其他帐户的桌面总线代理进行对话:

    % sudo -u www-data DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/`id -u www-data`/bus systemctl --user

    这是简单的方法。更复杂的方法是调整 PAM 配置以便sudo调用pam_systemd钩子。但是,这会产生副作用,尤其是在XDG_RUNTIME_DIR环境变量方面,这是您可能不希望的。仅当您确信自己对pam_systemd引入sudo.

    进一步阅读

    • 乔纳森·德博因·波拉德 (2014)。不要滥用 su 删除用户权限。经常给出答案。
    • Lennart Poettering 等人。(2017)。pam_systemd. systemd 手册页。自由桌面.org。
    • 14
  2. Best Answer
    Jon Skarpeteig
    2018-02-16T00:04:10+08:002018-02-16T00:04:10+08:00

    所以我终于能够找出拼图中缺失的部分。感谢@JdeBP 的一些出色提示,我能够确定:

    • systemd --user 正在为 www-data 运行
    • DBUS_SESSION_BUS_ADRESS 在 Ubuntu 下似乎被忽略了
    • XDG_RUNTIME_DIR 未设置

    将 XDG_RUNTIME_DIR 设置为导出“/run/user/$UID”解决了我的问题

    我遵循的步骤来获得预期的行为:

    % sudo loginctl enable-linger www-data # Enable systemd --user service to start at boot
    % XDG_RUNTIME_DIR="/run/user/$UID" systemctl --user # Access services as www-data without actually logging in
    
    • 6
  3. rugk
    2021-05-31T13:09:54+08:002021-05-31T13:09:54+08:00

    这些都是非常丑陋的解决方法。

    如前所述,问题是:

    您没有登录。您正在增加现有登录会话的权限 [...]

    因此,“只是”登录......

    如果您在服务器上,则需要使用终端。 我不得不问同样的问题,但终于可以找到它。该解决方案就像运行此命令以切换到您的用户一样简单(分别与该用户运行适当的 shell):

    $ sudo machinectl shell --uid www-data
    

    请注意,sudo loginctl enable-linger www-data如果您打算在那里启动服务,那么它仍然很有用,以便让它们在启动时运行。否则,它们只会在该用户的“登录”时运行。

    • 1
  4. tanius
    2020-06-19T18:19:49+08:002020-06-19T18:19:49+08:00

    正如此处的评论中所述,您可能只是缺少允许systemctl以用户身份运行的相关 Ubuntu 软件包。刚刚发生在我身上。修理:

    1. apt install libpam-systemd

    2. 以应该能够执行的用户身份通过​​ SSH 重新登录systemctl --user。所以,不是作为根。

    现在,echo $XDG_RUNTIME_DIR应该无需进一步步骤即可工作,显示如下:

    $ echo $XDG_RUNTIME_DIR
    /run/user/1012
    

    Ubuntu 18.04 LTS 在这里。

    • 0

相关问题

  • journalctl 中的区分级别

  • 将默认编辑器更改为 vim for _ sudo systemctl edit [unit-file] _

  • systemd:如何在服务启动时运行脚本,而不编辑服务定义

  • 使用 systemd 看门狗支持重新启动应用程序

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

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

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve