1. 程式人生 > >crontab不能執行sudo:抱歉,您必須擁有一個終端來執行 sudo

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

註釋掉這兩個就好了。