Wie ändere ich die automatische Anmeldung von einem Root- zu einem Nicht-Root-Benutzer?

Wie ändere ich die automatische Anmeldung von einem Root- zu einem Nicht-Root-Benutzer?

Ich habe Ubuntu Server 16.04 (eigentlich ist es 3.4.113-sun8i ) mit Openbox installiert und diesen Befehl eingegeben, startxum /etc/rc.localnach dem Booten Grafiken zu erhalten. Das Problem ist jedoch, dass ich mich automatisch als Root-Benutzer anmelde und deshalb mein C++-Programm nicht richtig funktioniert (wie ich bereits gefragt habe, heißt es, es liege daran, dass der Root-Benutzer einige Bibliotheken wie Pulseaudio oder GTK nicht automatisch starten kann). Und ich denke, das ist richtig, weil ich sie manuell starten sollte.

Übrigens suche ich nach einer Möglichkeit, die automatische Anmeldung vom Root- zum Nicht-Root-Benutzer zu ändern. Wie kann ich das machen?

BEARBEITEN: Mein Ziel ist es, ein Gadget zu bauen, das Benutzer nur mit einem physischen Knopf ein- und ausschalten können (also ohne Menü, Optionen usw.). Das Gadget muss nach dem Booten meinen C++-Code ausführen, und der Code verwendet die GTK- und Pulseaudio-Bibliotheken.

Antwort1

Du hast mir gesagt inanderer Kommentardass Ihr System Folgendes anzeigt:

$ systemctl get-default
graphical.target

Ändern Sie es also in multi-user.target:

$ sudo systemctl set-default multi-user.target

Und multi-user.target wird bei tty1 gestartet (Strg+Alt+F1):

$ systemctl list-dependencies multi-user.target | grep getty
● ├─getty.target
● │ ├─getty-static.service
● │ └─[email protected]

Also überschreiben wir die tty1-Datei:

$ sudo systemctl edit getty@tty1

Mit diesem Inhalt (das mist Ihr Benutzername):

