1

У меня есть скрипт bash

#!/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

и он работает при вызове из командной строки, но не работает, когда cron вызывает его. В частности, строка с командой telnet дает нулевые байты вывода. Telnet имеет маску 755, поэтому каждый пользователь должен иметь возможность использовать ее. Есть идеи ?

2 ответа2

2

В cron у вас больше нет tty сессии, она не интерактивная. Я думаю, что telnet не нравится это. Вам понадобится какая-то другая программа, чтобы установить соединение. Простая программа для tcp-соединения и вывода ее содержимого должна быть очень маленькой, даже для встроенной работы.

Если вы работаете со встроенным, и если у вас есть bash, возможно, ваша версия bash поддерживает псевдоустройство /dev/tcp/host/port . Это нужно использовать в перенаправлении, а не в открытом файле. IE cat < /dev/tcp/host/port будет работать, cat /dev/tcp/host/port выдаст ошибку.

DAYTIME = $(cat </dev/tcp/$ ADDR/$ DTPORT | time_conv.awk)

2
DAYTIME=$(telnet $ADDR $DTPORT | time_conv.awk)

Сначала я бы сказал, что используйте nc не telnet - telnet пытается выполнить все виды интерактивного согласования линий (TELOPTS) и тому подобное, тогда как nc просто создает необработанное, чистое соединение.

Во-вторых, где находится time_conv.awk? Может быть, вы должны указать полный путь к этому файлу?

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .