I just installed Debian 9.2.1 on an old laptop as a cheap server. The computer is not physically accessed by anyone other than myself, so I would like to automatically login upon startup so that if I have to use the laptop itself rather than SSH, I don't have to bother logging in. I have no graphical environments installed, so none of those methods would work, and I've tried multiple solutions such as https://superuser.com/questions/969923/automatic-root-login-in-debian-8-0-console-only However all it did was result in no login prompt being given at all... So I reinstalled Debian. What can I do to automatically log in without a graphical environment? Thanks!
3 Answers
Edit your /etc/systemd/logind.conf
, change #NAutoVTs=6
to NAutoVTs=1
Create a /etc/systemd/system/getty@tty1.service.d/override.conf
through ;
systemctl edit getty@tty1
Paste the following lines
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin root --noclear %I 38400 linux
enable the getty@tty1.service
then reboot
systemctl enable getty@tty1.service
reboot
-
I must have done something wrong, because this broke my system: https://unix.stackexchange.com/q/466088/37050. Worthwhile to check out depending on the answers there. – Aug 31 '18 at 18:00
-
1Definitely worked for me, after checking for typos... Thanks – clearlight Jul 29 '19 at 09:03
-
2This seems to work on Debian Buster as well – Jonathan Holvey Nov 23 '19 at 03:20
-
2Adding to Jonathan Holvey's comment: and in Raspbian (Buster), this comes pretty close to how raspi-config does it when you use it to set auto console login. The main difference is the account name, it uses the current user account (the one running 'sudo raspi-config', so it's not necessarily 'pi') instead of root. Running it from a root shell (sudo -i) does not make it use the root account either. Secondary difference is that it doesn't include a baud rate. – Luc VdV Feb 04 '20 at 08:31
I just want to add to this discussion that the accepted answer pertains to virtual terminals. In my case, I had to edit a separate service file which is used for serial terminals. The file is found at /lib/systemd/system/serial-getty@.service
and the same procedure of adding --autologin <user>
to the appropriate line does the trick.
[Service]
ExecStart=-/sbin/agetty --keep-baud 115200,38400,9600 --autologin root %I $TERM

- 201
- 2
- 3
I'd like to add a slightly more thorough answer, especially given the comment about breaking his system from @Keelan.
First if you wish to only have one TTY that is running the program, and not be able to log in to any other tty, THEN edit your /etc/systemd/logind.conf
, and change #NAutoVTs=6
to NAutoVTs=1
. Doing this will keep you from logging in on the terminal!
Next create a directory and an override.conf
file:
mkdir -p /etc/systemd/system/getty@tty1.service.d
echo "[Service]" > /etc/systemd/system/getty@tty1.service.d/override.conf
echo "ExecStart=" >> /etc/systemd/system/getty@tty1.service.d/override.conf
echo "ExecStart=-/sbin/agetty --autologin root --noclear %I 38400 linux" >> /etc/systemd/system/getty@tty1.service.d/override.conf
Don't reboot. Instead of rebooting, as described in the other answer, log in to another TTY, then run the following commands to test things out:
systemctl daemon-reload
systemctl restart getty@tty1.service
If all goes well, then reboot.
But what if I want to run a program instead of autologin? Then you would use the following:
mkdir -p /etc/systemd/system/getty@tty1.service.d
echo "[Service]" > /etc/systemd/system/getty@tty1.service.d/override.conf
echo "ExecStart=" >> /etc/systemd/system/getty@tty1.service.d/override.conf
echo "ExecStart=-/path/program -arg1 -arg2" >> /etc/systemd/system/getty@tty1.service.d/override.conf
echo "StandardInput=tty" >> /etc/systemd/system/getty@tty1.service.d/override.conf
echo "StandardOutput=tty" >> /etc/systemd/system/getty@tty1.service.d/override.conf
Now keep in mind this will run without a bashrc
. This means if you use something like screen
then you won't get all your usual aliases/etc. To fix that, use the standard auto-login above, but add this to your .bashrc
:
[ `tty` == /dev/tty1 ] && /path/program -arg1 -arg2
This means that the program will only be run on tty1
, but will give you a full shell underneath.

- 56,709
- 26
- 150
- 232

- 348