Подключение к команде в Ash Shell

Я написал сценарий bash для отправки электронной почты с помощью telnet. Я устанавливаю его на TS-7260 под управлением busyBox (с пепельной оболочкой).

Что-то отличается между Bash и Ash, и я не могу понять, почему следующее не будет работать. Должно быть что-то с тем, как я передаю эхо в телнет. Вот сценарий:

#!/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: [email protected]"
sleep 5
echo "rcpt to: [email protected]"
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

Я также пытался использовать обычные круглые скобки перед трубой. Я прочитал справочную страницу для пепла и все еще делаю что-то глупое. Я подозреваю, что это какой-то дочерний процесс.

Это отлично работает из bash, кстати.

Заранее спасибо!


Примечание. Я упростил сценарий, чтобы он был просто:

echo "quit" | telnet blah.com port

Он делает именно то, что вы ожидаете от bash, но я вижу, что в ash ничего не происходит. Замена эха на «sleep 10» показывает, что сон работает как процесс, но не как telnet.


person Narrat1ve    schedule 10.07.2013    source источник
comment
Я бы предположил, что любая оболочка поддерживает трассировку отладки с помощью set -vx. Попробуйте включить это, запустите bash в одном окне и ash в другом. видите, где отличия? Поддерживает ли ash $(... cmd-substitution)? Кажется, я читал, что нет. Вместо этого использовать обратные тики (yik)? Удачи!   -  person shellter    schedule 10.07.2013
comment
Что именно не работает? Другой вывод, выход с явной ошибкой, что-то еще?   -  person chepner    schedule 10.07.2013
comment
Похоже, что канал работает как-то по-другому - set -vx показывает, что команды выполняются так, как должны, однако, глядя на процессы, запущенные в системе, telnet никогда не запускается (или работает слишком короткое время, чтобы я мог поймать ). В bash это так, и вы видите, что ответы возвращаются эхом. И $() отлично работает с пеплом, насколько я могу судить.   -  person Narrat1ve    schedule 10.07.2013


Ответы (1)


После еще некоторых экспериментов проблема оказалась вовсе не с оболочкой, а с реализацией Telnet на Busybox. В моей версии BusyBox (1.00rc2) передача данных в Telnet не работала.

echo blah | telnet -yrDumb

Надо было хотя бы заставить telnet жаловаться на использование. Это не так. Я взял самую последнюю версию inetutils (1.9.1) и скомпилировал ее telnet для TS-7260. Теперь он работает как сон (читай: работает) и согласуется с поведением, которое я вижу при использовании telnet и bash на моем обычном компьютере с Linux.

Спасибо за помощь!

person Narrat1ve    schedule 10.07.2013