Redirect physical keyboard input to SSH

Posted on

Problem :

I’m having a raspberry pi running debian linux and I have an RFID reader connected to it. The RFID reader behaves like a keyboard. Every time I scan a tag it types then number of the tag and then carriage return.

My problem is that I want to redirect the output of the RFID reader to my SSH session. That means anything that is typed to the physical keyboard of the pi should be displayed in my SSH window.

I have tried with: cat /dev/tty0 but it wont work because the user is not logged in.

Is there a way to disable the login screen after the pi boots and then redirect all input through SSH?

Solution :

One solution is changing the init system, so a getty process gets a tty and invokes your script. Your script might then initialize a named pipe (aka fifo) and redirect stdin to it.

Then you can login via ssh and read from that pipe.

I have this exact use case (raspi with RFID reader that emulates a USB keyboard).

I solved the issue by creating a new systemd unit to start my script in a screen (so I can see what’s going on by mirroring the session via ssh).

1.
Create /etc/systemd/system/my-tty1.service:

[Unit]
Description=my tty1-service
After=getty.target
Conflicts=getty@tty1.service

[Service]
Type=simple
ExecStart=/usr/bin/screen -S myTTY1 /path/to/my/script
StandardInput=tty-force
StandardOutput=inherit
StandardError=inherit

[Install]
WantedBy=multi-user.target

This starts your script (or program) to handle the input in a screen session named myTTY1.

2.
Enable the service so it starts after boot:

systemctl enable my-tty1.service

3.
Stop getty, start your service:

systemctl stop getty@tty1.service
systemctl start my-tty1.service

4.
You can now connect to your screen session with screen -x myTTY1
via ssh. Disconnect by detaching the screen with CTRL+A, followed by D.

Leave a Reply

Your email address will not be published. Required fields are marked *