crontab不能執行sudo:抱歉,您必須擁有一個終端來執行 sudo
阿新 • • 發佈:2018-12-18
最近做一個可執行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
註釋掉這兩個就好了。