我有 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 个掩码,因此每个用户都应该能够使用它。有什么想法吗?
答案1
DAYTIME=$(telnet $ADDR $DTPORT | time_conv.awk)
首先我想说nc
不要使用telnet
- telnet 尝试各种交互式线路协商(TELOPTS)和其他事情,而nc
只是创建一个原始的、干净的连接。
其次,time_conv.awk 在哪里?也许您应该指定该文件的完整路径?
答案2
在 cron 中,您不再有 tty 会话,它是非交互式的。我认为 telnet 不喜欢这样。您将需要其他一些程序来获取连接。一个用于执行 tcp 连接并转储其内容的简单程序应该是一个非常小的程序,即使对于嵌入式工作也是如此。
如果你正在运行嵌入式系统,并且如果您有 bash,也许您的 bash 版本支持/dev/tcp/host/port
伪设备。这需要在重定向中使用,而不是打开文件。IEcat < /dev/tcp/host/port
可以工作,但cat /dev/tcp/host/port
会出现错误。
DAYTIME=$(cat < /dev/tcp/$ADDR/$DTPORT | time_conv.awk)