Ubuntu 18.04下Cron任务执行脚本的认证及路径异常问题
从你的配置和日志信息来看,问题集中在Cron环境变量缺失和sudo无交互认证失败两个关键点上,咱们一步步来修复:
1. 解决date/grep命令找不到的报错
你在crontab里定义的PATH漏掉了/bin目录——而date、grep这类基础系统命令正是存放在/bin里的。手动运行脚本时,你的用户环境PATH包含这个目录,但Cron的执行环境是极简的,所以会触发"command not found"错误。
修复方案:
修改crontab中的PATH配置,添加/bin:
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/home/rob/scripts
或者更稳妥的方式:直接在脚本里使用命令的绝对路径,比如/bin/date、/bin/grep,彻底摆脱对PATH的依赖。
2. 解决sudo: no tty present and no askpass program specified错误
Cron运行脚本时处于无终端(tty)的非交互式环境,而sudo默认需要交互式输入密码,因此会出现认证失败的问题。有两种常用解决思路:
方法一:让脚本中的sudo命令免密码验证
使用visudo编辑sudoers配置文件(必须用这个命令,避免语法错误导致sudo失效):
sudo visudo
在文件末尾添加一行(替换成你脚本中需要sudo执行的具体命令,比如脚本里是sudo /usr/bin/xxx,就写对应路径):
rob ALL=(ALL) NOPASSWD: /path/to/your/sudo/command
如果脚本中有多个sudo命令,要么逐个添加路径,要么(仅限完全信任的用户)允许该用户所有sudo操作免密:
rob ALL=(ALL) NOPASSWD: ALL
保存退出后,Cron再执行脚本时sudo就不会要求输入密码了。
方法二:避免在Cron脚本中使用sudo
如果脚本的操作不需要root权限,调整目标文件/目录的权限,让普通用户rob能直接执行:
sudo chown rob:rob /path/to/target/file sudo chmod u+rwx /path/to/target/file
验证修复效果
修改完成后,重新加载crontab配置:
crontab -e # 保存退出后,Cron会自动加载新配置
等待一分钟(你的scan2.sh是每分钟执行一次),查看/home/rob/scripts/scan.log,之前的错误应该就不会再出现了。
内容的提问来源于stack exchange,提问作者Rob Berry

