Cron无法运行bash脚本
我有bash脚本Cron无法运行bash脚本,bash,cron,telnet,Bash,Cron,Telnet,我有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
#!/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调用时失败。具体来说,line with telnet命令提供零字节的输出。Telnet有755个掩码,所以每个用户都应该能够使用它。有什么想法吗
更新,time_conv.awk的内容:
#! /usr/bin/awk -f
/[0-9]+:[0-9]+:[0-9]+/ {
if ($2~/Jan/) $2=1;
else if ($2~/Feb/) $2=2;
else if ($2~/Mar/) $2=3;
else if ($2~/Apr/) $2=4;
else if ($2~/May/) $2=5;
else if ($2~/Jun/) $2=6;
else if ($2~/Jul/) $2=7;
else if ($2~/Aug/) $2=8;
else if ($2~/Sep/) $2=9;
else if ($2~/Oct/) $2=10;
else if ($2~/Nov/) $2=11;
else if ($2~/Dec/) $2=12;
print $5 "-" $2 "-" $3 " " $4
}
我猜有些路不见了。。。您是否尝试使用/usr/bin/telnet而不是telnet
要查找telnet的路径,您可以使用
哪个telnet
您应该提到您收到的特定错误消息。不管怎么说,既然你说telnet线路导致了一个错误,我假设以下常见的陷阱:
- 脚本需要Bash shell才能正常运行
- 系统的默认shell不是
。查看/bin/bash
指向的对象,例如使用/bin/sh
ls-l/bin/sh
- 但是,您的帐户被设置为将
作为默认shell(这可能是在/bin/bash
中为您的帐户设置的,或者通过变量/etc/passwd
设置的)$shell
- 更改系统的默认shell(取决于您的系统,而不是我的建议)
- 使您的cronjobs使用Bash作为默认值:在crontab中设置
SHELL=/bin/Bash
- 将脚本的第1行更改为明确提到Bash:
(我的建议)#!/bin/Bash
.rhosts
文件吗?这样,当您使用telnet时,您不必输入密码。您不能在crontab脚本中输入密码
如果这是原因,你必须做三件事:
- 找出crontab在哪个用户下运行
- 对于该用户,运行
程序,并生成公钥和私钥。对远程计算机执行相同的操作。现在,在远程计算机上创建一个授权的_-hosts文件并添加公钥ssh-keygen
- 完成后,从telnet切换到ssh。无论如何,ssh更安全
bash
还是sh
还是/
。这可能是因为你使用了#!/bin/sh
关于#!/bin/bash
。试着用-x
键运行它。时间的内容是什么?conv.awk?@Draco Alter我用/bin/bash而不是/bin/sh来试过,结果是一样的。@bmk#!/usr/bin/awk-f/[0-9]+:[0-9]+:[0-9]+/{if($2~/一月/)$2=2;else($2~/Feb/)$2;else($3/$2/$4)$2=4;else-if($2~/May/)$2=5;else-if($2~/Jun/)$2=6;else-if($2~/Jul/)$2=7;else-if($2~/Aug/)$2=8;else-if($2~/Sep/)$2=9;else-if($2~/Oct/)$2=10;else-if($2~/Nov/)$2=11;else-if($2~/Dec/)$2=12;打印$5“-$2-“$2-”“$3”“$4}”使用bash-x
运行它怎么样?它应该打印一些调试信息。