0

I wrote a bash script to send an email using telnet. I'm installing it on a TS-7260 running busyBox (which has an ash shell).

Something is different between Bash and Ash and I can't figure out why the following won't work. It's got to be something with the way I'm piping the echos to telnet. Here's the script:

#!/bin/ash

# Snag all the error messages from a given date, open a telnet connection to an outgoing mail server, stick the logs in an email, and send it.
# Tue Jul  2 14:06:12 EDT 2013
# TMB

# Tue Jul  9 17:12:29 EDT 2013
# Grepping the whole error file for WARNING and the piping it to a grep for the date took about four minutes to complete on the gateway.  This will only get longer and the file will only get bigger as time goes by.
# Using tail to get the last 5000 lines, I get about three days of errors (2000 of them are from one day, though)
# Getting 5000 lines, then searching them by WARNING and then DATE took 15 seconds on the gateway.

yesterdayDate=$(./getYesterday)

warningLogs=$(tail -5000 /mnt/sd/blah.txt | grep WARNING | grep "$yesterdayDate")

sleep 30

{
sleep 5
echo "ehlo blah.com"
sleep 5
echo "auth plain blah"
sleep 5
echo "mail from: blah@blah.com"
sleep 5
echo "rcpt to: me@blah.com"
sleep 5
echo "data"
sleep 5

echo "Hi!"
sleep 1
echo "Here are all the warnings and faults from yesterday:"
sleep 1
echo "$yesterdayDate"
sleep 1
echo "NOTE: All times are UTC."
sleep 1
echo ""
sleep 1
echo "$warningLogs"
sleep 10
echo ""
sleep 1
echo "Good luck,"
sleep 1
echo "The Robot"
sleep 5
echo "."
sleep 20
echo "quit"
sleep 5
} | telnet blah.com port

exit

I've tried using normal parentheses too before the pipe. I've read the man page for ash and am still doing something stupid. I suspect it's some kind of child process business going on.

This works fine from bash, btw.

Thanks in advance!


Note -- I simplified the script to be just:

echo "quit" | telnet blah.com port

It does exactly what you'd expect in bash, but I see nothing happen in ash. Replacing the echo with "sleep 10" shows sleep running as a process, but not telnet.

ruakh
  • 175,680
  • 26
  • 273
  • 307
Narrat1ve
  • 35
  • 1
  • 8
  • I would assume that any shell supports debugging trace with set -vx. Try turning that on, run under bash in one window and ash in the other. see where there are differences? Does ash support the $(... cmd-substitution) ? I think I have read it doesn't. Use back-tics (yik) instead? Good luck! – shellter Jul 10 '13 at 02:35
  • What, exactly, doesn't work? Different output, exit with explicit error, something else? – chepner Jul 10 '13 at 13:16
  • It sure seems like the pipe works differently somehow -- "set -vx" shows the commands being executed as they should, however looking at the processes running on the system, telnet never runs (or it runs for too short of a time for me to catch). On bash, it does, and you see the responses echoed back. And $() works fine on ash, as far as I can tell. – Narrat1ve Jul 10 '13 at 17:21

1 Answers1

1

After some more experimentation, the problem was not with the shell at all, but with the implementation of Telnet on Busybox. On my version of BusyBox (1.00rc2), piping anything to Telnet didn't work.

echo blah | telnet -yrDumb

Should have at least made telnet complain about usage. It didn't. I grabbed the most recent version of inetutils (1.9.1) and compiled its telnet for the TS-7260. It works like a dream (read: it works) now, and is consistent with the behavior I see using telnet and bash on my normal linux box.

Thanks for the help!

Narrat1ve
  • 35
  • 1
  • 8