php關於shell指令碼許可權問題分析

來源:互聯網
上載者:User
1. sudo介紹

sudo允許root分配給普通使用者一些不具備的權利,讓普通使用者也可以具有root使用者的相關許可權(比如說sudo可以分配給某一使用者某些特定的命令執行許可權)。
其中sudo一個重要的檔案就是/etc/sudoers,哪些使用者具有什麼樣的命令可以執行都是靠這個檔案的,主要只有裡面分配了的使用者才能使用sudo。

sudo -l 列出該使用者能執行的命令  sudo -u user 以指定使用者來執行命令  sudo -k 清楚入場券上的時間,下次使用sudo還要輸入密碼  sudo -b 在後台執行命令

在終端裡面輸入 vim 即可開啟/etc/sudoers檔案。
找到的地方:

圖中紅色方框的內容是我自己後來加的,其中www是php啟動並執行使用者,不同的環境下預設名字會不一樣,我在 centos 下的為www。

查看php啟動並執行使用者可以通過下面這個php網頁擷取。

<?php       echo shell_exec("id -a");  ?>

看圖中每行都有三個ALL,第一個ALL代表網路中的主機,第二個括弧裡面的ALL代表目標使用者,表示以誰的身份去執行命令,最後一個ALL代表的是可執行檔命令名(可以指定你想要該使用者能夠執行的命令)。

其中NOPASSWD表示不用輸入密碼。(為了方便嘛,不然我通過瀏覽器訪問難道程式裡面多了道填寫密碼,還要等反饋,真是麻煩,這樣就省事多了)

若是Ubuntu則不用再修改了,若是fedora 等則還需要進行一些修改,

Defaults env_reset開啟就可以了(即前面的#號去掉);

  1. 檢查php.ini設定檔中是否開啟了安全模式

safe_mode =  off 這樣就可以了

php執行linux指令碼的函數有多個,shell_exec()、system()等,這裡也不多做介紹了,用就行了,我採用system()函數。
route.php

<?php  $ip=(string)$_POST["ip"];  system("su ./route.sh $ip",$status);  if($status == 'true')  {      echo "設定成功";  }  else  {      echo "設定失敗";  }  ?>

前面設定妥當後,執行後,瀏覽器會顯示設定成功,說明指令碼成功執行。

1.php執行shell實際是用的Apache或Nginx的使用者去執行的,php本身不建立使用者。
2.由轉載

由於以前在ECS中每次都是以root使用者身份登入和進行操作,所以基本都沒有用到sudo,但是最近項目需要要進行這麼個事:通過瀏覽器訪問php網頁,php網頁裡會調用執行linux下的一個指令碼。本來這個事很簡單的,但是我在實際操作的時候,發現每次通過瀏覽器訪問時,指令碼都沒有被執行,而我在終端裡面通過命令列執行php網頁確又是沒有任何問題的,當時就覺得很差異,後來仔細想了想,通過瀏覽器訪問和直接在終端裡執行其發起者不一樣,想想應該是使用者權限的問題,於是就上網查了查,結果就有了sudo這麼回事。
1. sudo介紹

sudo允許root分配給普通使用者一些不具備的權利,讓普通使用者也可以具有root使用者的相關許可權(比如說sudo可以分配給某一使用者某些特定的命令執行許可權)。
其中sudo一個重要的檔案就是/etc/sudoers,哪些使用者具有什麼樣的命令可以執行都是靠這個檔案的,主要只有裡面分配了的使用者才能使用sudo。

sudo -l 列出該使用者能執行的命令  sudo -u user 以指定使用者來執行命令  sudo -k 清楚入場券上的時間,下次使用sudo還要輸入密碼  sudo -b 在後台執行命令

在終端裡面輸入 vim 即可開啟/etc/sudoers檔案。
找到的地方:

圖中紅色方框的內容是我自己後來加的,其中www是php啟動並執行使用者,不同的環境下預設名字會不一樣,我在 centos 下的為www。

查看php啟動並執行使用者可以通過下面這個php網頁擷取。

<?php       echo shell_exec("id -a");  ?>

看圖中每行都有三個ALL,第一個ALL代表網路中的主機,第二個括弧裡面的ALL代表目標使用者,表示以誰的身份去執行命令,最後一個ALL代表的是可執行檔命令名(可以指定你想要該使用者能夠執行的命令)。

其中NOPASSWD表示不用輸入密碼。(為了方便嘛,不然我通過瀏覽器訪問難道程式裡面多了道填寫密碼,還要等反饋,真是麻煩,這樣就省事多了)

若是Ubuntu則不用再修改了,若是fedora 等則還需要進行一些修改,

Defaults env_reset開啟就可以了(即前面的#號去掉);

  1. 檢查php.ini設定檔中是否開啟了安全模式

safe_mode =  off 這樣就可以了

php執行linux指令碼的函數有多個,shell_exec()、system()等,這裡也不多做介紹了,用就行了,我採用system()函數。
route.php

<?php  $ip=(string)$_POST["ip"];  system("su ./route.sh $ip",$status);  if($status == 'true')  {      echo "設定成功";  }  else  {      echo "設定失敗";  }  ?>

前面設定妥當後,執行後,瀏覽器會顯示設定成功,說明指令碼成功執行。

  1. php執行shell實際是用的Apache或Nginx的使用者去執行的,php本身不建立使用者。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.