如何將自動登錄從 root 更改為非 root 使用者?
3.4.113-sun8i
我已經用 Openbox安裝了 Ubuntu 伺服器 16.04(實際上是)。並將此命令startx
放入其中/etc/rc.local
以在啟動後顯示圖形。但問題是它會自動以 root 使用者身份登錄,因此,我的 C++ 程序無法正常工作(正如我之前問過的,他們說這是因為 root 使用者無法自動啟動一些像 pulseaudio 或 gtk 這樣的庫) . 我認為這是正確的,因為我應該手動啟動它們。順便說一句,我正在尋找一種將自動登錄從 root 更改為非 root 使用者的方法。我該怎麼做?
編輯:我的目標是建構一個小工具,使用者只能通過物理按鈕打開/關閉它(我的意思是沒有菜單、選項等)。小工具必須在啟動後執行我的 C++ 程式碼,並且程式碼使用 gtk 和 pulseaudio 庫。
你在其他評論中告訴我你的系統顯示了這個:
$ 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 ● │ └─getty@tty1.service
所以,我們覆蓋 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/getty@tty1.service.d/.#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
然後 cat
getty@tty1
並導航到底部,您將知道它只需附加此行即可實現覆蓋效果:$ sudo systemctl cat getty@tty1 ... # /etc/systemd/system/getty@tty1.service.d/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
畢竟重啟,會直接帶你顯示你的鏡像,上面的指令可以總結為:
multi-user.target -> tty1 -> 執行 getty@tty1.service -> ExecStart 使用所需使用者名自動登錄 -> 登錄後將執行 ~/.profile ->
exec startx
-> startx 將執行~/.xinitrc
-> exec openbox-session -> openbox 將執行~/.config/openbox/autostart
->/home/m/img &
將彈出。$$ UPDATE $$
rc.local 能夠以 root 身份執行 startx,因為 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
到影片組以在 startx 訪問所需的 FRAMEBUFFER /dev/fb8 時獲得權限。sudo usermod -a -G audio m sudo usermod -a -G video m
p/s:我想知道添加到上面的音頻組是必要的。參考
/etc/rc.local
以使用者身份執行root
。因此,您應該使用su -l jdoe -c startx
inrc.local
,假設jdoe
是您要啟動 Xorg 的使用者。我懷疑你有 systemd,因為預設情況下 systemd 會忽略
rc.local
,除非你從沒有 systemd 的先前版本升級,即使那樣,也不確定……我不執行 systemd。如果您確實有 systemd,則需要為此創建一個單元文件。這方面網上有很多資源。
我在Google搜尋“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
是 in/usr/bin/startx
,那“應該”工作。