關於 PHP, Linux, Open Source 及個人生活記載的網誌。
RSS icon
  • PHP 透過 Sudo 執行 root 指令

    Posted on January 24th, 2007 Sam Tang 5 comments

    一直以來要用 PHP 以 root 身份執行系統管理工作的問題,就是 PHP 會以 apache 的身份執行,解決方法有安裝 suPHP 或 super 這類工具,但個人認為還是 Sudo 較為安全。首先要安裝 Sudo,據我所知 RHEL, Ubuntu 已經內置,Debian 只要用 apt-get 安裝就可以,以下是 FreeBSD 的安裝方法:

    FreeBSD 安裝 Sudo
    # cd /usr/ports/security/sudo
    # make && make install

    當系統有 Sudo 後,基於安全理由,不要直接編輯組態檔 /etc/sudoers,改用 visudo 來做編輯。visudo 為防止多個使用者同時修改,它會先鎖住 /etc/sudoers,並且確保組態檔的文法正確,一旦發現錯誤會拒絕儲存動作。

    假如你的 Apache 的執行身份為 apache,而想透過 PHP 重新啟動 DNS server,用 root 輸入指令 visudo,便會用 vi 開啟 /etc/sudoers,在檔案最底加上以下一行:

    apache ALL=NOPASSWD:/etc/rc.d/init.d/named

    儲存後可以在 PHP 以 root 身份執行 /etc/rc.d/init.d/named,包括開啟、停止及重新啟動:

    PHP:
    1. <?php
    2. // 開啟 named
    3. $output = shell_exec("/usr/bin/sudo /etc/rc.d/init.d/named start");
    4. echo $output;
    5. ?>

    上面的 /usr/bin/sudo 是 sudo 的可執行檔,需要根據自己的安裝目錄進行修改。以上只是個簡單的例子,你可以根據你的需要執行其他管理動作,但如果 web server 是多人共用,那麼在使用 Sudo 時要加倍小心。


     

    5 responses to “PHP 透過 Sudo 執行 root 指令”

    1. 版主提供的內容都很有深度,除了這篇以外”讓 crontab 自動排程執行 php”
      也是我想要解決php轉檔的其中一個方法,不過我還是選擇了這篇的做法。
      感謝版主的分享^_^

    2. 引用啦

      By SIKO

    3. 我是用CENTOS 5的, 正好需要用web interface 給不懂CLI 的同事處理日常系統維護, 看到你這篇教學, 就按你的方法去做. 但發現不成功, 而在 httpd 的error log會出現以下error:

      sudo: sorry, you must have a tty to run sudo

      我在網上找到解決方法, 就是在visudo 內, 找出下面這行:

      Defaults requiretty

      注解掉再執行就成功了. 希望其他遇到相同問題的人可以作為參考.

    4. 我的系统是fedora9,用上面方法都不行,原来罪魁祸首是selinux,必须把selinux的策略改了或关了SELinux才行。

    5. 請問,如果是要讓test這個使用者,使用sudo這個指令都不用在輸入密碼是不是
      在最後面加入
      test ALL=(ALL) ALL
      就可以了呢??

    Leave a reply

    *
    To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
    Click to hear an audio file of the anti-spam word