[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin m %I $TERM

/sbin/agettyDie oben genannten Pfade können in Ihrem System abweichen. Stellen Sie sicher, dass Sie den korrekten Pfad mit folgendem überprüfen:

$ type -a agetty
agetty is /sbin/agetty
agetty is /sbin/agetty

Drücken Sie Escund dann shift+ z+ zzum Speichern und Beenden (diese Tasten sind für vim, Sie können sie ps awährend der Bearbeitung in einer anderen Terminalregisterkarte ausführen, um zu erfahren , dass der Befehl lautet. In meinem System handelt es sich dabei um einen symbolischen Link zu , Ihr System kann anders sein).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

Navigieren Sie dann getty@tty1nach unten und fügen Sie einfach diese Zeilen an, um den Override-Effekt zu erzielen:

$ sudo systemctl cat getty@tty1 
 ...
# /etc/systemd/system/[email protected]/override.conf
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin xiaobai %I $TERM

Die automatische Anmeldung erfolgt wie --autologinoben beschrieben, andernfalls müssen Sie nach dem Booten Benutzernamen und Kennwort manuell eingeben, um sich bei tty1 anzumelden.

Nachdem Sie sich mit dem Benutzernamen bei tty1 angemeldet haben m, wird /home/m/.profile ausgeführt. Fügen Sie daher am Ende dieser Zeile hinzu /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/holeNDas Obige dient nur zu Debugzwecken, um sicherzustellen, dass es wie gewünscht ausgeführt wird. Wenn es beispielsweise /tmp/hole3nicht erstellt, aber /tmp/hole2erstellt wurde, bedeutet dies, dass Sie cat /tmp/hole2den Wert von „$XDG_VTNR“ überprüfen müssen.

startxwird dann ausgeführt /home/m/.xinitrc, bearbeiten Sie es:

$ cat /home/m/.xinitrc                                                                                                                             
#!/usr/bin/env bash                                                                                                                                   
echo 55 > /tmp/test1
exec openbox-session
echo 55 > /tmp/test2

openbox-sessionwird dann ausgeführt /home/m/.config/openbox/autostart, bearbeiten Sie es wie gewohnt:

$ cat /home/m/.config/openbox/autostart 
echo 7 > /tmp/yy
/home/m/img &
echo 8 > /tmp/yy2

Schließlich wird durch den Neustart Ihr Bild direkt angezeigt. Die obige Anweisung kann wie folgt zusammengefasst werden:

multi-user.target -> tty1 -> ausführen[email geschützt]-> ExecStart-Automatikanmeldung mit gewünschtem Benutzernamen -> angemeldet wird ~/.profile ausgeführt -> exec startx-> startx wird ausgeführt ~/.xinitrc-> exec openbox-session -> openbox wird ausgeführt ~/.config/openbox/autostart-> /home/m/img &wird angezeigt.

[AKTUALISIEREN]

Ich chatte mit OP inChatraum(Transkript) und löste sein Problem.

rc.local kann startx ausführen, weil rc.local startx als Root ausführt, aber ~/.profile führt startx nicht als Root aus. Wir stellen startx > /tmp/my.log 2>&1sicher, dass startx korrekt ausgeführt wird, dann zeigt /tmp/my.log an, dass wir prüfen müssen /home/m/.local/share/xorg/Xorg.0.log, und schließlich ist mir aufgefallen, dass das erste (EE)ist (EE) open /dev/fb8: Permission denied.

OP muss einen Benutzer mzur Videogruppe hinzufügen, um beim Start von x die Berechtigung für den Zugriff auf den gewünschten FRAMEBUFFER /dev/fb8 zu erhalten.

sudo usermod -a -G audio m
sudo usermod -a -G video m

Referenz 1,Referenz 2

P.S.: Ich frage mich, ob es notwendig ist, der Audiogruppe oben etwas hinzuzufügen.Referenz

Antwort2

/etc/rc.localwird als Benutzer ausgeführt root. Sie sollten daher su -l jdoe -c startxin verwenden rc.local, vorausgesetzt, jdoedass dies der Benutzer ist, mit dem Sie Xorg starten möchten.

Ich bezweifle, dass Sie systemd haben, da systemd es standardmäßig ignoriert, rc.locales sei denn, Sie haben ein Upgrade von einer früheren Version durchgeführt, die systemd nicht hatte, und selbst dann bin ich mir nicht sicher ... Ich verwende systemd nicht.

Wenn Sie systemd haben, müssen Sie hierfür eine Unit-Datei erstellen. Hierzu gibt es online zahlreiche Ressourcen.

Ich habe bei Google nach „systemd-Unit-Datei“ gesucht und Folgendes gefunden: Fügen Sie Folgendes in die Datei ein: /etc/systemd/system/autologin.service(vorausgesetzt, systemd befindet sich dort auf Ihrem System)

[Unit]
Description=Autologin service

[Service]
Type=fork
user=jdoe
group=users
ExecStart=/path/to/your/startx
TimeoutSec=0

[Install]
WantedBy=multi-user.target

Du wirst die Einheit etwas anpassen müssen .... wahrscheinlich willst du X nicht als, jdoesondern als ein anderer Benutzer starten. Außerdem usersist der Benutzer möglicherweise nicht Mitglied einer Gruppe und nicht zuletzt /path/to/your/startxist es nicht der Pfad zu deinem startx... führe einen Versuch aus which startx, um den Pfad herauszufinden.

Als Nächstes führen Sie aus, sudo systemctl daemon-reloadum die Konfiguration neu zu laden und einen Neustart durchzuführen.

BEARBEITEN (folgen Sie den Kommentaren vom OP):

Du willst das:

[Unit]
Description=Autologin service

[Service]
Type=fork
user=m
group=m
ExecStart=/usr/bin/startx
TimeoutSec=0

[Install]
WantedBy=multi-user.target

Vorausgesetzt, Ihr startxist in /usr/bin/startx, „sollte“ das funktionieren.

Antwort3

Entfernen Sie zunächst startxvon /etc/rc.localund finden Sie dann heraus, welchen Display-Manager Sie haben (höchstwahrscheinlich lightdm, da Sie Ubuntu verwenden).

Informieren Sie sich dann über die Systemd-Dienste und die Konfiguration des Display-Managers, konfigurieren Sie die automatische Anmeldung beim Display-Manager und aktivieren Sie dessen Dienst.

verwandte Informationen