如何将自动登录从 root 用户更改为非 root 用户?

如何将自动登录从 root 用户更改为非 root 用户?

我已经用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.blahblaheditorvim.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 &将弹出。

[更新]

我与 OP 聊天聊天室(成绩单)并解决了他的问题。

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

参考1,参考2

p/s:我想知道添加到上面的音频组是必要的。参考

答案2

/etc/rc.local以用户身份执行root。因此,您应该使用su -l jdoe -c startxin 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

首先删除startxfrom /etc/rc.local,然后找出您拥有的显示管理器(最有可能是 lightdm,因为您使用的是 Ubuntu)。

然后阅读 systemd 服务和显示管理器配置,在显示管理器上配置自动登录并启用其服务。

相关内容