![如何将自动登录从 root 用户更改为非 root 用户?](https://linux22.com/image/122077/%E5%A6%82%E4%BD%95%E5%B0%86%E8%87%AA%E5%8A%A8%E7%99%BB%E5%BD%95%E4%BB%8E%20root%20%E7%94%A8%E6%88%B7%E6%9B%B4%E6%94%B9%E4%B8%BA%E9%9D%9E%20root%20%E7%94%A8%E6%88%B7%EF%BC%9F.png)
我已经用Openbox安装了Ubuntu服务器16.04(实际上是3.4.113-sun8i
)。并将此命令放入startx
其中/etc/rc.local
以在启动后显示图形。但问题是它会自动以 root 用户身份登录,因此,我的 C++ 程序无法正常工作(正如我之前所问的,他们说这是因为 root 用户无法自动启动某些库,如pulseaudio 或 gtk) 。我认为这是正确的,因为我应该手动启动它们。
顺便说一句,我正在寻找一种将自动登录从 root 用户更改为非 root 用户的方法。我该怎么做?
编辑:我的目标是构建一个小工具,用户只能通过物理按钮打开/关闭它(我的意思是没有菜单、选项等)。小工具必须在启动后执行我的C++代码,并且代码使用gtk和pulseaudio库。
答案1
你告诉我在其他评论您的系统显示:
$ systemctl get-default
graphical.target
因此,将其更改为multi-user.target
:
$ sudo systemctl set-default multi-user.target
multi-user.target 将从 tty1 开始(Ctrl+Alt+F1):
$ systemctl list-dependencies multi-user.target | grep getty
● ├─getty.target
● │ ├─getty-static.service
● │ └─[email protected]
因此,我们覆盖 tty1 文件:
$ sudo systemctl edit getty@tty1
包含以下内容(这m
是您的用户名):
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin m %I $TERM
/sbin/agetty
上述内容在您的系统中可能有所不同,请确保您检查正确的路径:
$ type -a agetty
agetty is /sbin/agetty
agetty is /sbin/agetty
按Esc,然后按shift+ z+z保存并退出(此键用于 vim,您可以ps a
在编辑时在其他终端选项卡中运行以了解其命令是,其中是我系统中的符号链接,您的系统可能会有所不同)。editor /etc/systemd/system/[email protected]/.#override.blahblah
editor
vim.gtk3
$ type -a editor
editor is /usr/bin/editor
editor is /usr/bin/editor
$ realpath /usr/bin/editor
/usr/bin/vim.gtk3
然后 catgetty@tty1
并导航到底部,您会知道它只需附加此行即可实现覆盖效果:
$ sudo systemctl cat getty@tty1
...
# /etc/systemd/system/[email protected]/override.conf
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin xiaobai %I $TERM
自动登录通过--autologin
上面完成,否则您需要在开机后手动输入用户名和密码登录tty1。
使用 username 登录到 tty1 后m
,它将执行 /home/m/.profile,因此请在您的末尾添加此行/home/m/.profile
:
echo "$DISPLAY" > /tmp/hole1
echo "$XDG_VTNR" > /tmp/hole2
if [ -z "$DISPLAY" ] && [ -n "$XDG_VTNR" ] && [ "$XDG_VTNR" -eq 1 ]; then
echo lolo > /tmp/hole3
exec startx -- -nocursor
fi
echo lili > /tmp/hole4
/tmp/holeN
以上仅用于调试目的,以便了解它是否按需要运行。例如,如果/tmp/hole3
未创建但/tmp/hole2
已创建,则意味着您需要cat /tmp/hole2
检查 "$XDG_VTNR" 的值。
startx
然后将执行/home/m/.xinitrc
,编辑它:
$ cat /home/m/.xinitrc
#!/usr/bin/env bash
echo 55 > /tmp/test1
exec openbox-session
echo 55 > /tmp/test2
openbox-session
然后将执行/home/m/.config/openbox/autostart
,像往常一样编辑它:
$ cat /home/m/.config/openbox/autostart
echo 7 > /tmp/yy
/home/m/img &
echo 8 > /tmp/yy2
完成后,重新启动,将带您直接显示您的图像,上面的说明可以概括为:
多用户.target -> tty1 -> 运行[电子邮件受保护]-> ExecStart 使用所需的用户名自动登录 -> 登录后将执行 ~/.profile ->
exec startx
-> startx 将执行~/.xinitrc
-> exec openbox-session -> openbox 将执行~/.config/openbox/autostart
->/home/m/img &
将弹出。
[更新]
rc.local 能够启动 x,因为 rc.local 以 root 身份运行 startx,但 ~/.profile 不以 root 身份运行 startx。我们startx > /tmp/my.log 2>&1
确保 startx 正确运行,然后 /tmp/my.log 将显示我们需要检查/home/m/.local/share/xorg/Xorg.0.log
,最终我注意到第一个(EE)
是(EE) open /dev/fb8: Permission denied
.
OP需要将用户添加m
到视频组以获得启动x时访问所需FRAMEBUFFER /dev/fb8的权限。
sudo usermod -a -G audio m
sudo usermod -a -G video m
p/s:我想知道添加到上面的音频组是必要的。参考
答案2
/etc/rc.local
以用户身份执行root
。因此,您应该使用su -l jdoe -c startx
in rc.local
,假设jdoe
您是要启动 Xorg 的用户。
我怀疑你有 systemd,因为默认情况下,systemd 会忽略,rc.local
除非你从没有 systemd 的先前版本升级,即使这样,也不确定......我不运行 systemd。
如果您有 systemd,则需要为此创建一个单元文件。网上有很多这方面的资源。
我在谷歌上搜索“systemd 单元文件”并找到以下内容:将以下内容放入文件中:(/etc/systemd/system/autologin.service
假设这是 systemd 在您系统上的位置)
[Unit]
Description=Autologin service
[Service]
Type=fork
user=jdoe
group=users
ExecStart=/path/to/your/startx
TimeoutSec=0
[Install]
WantedBy=multi-user.target
您将不得不在某种程度上调整该单元......您可能不想以jdoe
另一个用户的身份启动X。另外,users
可能不是用户所属的组,最后但并非最不重要的一点是,/path/to/your/startx
不是您的startx
...运行which startx
以找出路径的路径。
接下来,您运行sudo systemctl daemon-reload
以重新加载配置并重新启动。
编辑(以下来自OP的评论):
你要这个:
[Unit]
Description=Autologin service
[Service]
Type=fork
user=m
group=m
ExecStart=/usr/bin/startx
TimeoutSec=0
[Install]
WantedBy=multi-user.target
假设你startx
在/usr/bin/startx
,那“应该”有效。
答案3
首先删除startx
from /etc/rc.local
,然后找出您拥有的显示管理器(最有可能是 lightdm,因为您使用的是 Ubuntu)。
然后阅读 systemd 服务和显示管理器配置,在显示管理器上配置自动登录并启用其服务。