Ubuntu

如何將自動登錄從 root 更改為非 root 使用者?

  • November 23, 2017

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

然後 catgetty@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 $$

我在聊天室文字記錄)與 OP聊天並解決了他的問題。

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

參考 1 ,參考 2

p/s:我想知道添加到上面的音頻組是必要的。參考

/etc/rc.local以使用者身份執行root。因此,您應該使用su -l jdoe -c startxin rc.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,那“應該”工作。

引用自:https://unix.stackexchange.com/questions/405618