Provided by: empty-expect_0.6.20b-1ubuntu1_amd64 bug

NAME

       empty - run processes under pseudo-terminal sessions

SYNOPSIS

       empty -f [-i fifo1 -o fifo2] [-p file.pid] [-L file.log] command [command args]
       empty -w [-Sv] [-t n] [-i fifo2 -o fifo1] key1 [answer1] ... [keyX answerX]
       empty -s [-Sc] -o fifo1 [request]
       empty -r [-b size] [-t n] [-i fifo2]
       empty -l
       empty -k [pid] [signal]
       empty -h

DESCRIPTION

       empty  is  an  utility  that  provides  a simple interface to execute and/or interact with
       processes under pseudo-terminal sessions. This tool is definitely useful in programming of
       shell  scripts which are used to communicate with interactive programs like telnet or ftp.
       In some cases empty can be a substitution for  TCL/expect  or  other  similar  programming
       tools.

       There  are  several  common  forms of command lines for empty.  But the first execution of
       empty is usually a start in the daemon mode to fork a new  command  (process)  under  PTY-
       session.  This  can  be  done  with  -f  key.   An interface for the input and output data
       channels of the forked process is performed by two fifo files which names may be specified
       with -i and -o keys. These files are automatically created/deleted any time you start/exit
       empty daemon, so you must not create them manually. If you  did  not  specify  these  fifo
       files  in the command line, empty names them by itself basing on its PID and PID of forked
       PTY process.

       At this point any application can easily communicate with forked process by  writing  data
       to  the  input fifo and reading answers from the output fifo, see EXAMPLES section for the
       details. To simplify this operations, empty offers an interface to just send any data (use
       -s  key),  or even to watch the output fifo for multiple keyphrases and reply to the input
       fifo with one of the responses (see -w key).

       Note!  Input fifo for empty -f ...  is usually an output fifo for empty -w  and  empty  -s
       forms. And output fifo of empty -f ...  is an input fifo for empty -w ...

       If  something goes wrong the forked process may be killed by the standard kill command, or
       using -k key of empty.  See -p option to save PID of empty daemon process.

       The following options are available:

       -f          fork, spawn, start or execute a new process specified by the command  and  its
                   arguments.  If  you omit fifo files, empty with its job control algorithm will
                   create them under /tmp directory using this templates:  empty.PPID.PID.in  and
                   empty.PPID.PID.out,  here PPID is usually your shell system process ID and PID
                   is system process ID of empty-daemon.

       -s          send data (request) to the forked process. If fifo file was not specified with
                   -o  key,  empty will try to find an automatically created fifo file it in /tmp
                   directory. Instead of command line you can send your request or data  directly
                   to standard input (stdin) of empty

       -w          watch  for  one  or  more  keyphrases  and  if specified send the appropriated
                   response to the input fifo.  If response is  not  set,  empty  waits  for  the
                   proper  keyphrase  then exits. With -w key empty returns the number of matched
                   keyphrase-response pair, or 255 if fails to find this match (see  -t  key  for
                   details of possible exit on timeout).

       -r          read  from output FIFO one line (default) or one block of data (if -b size was
                   specified). If -t n key was placed, exit on timeout.

       -l          list automatically created jobs by your shell.  NB!  Your custom  jobs,  which
                   fifo files you specified with -i and -o keys, are not displayed. So if you did
                   not specify fifo files with -i and -o keys all operations are done  under  the
                   job marked current

       -k          send  signal to the process with pid.  If you did not specify pid, empty tries
                   to find it within the list of automatically created jobs. If signal is omitted
                   the default SIGTERM is used.

       -h          print short help message and exit

       -i fifo1    a fifo file, which is used as input for a forked process.

       -o fifo2    a fifo file, which is used as output for a forked process.

       -L file.log This option allows to log the whole empty session to a file. Marks >>> and <<<
                   show the directions of data flow.

       --logfile-mode=mode
                   This option allows to choose the mode of the log  file  created  with  the  -L
                   option.  The default mode is 0600.

       -p file.pid Save PID of empty daemon process to a file

       -t n        If  input  FIFO  is  empty,  wait for n seconds (default is 10) to receive the
                   keyphrase then exit on timeout with 255 code.

       -c          force empty to use stdin for data or requests.

       -S          Strip the last character from the input. Works with -s and -w keys

       -v          kvazi verbose mode. Show all contents of received buffer.

