NAME
sash - stand-alone shell with built-in commands
SYNOPSYS
sash [-c command] [-f fileName ] [-p prompt] [-q] [-a]
DESCRIPTION
The sash program is a stand-alone shell which is useful for recovering
from certain types of system failures. In particular, it was created
in order to cope with the problem of missing shared libraries or
important executables.
Sash can execute external programs, as in any shell. There are no
restrictions on these commands, as the standard shell is used to
execute them if there are any non-wildcard meta-characters in the
command.
More importantly, however, is that many of the standard system commands
are built-in to sash. These built-in commands are:
-ar, -chattr, -chgrp, -chmod, -chown, -cmp, -cp,
-dd, -echo, -ed, -grep, -file, -find, -gunzip,
-gzip, -kill, -ln, -ls, -lsattr, -mkdir, -mknod,
-more, -mount, -mv, -printenv, -pwd, -rm, -rmdir,
-sum, -sync, -tar, -touch, -umount, -where
These commands are generally similar to the standard programs with
similar names. However, they are simpler and cruder than the external
programs, and so many of the options are not implemented. The
restrictions for each built-in command are described later.
The built-in commands which correspond to external programs begin with
a dash character in order to distinguish them from the external
programs. So typing "ls", for example, will attempt to run the real ls
program. If "-ls" is typed, then the built-in command which mimics ls
is called.
For the built-in commands, file names are expanded so that asterisks,
question marks, and characters inside of square brackets are recognised
and are expanded. Arguments can be quoted using single quotes, double
quotes, or backslashes. However, no other command line processing is
performed. This includes specifying of file redirection, and the
specifying of a pipeline.
If an external program is non-existant or fails to run correctly, then
the "alias" built-in command may be used to redefine the standard
command so that it automatically runs the built-in command instead.
For example, the command "alias ls -ls" redefines "ls" to run the
built-in command. This saves you the pain of having to remember to
type the leading dash all of the time. If many external programs will
not run, then the "aliasall" command may be useful to create multiple
aliases.
The "help" command will list all of the built-in commands in sash . If
an argument is given, it will list only those built-in commands which
contain the given argument as a sub-string. Each built-in command is
described below in more detail.
alias [name [command]]
If name and command are provided, this defines an alias for a
command with the specified name which executes the specified
command with possible arguments. Arguments containing wildcards
can be quoted in order to defer their expansion until the alias
is invoked. If just name is provided, then the definition of
the specified command alias is displayed. If nothing is
provided, then the definitions of all aliases are displayed.
aliasall
This defines aliases for all of the built-in commands that start
with dashes to the corresponding names without the dashes. This
may be useful when the system is so corrupted that no external
programs may be executed at all.
-ar [txp][v] arfile [filename]...
List or extract files from an ar archive. The arfile argument
specifies a file name which contains the archive. If no
additional filenames are specified, then all files in the
archive are operated on. Otherwise, only those archive members
which have the same name as one of the additional filenames are
operated on. Filenames which do not appear in the archive are
ignored. Archives cannot be created or modified. The archiver
correctly handles 4.0BSD archives, and understands both the SysV
and 4.4BSD extensions for long file names. The extended pseudo-
BSD formats are not supported; nor are the two antediluvian
binary formats derived from V7 and earlier. (The GNU archiver
normally creates archives in the 4.0BSD format with SysV
extensions.)
cd [dirName]
If dirName is provided, then the current directory is changed to
the dirName. If dirName is absent, then the current directory
is changed to the user's home directory (value of the $HOME
environment variable).
-chattr [+i] [-i] [+a] [-a] fileName ...
Change the attributes of the specified files on an ext2 or ext3
file system. Using a plus sign adds the specified attribute for
the files. Using a minus sign removes the specified attributes
for the files. The 'i' attribute makes a file immutable so that
it cannot be changed. The 'a' attribute makes a file append-
only. This command is only available on Linux.
-chgrp gid fileName ...
Change the group id for the specified list of files. The gid
can either be a group name, or a decimal value.
-chmod mode fileName ...
Change the mode of the specified list of files. The mode
argument can only be an octal value.
-chown uid fileName ...
Change the owner id for the specified list of files. The uid
can either be a user name, or a decimal value.
-cmp fileName1 fileName2
Determines whether or not the specified file names have
identical data. This says that the files are links to each
other, are different sizes, differ at a particular byte number,
or are identical.
-cp srcName ... destName
Copies one or more files from the srcName to the destName. If
more than one srcName is given, or if destName is a directory,
then all the srcNames are copied into the destName directory
with the same names as the srcNames.
-dd if=name of=name [bs=n] [count=n] [skip=n] [seek=n]
Copy data from one file to another with the specified
parameters. The if and of arguments must be provided, so stdin
and stdout cannot be specified. The bs argument is the block
size, and is a numeric value (which defaults to 512 bytes).
Count is the number of blocks to be copied (which defaults to
end of file for the input file). Skip is the number of blocks
to ignore before copying (seek is used if possible, and the
default is 0). Seek is the number of blocks to seek in the
output file before writing (and defaults to 0). Any of the
numeric decimal values can have one or more trailing letters
from the set 'kbw', which multiplies the value by 1024, 512, and
2 respectively. The command reports the number of full blocks
read and written, and whether or not any partial block was read
or written.
-echo [args] ...
Echo the arguments to the -echo command. Wildcards are
expanded, so this is a convenient way to get a quick list of
file names in a directory. The output is always terminated with
a newline.
-ed [fileName]
Edit the specified file using line-mode commands. The following
ed commands are provided: = c r w i a d p l s f k z and q. Line
numbers can be constants, ".", "$", "'x", /string/ and simple
arithmetic combinations of these. The substitute command and
the search expression can only use literal strings. There are
some small differences in the way that some commands behave.
exec fileName [args]
Execute the specified program with the specified arguments.
This replaces sash completely by the executed program.
exit Quit from sash.
-file fileName ...
Examine the specified files and print out their file type. This
indicates whether the files are regular files or not, whether
they contain printable text or shell scripts, are executables,
or contain binary data.
-find dirName [-xdev] [-type chars] [-name pattern] [-size minSize]
Find all files contained within the specified directory tree
which meet all of the specified conditions. The -xdev option
prevents crossing of mount points. The -name option specifies a
wildcard pattern to match the last component of the file names.
The -type option specifies that the files must have a type
matching the specified list from the set: f d c b p s l. These
represent regular files, directories, character devices, block
devices, named pipes, sockets, and symbolic links. The -size
option specifies that the files must be regular files or
directories which contain at least the specified number of
bytes.
-grep [-in] word fileName ...
Display lines of the specified files which contain the given
word. If only one file name is given, then only the matching
lines are printed. If multiple file names are given, then the
file names are printed along with the matching lines. Word must
be a single word, (ie, not a regular expression). If -i is
given, then case is ignored when doing the search. If -n is
given, then the line numbers of the matching lines are also
printed.
-gunzip inputFileName ... [-o outputPath]
Uncompress one or more files that had been compressed using the
gzip or compress algorithms. If the -o option is not given,
then each of the input file names must have one of the
extensions ".gz", ".tgz", or ".Z", and those files will be
replaced by the uncompressed versions of those files. The
original files will be deleted after the output files have been
successfully created. The uncompressed versions of the files
have the same names as the original file names, except for a
simple modification of their extensions. If an extension is
".tgz", then the extension is replaced by ".tar". Otherwise,
the ".gz" or ".Z" extension is removed.
If the -o option is given, then the input files will not be
deleted, and the uncompressed versions of the files will be
created as specified by outputPath. If the output path is a
directory, then the uncompressed versions of the input files
will be placed in that directory with their file names modified
as described above, or with the same name if the input file name
does not have one of the special extensions. If the output path
is a regular file, then only one input file is allowed, and the
uncompressed version of that input file is created as the output
path exactly as specified. If the output path is a block or
character device, then the uncompressed versions of the input
files are concatenated to the device.
This command is only available if sash was compiled to use the
gzip library.
-gzip inputFileName ... [-o outputPath]
Compresses one or more files using the gzip algorithm. If the
-o option is not given, then each of the input file names will
be replaced by the compressed versions of those files, The
original files will be deleted after the output files have been
successfully created. The compressed versions of the files have
the same names as the original file names, except for a simple
modification of the extensions. If an extension is ".tar", then
the extension is replaced by ".tgz". Otherwise, the ".gz"
extension is added.
If the -o option is given, then the input files will not be
deleted, and the compressed versions of the files will be
created as specified by outputPath. If the output path is a
directory, then the compressed versions of the input files will
be placed in that directory with their file names modified as
described above. If the output path is not a directory, then
only one input file is allowed, and the compressed version of
that input file is created as the output path exactly as
specified.
This command is only available if sash was compiled to use the
gzip library.
help [word]
Displays a list of built-in commands along with their usage
strings. If a word is given, then just those commands whose
name or usage contains the word is displayed. If a word is
specified which exactly matches a built-in command name, then a
short description of the command and its usage is given.
-kill [-signal] pid ...
Sends the specified signal to the specified list of processes.
Signal is a numeric value, or one of the special values HUP,
INT, QUIT, KILL, TERM, STOP, CONT, USR1 or USR2. If no signal
is specified then SIGTERM is used.
-ln [-s] srcName ... destName
Links one or more files from the srcName to the specified
destName. If there are multiple srcNames, or destName is a
directory, then the link is put in the destName directory with
the same name as the source name. The default links are hard
links. Using -s makes symbolic links. For symbolic links, only
one srcName can be specified.
-ls [-lidFC] fileName ...
Display information about the specified list of file names. The
normal listing is simply a list of file names, one per line.
The options available are -l, -i, -d, and -F. The -l option
produces a long listing giving the normal 'ls' information. The
-i option displays the inode numbers of the files. The -d
option displays information about a directory, instead of the
files within it. The -F option appends a slash or asterisk to
the file name if the file is a directory or is executable. The
-C option displays the file names in a multi-column format. The
width of the output is calculated using the COLS environment
variable.
-lsattr fileName ...
Display attributes for the specified files on an ext2 or ext3
file system. The letter 'i' indicates that the file is
immutable and cannot change. The letter 'a' indicates that the
file is append-only. Dashes are shown where the attributes are
not set. This command is only available on Linux.
-mkdir dirName ...
Creates the specified directories. They are created with the
default permissions.
-mknod fileName type major minor
Creates a special device node, either a character file or a
block file. Filename is the name of the node. Type is either
'c' or 'd'. Major is the major device number. Minor is the
minor device number. Both of these numbers are decimal.
-more fileName ...
Type out the contents of the specified file names, one page at a
time. For each page displayed, you can type 'n' and a return to
go to the next file, 'q' and a return to quit the command
completely, or just a return to go to the next page. The
environment variables LINES and COLS can be used to set the page
size.
-mount [-t type] [-r] [-s] [-e] [-m] devName dirName
Mount a filesystem on a directory name. The -t option specifies
the type of filesystem being mounted, and defaults to "ext3" for
Linux and "ffs" for BSD. The -r option indicates to mount the
filesystem read-only. The -s option indicates to mount the
filesystem no-suid. The -e option indicates to mount the
filesystem no-exec. The -m option indicates to remount an
already mounted filesystem. The -m option is only available on
Linux.
-mv srcName ... destName
Moves one or more files from the srcName to the destName. If
multiple srcNames are given, or if destName is a directory, then
the srcNames are copied into the destination directory with the
same names as the srcNames. Renames are attempted first, but if
this fails because of the files being on different filesystems,
then copies and deletes are done instead.
-printenv [name]
If name is not given, this prints out the values of all the
current environment variables. If name is given, then only that
environment variable value is printed.
prompt [word] ...
Sets the prompt string that is displayed before reading of a
command. A space is always added to the specified prompt.
-pwd Prints the current working directory.
quit Exits from sash.
-rm fileName ...
Removes one or more files.
-rmdir dirName ...
Removes one or more directories. The directories must be empty
for this to be successful.
setenv name value
Set the value of an environment variable.
source fileName
Execute commands which are contained in the specified file name.
-sum fileName ...
Calculates checksums for one or more files. This is the 16 bit
checksum compatible with the BSD sum program.
-sync Do a "sync" system call to force dirty blocks out to the disk.
-tar [ctxv]f tarFileName [fileName] ...
Create, list or extract files from a tar archive. The f option
must be specified, and accepts a device or file name argument
which contains the tar archive. When creating, at least one
file name must be specified to be stored. If a file name is a
directory, then all the files and directories within the
directory are stored. Linked files and other special file types
are not handled properly. When listing or extracting files,
only those files starting with the specified file names are
processed. If no file names are specified, then all files in
the archive are processed. Leading slashes in the tar archive
file names are always removed so that you might need to cd to
"/" to restore files which had absolute paths.
-touch fileName ...
Updates the modify times of the specifed files. If a file does
not exist, then it will be created with the default protection.
umask [mask]
If mask is given, sets the "umask" value used for initializing
the permissions of newly created files. If mask is not given,
then the current umask value is printed. The mask is an octal
value.
-umount [-f] fileName
Unmounts a file system. The file name can either be the device
name which is mounted, or else the directory name which the file
system is mounted onto. The -f option unmounts the filesystem
even if it is being used. The -f option is only available on
BSD.
unalias name
Remove the definition for the specified alias.
-where program
Prints out all of paths defined by the PATH environment variable
where the specified program exists. If the program exists but
cannot be executed, then the reason is also printed.
OPTIONS
There are several command line options to sash.
The -c option executes the next argument as a command (including
embedded spaces to separate the arguments of the command), and then
exits.
The -f option executes the commands contained in the file name
specified by the next argument, and then exits. This feature can be
used to create executable scripts for sash by starting the script file
with a line similar to:
#! /bin/sash -f
The -p option takes the next argument as the prompt string to be used
when prompting for commands.
The -q option makes sash quiet, which simply means that it doesn't
print its introduction line when it starts. This option is also
implied if the -c or -f options are used.
The -a option creates aliases for the built-in commands so that they
replace the corresponding standard commands. This is the same result
as if the 'aliasall' command was used.
SYSTEM RECOVERY
This section contains some useful information about using sash with
lilo to perform system recovery in some situations. Similar concepts
should exist for other boot loaders and operating systems.
When important shared libraries are being upgraded, it might be a good
idea to have sash already running on a console by itself. Then if
there is a problem with the shared libraries sash will be unaffected
and you may be able to use it to fix the problem.
If a problem with the system shows up at boot time so that you cannot
enter multi-user mode and log in, then you can first try booting into
single-user mode by adding the single keyword after your kernel image
name at the lilo prompt. If you manage to reach a shell prompt, then
you can run sash from that shell (if necessary). One reason for doing
this is that you might need to use the -mount command with the -m
option to remount the root file system so that it can be modified.
If you cannot reach the shell in single-user mode, then you can try
running sash directly as a replacement for the init process. This is
done by adding the init=/bin/sash keyword after your kernel image name
at the lilo prompt. When this is done, then the use of the aliasall
command might be useful to reduce attempts to access the root file
system when running commands.
If your root file system is so corrupted that you cannot get sash to
run at all, then you will have to resort to a system recovery floppy.
WARNINGS
Sash should obviously be linked statically, otherwise its purpose is
lost.
Several other system commands might be necessary for system recovery,
but aren't built-in to sash.
AUTHOR
David I. Bell
dbell@canb.auug.org.au
12 January 2004