[Chapter 19] 19.2 Introduction to Shell Archives
Author: Jerry Peek, Tim O'Reilly & Mike Loukides
Date: 1998-08-04T21:39:22Z

#

| Chapter 19 Creating and Reading Archives |

## 19.2 Introduction to Shell Archives

A shell archive or shar file is a single file that contains one or more other files. Files are extracted from the archive with the standard UNIX Bourne shell (44.3). A shell archive usually doesn't let you save and restore complete directory hierarchies like cpio (19.9) and tar (19.5) do, but it is completely portable and, as a result, is used extensively on Usenet, an international network with many UNIX systems.

shar | In the Bourne shell, the operator `<<` (8.18) means to take the following lines, up to a specified string, as input to a command. (This is often called a here document.) Using this syntax and the cat (25.2) and echo (8.6) commands, you can write a simple shell archiver (shar) like the one below. Incidentally, many systems already have shar programs in place; there are several freely available versions, including the one on the CD-ROM. Just about any of them are likely to be more sophisticated than the version shown here - but this version shows the essence of how they work:

    for

    <<
    #!/bin/sh
    for file
    do
        echo "echo restoring $file"
        echo "cat > $file << 'XxXxXxXxXx-EOF-XxXxXxXxXx'"
        cat $file
        echo "XxXxXxXxXx-EOF-XxXxXxXxXx"
    done

The string `XxXxXxXxXx-EOF-XxXxXxXxXx` is entirely arbitrary - it just needs to be a string that won't otherwise appear in the input and can be used by the shell to recognize when the here document is finished.

When you give shar a list of filenames, it will string those files together on standard output, separating them with that arbitrary string and the commands to split them up again. Simply redirect this output stream to a file to create the archive. For example, the command:

>     $ shar file1 file2 > archive.shar

will produce a file called archive.shar that contains the following data:

    '...'
    echo restoring file1
    cat > file1 << 'XxXxXxXxXx-EOF-XxXxXxXxXx'
       ...
    Text of file1 will be stored here
       ...
    XxXxXxXxXx-EOF-XxXxXxXxXx
    echo restoring file2

    cat > file2 << 'XxXxXxXxXx-EOF-XxXxXxXxXx'
       ...
    Text of file2 will be stored here
       ...
    XxXxXxXxXx-EOF-XxXxXxXxXx

When this archive is run through sh, the commands it contains will be executed. Each here document (the lines from each `cat` up to the next `XxXxXxXxXx-EOF-XxXxXxXxXx`) will be output to a file:

>     $ sh archive.shar
>     restoring file1
>     restoring file2
>     $ ls
>     archive.shar
>     file1
>     file2

The unshar (19.3) program does essentially the same thing.

> NOTE: You should never blindly run a shell archive supplied by someone you don't know personally. An unscrupulous prankster could easily include a "Trojan horse" command (like `rm *`) in the middle of a seemingly innocuous archive, and cause you a lot of trouble. An easy way to do this is by browsing through the archive with the search command in a program like more (25.3). Use the search command (in more, the command is `/`) to find each end-of-file string (like `XxXxXxXxXx`); look carefully at the commands between it and the `cat` that starts the next file. Of course, if the files in the shell archive are programs themselves, you should also check them before they're executed.

- TOR

19.1 Packing Up and Moving |  | 19.3 unshar: Unarchive a Shell Archive