EXAMPLES

       Start a new PTY-session with telnet to localhost:
            empty -f -i in.fifo -o out.fifo -p empty.pid -L empty.log telnet localhost

       Interact with telnet:
            empty -w -i out.fifo -o in.fifo ogin 'my_user\n'
            empty -w -i out.fifo -o in.fifo assword 'my_password\n'

       Send commands to telnet with empty:
            empty -s -o in.fifo who
            empty -s -o in.fifo "ls -la /\n"

       The same using STDIN:
            echo who | empty -s -o in.fifo
            echo "ls -la /" | empty -s -o in.fifo

       Just cat output from telnet:
            cat out.fifo

       Read one line from out.fifo:
            empty -r -i out.fifo

       Send commands to telnet with ordinary echo:
            echo "who am i" > in.fifo
            echo "uname -a" > in.fifo

       Kill a process with PID 1234:
            empty -k 1234
       or
            kill 1234

       Telnet session with automatically created jobs:
            empty -f telnet localhost

       Interact with telnet using job control:
            empty -w ogin 'my_user\n'
            empty -w assword 'my_password\n'

       List automatically created jobs:
            empty -l

            PPID    PID     TYPE    FILENAME
            479     706     in      /tmp/empty.479.706.in
            479     706     out     /tmp/empty.479.706.out
            479     711     in      /tmp/empty.479.711.in
            479     711     out     /tmp/empty.479.711.out

            479     711     current

SECURITY

       It is considered insecure to send a password in the command line like this:

            empty -w assword 'my_password\n'

       or like this:

            empty -s 'my_password\n'

       The reason is that the command line arguments are visible to the  system  while  empty  is
       running.  Any local user can see them with ps(1), sometimes they are visible even remotely
       with finger(1).  Also your server may have some  monitoring  tools  which  may  store  the
       output from ps(1) in their logs. There are also other, more complicated ways to compromise
       this information. Generally, you should take command line arguments as (possibly)  visible
       to every one unless you really know what you're doing.

       empty  with  '-s'  flag  runs quickly in most cases, but still it can hang for a number of
       reasons (like fifo overloading), and even if it runs quick you still cannot be  sure  that
       no  one will see its command line arguments even in this short time.  empty with '-w' flag
       is even worse because it must wait for the keyphrase.

       A better way to send the password to the supervised program is to read it from file:

            empty -s [common options] <./password-file

       or from a pipe:

            get-password-of-user "$user" |empty -s [common options]

       You should still make sure that you do not  send  any  password  via  command  line  while
       creating  this  file,  and certainly you should set some safe permissions to this file AND
       its directory (with the parent directories) before reading the password from the  file  OR
       writing the password to it.

       Another possible way is to use your shell's builtin (but see below):

            echo "$password" |empty -s [common options]

       Many  shells like bash(1), csh(1) and FreeBSD's sh(1) do not call external echo(1) command
       but use their own builtin echo command. Since no external command is  started  (the  shell
       itself  does all that echo(1) must do), nothing is shown in the process list. It is beyond
       this manual page to discuss the way to make sure that your shell uses the builtin command.

RETURN VALUES

       If any error occurs empty usually exits with code 255. Otherwise  zero  or  some  positive
       value (see -w key) is returned.

SEE ALSO

       expect(1), chat(8)

AUTHOR

       empty  was  made  by Mikhail E. Zakharov. This software was based on the basic idea of pty
       version 4.0 Copyright (c) 1992, Daniel J. Bernstein but no  code  was  ported  from  pty4.
       SECURITY section of this manual page was contributed by Sergey Redin.

                                          March, 05 2006                                 empty(1)