Man Linux: Main Page and Category List

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)