Skip to main content

Raymii.org Raymii.org Logo

Quis custodiet ipsos custodes?
Home | About | All pages | Cluster Status | RSS Feed

Send commands or input to a detached screen session

Published: 02-10-2019 | Author: Remy van Elst | Text only version of this article


❗ This post is over four years old. It may no longer be up to date. Opinions may have changed.


This snippet will show you how to send commands to a running screen session. This includes actual shell commands or keyboard input, as well as screen commands, for example to set a logfile.

As I'm writing this article, I notice that today screen 4.7.0 is released.

Recently I removed all Google Ads from this site due to their invasive tracking, as well as Google Analytics. Please, if you found this content useful, consider a small donation using any of the options below:

I'm developing an open source monitoring app called Leaf Node Monitoring, for windows, linux & android. Go check it out!

Consider sponsoring me on Github. It means the world to me if you show your appreciation and you'll help pay the server costs.

You can also sponsor me by getting a Digital Ocean VPS. With this referral link you'll get $100 credit for 60 days.

screen commands vs shell commands (input)

For my recent article on serial port data I figured out how to send a command to a running but detached screen session. This was a screen command, not a shell command.

screen commands are the same things as what you would put in a .screenrc file or inside a screen session via CTRL+A :. For example, the command

logfile filename.txt

tells screen to log the output to a text file named filename.txt.

Shell commands are things you type in your terminal. Both commands like ls or keyboard shortcuts like CTRL+C.

You can start a detached screen session with the following command:

screen -dmS sessionName [command-to-run]

With the command

screen -ls

you can view all screen sessions and with either screen -r or screen -x you can reattach to a session.

Sending commands to screen

As explained above, there is a difference between shell commands and screen commands. screen has the -X flag which allows you to send a (screen) command to a session.

To send a screen command to a session:

screen -S sessionName -p 0 -X screen command

The -p 0 flag is for the window inside screen. If you have created multiple windows (CTRL+A c) you can specify the number. With CTRL+A [0-9] you can directly go to that window inside screen.

For screen commands, after the -X flag you don't need quotes. So for the logfile command:

screen -S sessionName -p 0 -X logfile filename.txt

For shell commands or keyboard input, we need to use the screen command stuff.

If you have a running screen session and you want to send the ls command:

screen -S sessionName -p 0 -X stuff "ls^M"

After the stuff you do need quotes. The ^M is the keycode the ENTER key sends to the terminal. If you omit it, screen will just type ls onto your terminal but not send the ENTER key afterwards.

To send a CTRL+C to a session (e.g. to stop a running interactive process):

screen -S sessionName -p 0 -X stuff "^C"

If you need to find out what keycode a specific key sends, in bash you can press CTRL+V and then the special key. The PGDOWN key for example:

^[[6~

More documentation on the stuff command can be found here.

Tags: bash , screen , shell , snippets , stuff