如何將自動登入從 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保存並退出(此鍵用於 vim,您可以在編輯時在其他終端選項卡中運行以了解其命令是,其中是我係統中的符號鏈接,您的系統可能會有所不同)。zzps aeditor /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,則需要為此建立一個單元檔案。網路上有很多這方面的資源。

我在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/usr/bin/startx,那「應該」有效。

答案3

首先刪除startxfrom /etc/rc.local,然後找出您擁有的顯示管理器(最有可能是 lightdm,因為您使用的是 Ubuntu)。

然後閱讀 systemd 服務和顯示管理器配置,在顯示管理器上配置自動登入並啟用其服務。

相關內容