Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cron无法运行bash脚本_Bash_Cron_Telnet - Fatal编程技术网

Cron无法运行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

我有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调用时失败。具体来说,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
  • 但是,您的帐户被设置为将
    /bin/bash
    作为默认shell(这可能是在
    /etc/passwd
    中为您的帐户设置的,或者通过变量
    $shell
    设置的)
解决方案:

  • 更改系统的默认shell(取决于您的系统,而不是我的建议)
  • 使您的cronjobs使用Bash作为默认值:在crontab中设置
    SHELL=/bin/Bash
  • 将脚本的第1行更改为明确提到Bash:
    #!/bin/Bash
    (我的建议)

好的。疯狂猜测时间

您使用的是
.rhosts
文件吗?这样,当您使用telnet时,您不必输入密码。您不能在crontab脚本中输入密码

如果这是原因,你必须做三件事:

  • 找出crontab在哪个用户下运行
  • 对于该用户,运行
    ssh-keygen
    程序,并生成公钥和私钥。对远程计算机执行相同的操作。现在,在远程计算机上创建一个授权的_-hosts文件并添加公钥
  • 完成后,从telnet切换到ssh。无论如何,ssh更安全

是的,我用/usr/bin/telnet代替了telnet,它的行为也一样。这是一个简单的awk脚本,用于将日间服务器提供的时间格式转换为YY-mm-dd hh:mm:ss。在脚本的调试版本中,我将bash脚本中的每个调用分开,唯一失败的是telnet,它甚至没有输出错误(在这个场景中,我使用telnet$ADDR$DTPORT 2>&1 | tee/tmp/garbage.tmp调用它,从cron调用时,给定的文件为空,但从命令行调用时包含正常数据)是的,你也可以尝试该文件的绝对路径吗?是的,我有,还是一样。简而言之,我尝试用绝对文件名调用该脚本中的所有程序,结果是一样的。你如何运行它?它是
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
运行它怎么样?它应该打印一些调试信息。