How to Take a Remote Screenshot in Raspberry Pi over SSH

I recently reviewed a Raspberry Pi 4 laptop with a custom interface that made it impractical to take screenshots directly on the device. So instead I had to take screenshots remotely over SSH. It’s quite easy to do. Most of the steps can be reproduced in other Linux systems, and are not specific to Raspberry Pi.

Enable SSH in Raspberry Pi

First, enable SSH either with sudo raspi-config in a terminal window and selecting 5. Interface Options, then P2 SSH

Raspberry Pi Enable SSHIf for some reason, you don’t have access to the terminal, take out the MicroSD card from the Raspberry Pi board, and from a computer create a new empty file named “ssh” in the boot partition.

Now provided you have the username and password for your board, you can connect to SSH with the IP address from a terminal:


or a program like Putty.

Taking a screenshot remotely

You’re now ready to take a screenshot as follows:


scrot is the program taking the screenshot, DISPLAY defines the display to capture, and the third argument is the filename that can be with png, jpg, or gif extension.

You can take as many screenshots as you’d like with different filenames, then transfer them back to your computer over SSH either from the command line inside Raspberry Pi:


or from your computer using Filezilla or other programs supporting SFTP (SSH File Transfer Protocol).

Save a Raspberry Pi Screenshot directly on Your Computer

If you’d like to be able to directly take a screenshot on Raspberry Pi with the image saved directly on your computer you can do by first setting up no password ssh using public/private keys in order to avoid having to input the password each time.

Once you’re done you should not be asked the password anymore when logging over SSH to your Raspberry Pi:


Then there are two ways to proceed from here either initiate the command from a Linux computer or from the Raspberry Pi board.

Initiate Command from a Linux Computer

Get back to the terminal window in your computer, and run the following command to take a screenshot remotely and save the file in your computer:


For each new screenshot simply change the value of FILE variable. The command line connects to Raspberry Pi over SSH, takes a screenshot, transfers it to your computer, and deletes it from the Raspberry Pi board.

Alternative methods

Screenshotting with maim

As pointed out in the comments, using maim is a more elegant method as it outputs the screenshot to stdout allowing us to save the image to the local computer with a simple redirect.

First, install maim on Raspberry Pi:


Now we can capture a Raspberry Pi screenshot from our computer with a much simpler command:


However, note that it leads to corrupted PNG files in my case, possibly because of different environment settings between the computer and the Raspberry Pi board. meaning YMMV.

Initiate Screenshoting from Raspberry Pi

If you don’t have a Linux computer, the method above will not work unless you use the Windows subsystem for Linux. Another way is to install an SSH server in Windows, and then run the following command inside Raspberry Pi:

Upscrot

That’s it. In case you’d like a method that automatically uploads a screenshot after you select an area with your mouse, have a look at upscrot Python script.

Share this:

Support CNX Software! Donate via cryptocurrencies, become a Patron on Patreon, or purchase goods on Amazon or Aliexpress

ROCK Pi 4C Plus
Subscribe
Notify of
guest
The comment form collects your name, email and content to allow us keep track of the comments placed on the website. Please read and accept our website Terms and Privacy Policy to post a comment.
9 Comments
oldest
newest
Antonin
3 years ago

You can redirect your stdout from ssh, so no need for scp. Simple

will do the trick.

Jean-Luc Aufranc (CNXSoft)

If I take the capture with maim on Pi directly, it works fine: hexdump  pishot.png -n 64 0000000 5089 474e 0a0d 0a1a 0000 0d00 4849 5244 0000010 0000 8007 0000 3804 0608 0000 e800 c1d3 0000020 0043 2000 4900 4144 7854 ec9c ebbd 6fcf 0000030 7259 57d7 fa75 4f74 cdcf 3197 8818 c403 0000040 123456 hexdump  pishot.png -n 640000000 5089 474e 0a0d 0a1a 0000 0d00 4849 52440000010 0000 8007 0000 3804 0608 0000 e800 c1d30000020 0043 2000 4900 4144 7854 ec9c ebbd 6fcf0000030 7259 57d7 fa75 4f74 cdcf 3197 8818 c4030000040 Through SSH there seems to be some bits shifted… Read more »

tkaiser
tkaiser
3 years ago

Have you already compared the output from env when logged in locally and via SSH?

tkaiser
tkaiser
3 years ago

Is it really possible to SSH into a Raspbian machine as unprivileged user ‘pi’ and do a screencapture?

David Willmore
David Willmore
3 years ago

If the screen is currently owned by user ‘pi’, then it should be. X11 apps will automatically use the .Xauthority cookie to authenticate with the disaplay server. I am not sure if you can do it with a display using fbdev. But I suppose permissions would be simply filesystem based like the rest of unix.

tkaiser
tkaiser
3 years ago

Well, I was thinking about something like this (quoting the screencapture manual page from macOS):

SECURITY CONSIDERATIONS
   To capture screen content while logged in via ssh, you must launch
screencapture in the same mach bootstrap hierarchy as loginwindow:

   PID=pid of loginwindow
   sudo launchctl bsexec $PID screencapture [options]

David Willmore
David Willmore
3 years ago

I don’t do MacOS, sorry. I prefer to stick to unix and unix like operating systems.

Khadas VIM4 SBC