У меня есть сценарий удара
#!/bin/sh
DTFILE=/etc/daytime.addr
DTPORT=13
DAYTIME_ERROR=/tmp/dtm.err
function daytime_error(){
if [[ -z $1 ]]
then
exit 1
fi
if [[ -e $DAYTIME_ERROR ]]
then
echo "Error already reported"
else
logger "$1"
touch $DAYTIME_ERROR
fi
exit 1
}
if [[ -s $DTFILE ]]
then
ADDR=$(head -n1 $DTFILE)
DAYTIME=$(telnet $ADDR $DTPORT | time_conv.awk)
if [[ -z $DAYTIME ]]
then
daytime_error "Daytime client: no connection to $ADDR"
else
date -s "$DAYTIME"
hwclock -w
rm $DAYTIME_ERROR
fi
else
daytime_error "Daytime client: no daytime server address in file $DTFILE"
fi
и это работает при вызове из командной строки, но сбои, когда крон называет его. Конкретно строка с командой telnet дает нулевые байты вывода. Telnet имеет 755 масок, таким образом, каждый пользователь должен смочь использовать его. Какие-либо идеи?
DAYTIME=$(telnet $ADDR $DTPORT | time_conv.awk)
Сначала я сказал бы использование nc
нет telnet
- telnet делает попытку всех видов интерактивного согласования строки (TELOPTS) и вещей, тогда как nc
просто создает сырые данные, чистые, соединение.
Во-вторых, где time_conv.awk? Возможно, необходимо ли указать полный путь в тот файл?
В кроне у Вас больше нет tty сессии, это не является интерактивным. Я думаю, что telnet не нравится это. Вам будет нужна некоторая другая программа для получения соединения. Простая программа, чтобы сделать подключение tcp и дамп, это - содержание, должна быть очень небольшой программой, даже для встроенной работы.
Если Вы работаете встроенный, и если у Вас есть удар, возможно, Ваша версия удара поддерживает /dev/tcp/host/port
псевдоустройство. Это должно использоваться в перенаправлении, не открытом файле. Т.Е. cat < /dev/tcp/host/port
будет работать, cat /dev/tcp/host/port
даст ошибку.
$ DAYTIME= (кошка </dev/tcp/$ADDR/$DTPORT | time_conv.awk)