Newsgroups: comp.unix.shell,alt.comp.lang.shell.unix.bourne-bash,gnu.bash Date: 15 Oct 2005 18:53:22 -0700
A friend of mine was trying to drive a scripted telnet session using bash, and did not have tools like Perl, Tcl/Tk or expect available on the platform, so I wrote a bash function to implement "expect" functionality directly, taking advantage of bash's "/dev/tcp" feature. Below is the function, which expects the global "timeout" variable to be initialized, and expects file descriptor #3 to already be open for reading and writing.
After the function is a usage example that works with my CMC system (see http://gangplank.org/ for more information on the system) — since my server implements telnet and doesn't provide the login prompt until the telnet protocol initialization completes, I have it wait for a \377 byte that indicates the start of the telnet protocol sequence. A similar technique could be used to send a telnet protocol response string for a known initial protocol sequence.
Also straightforward would be using the 3-digit codes in a protocol such as SMTP with this function to send an email, or to implement other such protocols.
Deven
#!/bin/bash
timeout=600
expect() {
local expect="$1" send="$2"
local delim="${expect:(-1):1}"
local buffer="" block=""
while read -u3 -r -t$timeout -d "$delim" block; do
buffer="$buffer$block$delim"
case "$buffer" in
*"$expect")
echo "$send" 1>&3
return
;;
esac
done
}
exec 3<>/dev/tcp/localhost/9999
expect "`echo -en '\377'`" "guest"
expect "name:" "testing"
expect "blurb:" "testing2"Deven T. Corzine