Hack #35. Use script to Save Yourself Time and Train Others

The standard script command ensures repeatability and lends itself nicely to training junior admins.

If you took computer science courses in college, you may have run into the script command before. Professors often want you to hand in the entire contents of an interactive shell session with assignments, so what students often do is simply run script as the first command of their session. That copies all IO taking place in the terminal to a file (named, by default, typescript). When they're done, they just type exit, and they can then turn in the typescript file to the professor.

script has some uses beyond the classroom as well, though. In some stricter production environments, everything that gets done to non-testing, full-production systems has to be "repeatable"—in other words, scripted, thoroughly tested, and documented to the point that someone in change management, with no training in Unix, can do it. One tool that can be used to create the documentation is script. You'll still have to script your procedure into oblivion, using the corporate coding standard, but then you can actually record a session where you invoke the tool and hand it over to the change management personnel, so they can see exactly what they need to do, in order.

One extremely cool feature of the script command is that it can output timing information to a separate file. The entire terminal session can then be replayed later using the scriptreplay command, and it will be replayed using the same timing as the original session! This is great for newer users who have a hard time remembering how to perform tasks that you don't have time to script for them.

Here's a quick session using the two commands:

	$ script -t 2> timing
	Script started, file is typescript
	$ ls
	Desktop		hax		hog.sh	My Computer		ostg	src
	$ pwd
	/home/jonesy
	$ file hax
	hax: empty
	$ exit
	exit
	Script done, file is typescript
	$ scriptreplay timing
	$ ls
	Desktop		hax		hog.sh	My Computer		ostg	src
	$ pwd
	/home/jonesy
	$ file hax
	hax: empty
	$ exit
	exit

Using the -t flag tells the script command to output all timing information to standard error, so we redirect that to a file (here, timing) so that we can use it later. We then call scriptreplay, feeding it the timing file. We don't have to tell it where the actual session output is in this case, because it looks for a file named typescript by default, which also happens to be the default session output file for the script command.

Note that every keystroke is recorded, so if you mess up and hit backspace to delete a few characters, that'll show up in the replay of the session! Also note that replaying a session is only guaranteed to work properly on the terminal where the original session output file was created.

If you want a more "real-time" approach to showing someone how to get things done, there's another way script can help. Create a named pipe and redirect all output to the pipe. Someone else, logged in remotely, can then cat the pipe and see what's going on while it's happening.

Here's how it works. First, create a named pipe with mkfifo:

	$ mkfifo out

Then run script with the -f flag, which will flush all output to your pipe on every write. Without that flag, things won't work. The last argument to script is the file to which the output should be sent:

	 $ script -f out

You're now in a session that looks and acts completely normal, but someone else can log in from elsewhere and run the following command to watch the action:

	$ cat out

Everything will be shown to that user as it happens. This is a little easier than remembering how to set up multi-user screen sessions!

See Also

  • "Disconnect Your Console Without Ending Your Session" [Hack #34]

Get Linux Server Hacks, Volume Two now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.