crontab不能执行sudo:抱歉,您必须拥有一个终端来执行 sudo
最近做一个可执行shell调度的需求,要求用户输入shell,然后后台定时调度运行。实现大致为:保存用户的输入,设定时间,crontab定时执行用户的输入。但这里涉及到一个安全问题,如何确定用户的输入是安全的?
最初的想法是过滤危险命令,比如rm -rf /
之类的。后来,索性把用户的命令丢到一个特殊文件内,以一个权限很小的用户去执行用户命令就好了。
于是写好的脚本大致如下
sudo runuser -l etl_shell -m -c "
function make_dir(){
local dir_name=\$1
if [ ! -d \$dir_name ];then
mkdir -p \$dir_name
else
echo dir \${dir_name} exist
fi
}
function touch_file(){
local file_name=\$1
if [ ! -f \$file_name ];then
touch \$file_name
else
echo file \${file_name} exist
fi
}
make_dir $script_temp;
touch_file ${script_file}
echo \"$tar_command\" > ${script_file};
chmod 700 ${script_file};
sh ${script_file};
"
手动执行没有问题,命令确实以另一个用户执行了。添加到定时任务crontab。结果发现运行失败,错误是:
udo:抱歉,您必须拥有一个终端来执行 sudo
不允许非终端执行sudo,那只能以root用户来做这件事。而我又没有root用户,只好修改这个规则,允许crontab 执行sudo
找到/etc/sudoers
#
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
# You have to run "ssh -t hostname sudo <cmd>".
#
#Defaults requiretty
#
# Refuse to run if unable to disable echo on the tty. This setting should also be
# changed in order to be able to use sudo without a tty. See requiretty above.
#
#Defaults !visiblepw
注释掉这两个就好了。
关注我的公众号

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了