Date: Tue, 1 Feb 2005 04:22:26 -0800 From: "Loren M. Lang" <lorenl@alzatex.com> To: Jay Moore <jaymo@cromagnon.cullmail.com> Cc: FreeBSD Mailing List <freebsd-questions@freebsd.org> Subject: Re: running interactive program from shell script Message-ID: <20050201122226.GM8619@alzatex.com> In-Reply-To: <200501300533.51350.jaymo@cromagnon.cullmail.com> References: <200501300533.51350.jaymo@cromagnon.cullmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, Jan 30, 2005 at 05:33:51AM -0600, Jay Moore wrote: > I need a shell script that initiates a telnet session to another host. I have > come up with the following, but unfortunately it terminates when the script > is finished. What I wanted was for the telnet session to remain "alive" and > interactive until manually terminated. > > Is there a way to accomplish this in a shell script? > > I've been told that I'll have to use "expect" or similar to accomplish this, > but it seems to me that I should be able to do this using just Bourne shell > commands. > > #! /bin/sh > > (sleep 3; > echo "password"; > sleep 3; > echo "ls -la"; > sleep 3; > ) | telnet -l user 192.168.0.2 When any command is run by default, it's standard input comes from the same place as it's parent process. When you run this shell script from your prompt, it inherits a standard input coming from your keyboard and any command it runs inherit the same input as the shell. The same goes for a processes standard output which it to your screen. Now when you run a pipe (|), thing are a little different, the standard input and output get redirected a little bit. The following command sets up a pipe between two programs: leftProgram | rightProgram leftProgram's standard input is still from the keyboard, but it's output gets redirected to the standard input of rightProgram and rightPrograms standard output goes to the screen as usual. Everything rightProgram reads on standard input comes only from leftProgram's standard output, it's no longer reading from the keyboard. When leftProgram's done sending output and exits, rightProgram sees and End Of File (EOF) and, in general, will exit since there's nothing more to read. In your example, you set up a sub-shell which runs 5 command, 3 sleeps and 2 echos, once the sub-shell exits, telnet just sees and EOF and exits. The control charater ^D means EOF, on a blank terminal that you don't mind logging out of, try hitting Control-D and see what happens. It will logout usually, that's what happened to telnet. Now guess what programA | programB | programC does... programB never writes to the monitor or reads from the keyboard. Working with pipes is one of the most basic things, albeit most useful things that has made UNIX famous. > > Thanks, > Jay > _______________________________________________ > freebsd-questions@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-questions > To unsubscribe, send any mail to "freebsd-questions-unsubscribe@freebsd.org" -- I sense much NT in you. NT leads to Bluescreen. Bluescreen leads to downtime. Downtime leads to suffering. NT is the path to the darkside. Powerful Unix is. Public Key: ftp://ftp.tallye.com/pub/lorenl_pubkey.asc Fingerprint: B3B9 D669 69C9 09EC 1BCD 835A FAF3 7A46 E4A3 280C
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20050201122226.GM8619>