18

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!

Josh
  • 183

3 Answers3

35

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

Arch linux docs :getty

rexypoo
  • 180
GAD3R
  • 66,769
  • 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
  • 1
    Definitely worked for me, after checking for typos... Thanks – clearlight Jul 29 '19 at 09:03
  • 2
    This seems to work on Debian Buster as well – Jonathan Holvey Nov 23 '19 at 03:20
  • 2
    Adding 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
10

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
drummerboy
  • 201
  • 2
  • 3
8

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.

Rui F Ribeiro
  • 56,709
  • 26
  • 150
  • 232
Fmstrat
  • 348