# Screen

## Introduction

Screen is a terminal multiplexer, i.e., it will let you have multiple virtual terminals in a single window. You will also be able to 1) detach a screen session, and then detach it in a later moment; 2) share screen sessions.

In this tutorial $ indicates a terminal prompt (just for visual convenience).

A Screen command is usually of the form CTRL-a KEY, i.e., you'll have to press the CTRL key along with a, followed by a generic KEY. (Screen's default escape key is CTRL-a.)

You'll need to be a MetaARPA member in order to use Screen on SDF

If you want a screencast tutorial, type:

`$ ttyplay /ftp/pub/users/jecxjo/howto/screen</command>`

on a terminal connected to SDF.

Alternatively, you can watch the screencast online at PlayTerm.

## Starting Screen, detaching and reattaching

You can run screen by typing:

`$ screen`

When you run it, a window with some copyright and some other info will show up, with [Press Space or Return to end.] at the bottom. OK, as it says, you can now press Space or Enter. You will then see your shell prompt and nothing else. That's fine: you can now run your programs as usual, the difference is that they will run under a Screen session. You can detach it by typing CTRL-a d. Screen will keep your session running. Now if you logout, then log back in, and type:

`$ screen -r</command>`

you'll see your terminal as you left it when you detached Screen!

If you lost connection, or simply forgot to detach Screen, and want to resume your session by typing:

`$ screen -d -r</command>`

The -d flag will detach Screen, while -r will reattach. There are various types of detach and </reattach</q> flags. For instance, if you type the previous command and there was no screen session to be resumed, you'll get a There is no screen to be detached. message. In this case you'll probably need:

`$ screen -d -R</command>`

which will first create a new session (or rettach an existing one).

## Multiple windows

You can create various windows under your Screen session, each one running their own program. When you are in a Screen session, typing:

`$ screen</command>`

will create a new window, leaving the previous window untouched, though not visible. Instead of typing screen, you can use the shortcut CTRL-a c.

You can create as many windows as you want. You can swith between windows with CTRL-a n (next window) and CTRL-a p (previous window). It's also possible to select windows by number. Typing CTRL-a 1 will open window number 1, CTRL-a 2, to window 2, and so on.

How do you know what's a window number? Well, you can type CTRL-a " (yeah, that's a double quote). In that case a menu with a windows list will open. You can select a number and press enter to go to that screen. An easier way is to have a hard status line that shows you each window number. For doing this in a permanent manner, you'll have to create a .screenrc (Screen's customization file) in your $HOME directory and write in it the following lines:

    hardstatus alwayslastline
    hardstatus string "%{WK}%-LW %{Y.}%n%f* %t%{-}%+LW"

(We will see what that crazyness means later.)

For your .screenrc file to be read by Screen, you'll have to start a new session. BTW, a Screen session ends when the last window is closed.

## Multiple sessions

It's possible to have various Screen sessions running, each one with their own set of windows open. If you started Screen by just typing screen, a new session is created. If you detach and type screen again, a new session will start. If you now type:

`$ screen -ls</command>`

it will give you a list of Screen sessions like this:

            3340.pts-6.HOST        (Detached)
            4522.pts-8.HOST        (Attached)
    2 Sockets in /tmp/screens/S-YOU

where HOST is the hostname and YOU is your username.

You can reattach a screen session by name. Say for instance that you want to resume the 4522.pts-8.HOST session. In this case you'll have to type:

`$ screen -r 4522.pts-8.HOST</command>`

Obviously 4522.pts-8.HOST is not a very userfriendly session name. You can give a meaningful name by starting screen as:

`$ screen -S mysession</command>`

where mysession is the name you want to give to your session (e.g., work).

## Splitting windows

It could be useful to split a window so that you can have two programs running on the viewport. In this case, type CTRL-a S and you'll see that the window will be split in two regions, with the one at the bottom blank. You can swith to it with CTRL-a TAB (TAB is the tab key) and then select a window by typing its number, or p (previous) or n (next), e.g., CTRL-a 2. You can always swith through regions with CTRL-a TAB.

