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.