It's possible to split the window in more then two regions, each time by typing CTRL-a S

If you want to split a window vertically, you'll have to either use a patch[1] or use a recent version of Screen.

## Sharing screen sessions

The scenario is...

HOSTUSER and SOMEUSER are both MetaARPA members logged into sverige.

HOSTUSER wants to give SOMEUSER read only access to screen session of HOSTUSER.

HOSTUSER starts a screen session as normal.

Only three commands are needed for basic read only access to the current active window.

HOSTUSER types the following commands beginning with CTRL-a : each time ( control and 'a' followed by a colon )

CTRL-a:multiuser on<RETURN>

CTRL-a:password none<RETURN>

CTRL-a:aclchg SOMEUSER -w "#"<RETURN>

SOMEUSER should exit screen first, then in the shell, type:

`$ screen -r HOSTUSER/`

SOMEUSER now has read only access to the active window in HOSTUSER's screen session at the time of attaching.

HOSTUSER can verify SOMEUSER is attached by typing:

CTRL-a*

HOSTUSER can disconnect SOMEUSER by typing:

CTRL-a:acldel HOSTUSER<RETURN>

HOSTUSER can verify SOMEUSER is no longer attached by typing:

CTRL-a*

HOSTUSER can allow SOMEUSER access to additional commands.

The following commands allow SOMEUSER to cycle backwards and forward through the windows and detach.

HOSTUSER types:

CTRL-a:aclchg SOMEUSER +x next

CTRL-a:aclchg SOMEUSER +x prev

CTRL-a:aclchg SOMEUSER +x detach

####

Some notes:

** Screen version that was used "Screen version 4.00.03 (FAU) 23-Oct-06"

** At the time of writing ( Tue Apr 17 23:01:50 IST 2012 ) all attempts at achieving the above read only functionality by editing .screenrc failed, usually resulting in SOMEUSER having FULL access to HOSTUSER's screen and shell account.

** HOSTUSER might notice that screen resizes to fit the smaller of the two terminals.

** After SOMEUSER is detachs HOSTUSER might try CTRL-aF to resize the screen windows to fit the terminal.

** For convenience and to reduce typing in screen HOSTUSER might want to have "multiuser on" and "password none" in .screenrc. HOSTUSER's screen is still private until a user is permitted to attach with aclchg.

** HOSTUSER will hear/see lots of bells if SOMEUSER tries to type into the screen session.

** HOSTUSER can check what window is being view by SOMEUSER by looking at the output of CTRL-a*

** HOSTUSER might notice SOMEUSER appears to have rwx access in the output of CTRL-a* ...this is a bug or an undocumented feature.

** SOMEUSER can remain attached even if HOSTUSER detachs.

## .screenrc

As we previously saw, it is possible to customize Screen by writing settings in a file named .screenrc in your $HOME directory. We will now some useful Screen settings.

### Avoiding the startup message

A full screen message with copyright and other stuff is usually displayed at startup. This can get annoying. In order to avoid it, you can put in your .screenrc the following:

    startup_message off

### Keybindings

It's possible to bind keys so that when you type CTRL-a KEY Screen willl open a new window launching some program. For instance, if you write in your .screenrc file

    bind m screen -t mail 1 mutt

each time you'll type CTRL-a m a new window (named mail)with mutt will be created. Be careful: when you bind a key, you'll overwrite Screen's defaults (e.g., we just lost the lastmsg key).

## Cheat sheet

TODO

## Resources

- http://aperiodic.net/screen/start
- http://www.bangmoney.org/presentations/screen.html
- SDF has some annotated dotfiles.

## Notes

[1] http://fungi.yuggoth.org/vsp4s/

$Id: screen.html,v 1.8 2012/05/08 14:45:50 dickey Exp $