如何在 php 中重新設定網路 [論壇 - Ubuntu 程式設計]


正在瀏覽:   1 名遊客


 到底部   前一個主題   下一個主題  [無發表權] 請登錄或者註冊



如何在 php 中重新設定網路
會員一級
註冊日期:
2013/9/12 9:18
所屬群組:
已註冊使用者
等級: 3
HP : 0 / 57
MP : 7 / 1005
EXP: 31
離線
請教各位先進,如何在 php 中執行命令,讓系統的網路重新啟動?

在 command line 可以下 /etc/init.d/networking restart,但這需要 sudo 或 root 才能執行,那在 php 中有辦法做到嗎?

我想做一個一個網頁,類似 IP 分享器的設定,可以在網頁上設定 dhcp/static ip,所以需要設定完後重新啟動網路,或是重開機也行

煩請各位解惑,謝謝

2015/3/2 23:20
應用擴展 工具箱
回覆: 如何在 php 中重新設定網路
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 34
HP : 169 / 845
MP : 571 / 18143
EXP: 82
離線
seeing350 寫到:
請教各位先進,如何在 php 中執行命令,讓系統的網路重新啟動?

在 command line 可以下 /etc/init.d/networking restart,但這需要 sudo 或 root 才能執行,那在 php 中有辦法做到嗎?

我想做一個一個網頁,類似 IP 分享器的設定,可以在網頁上設定 dhcp/static ip,所以需要設定完後重新啟動網路,或是重開機也行

煩請各位解惑,謝謝



我目前最先想到是利用「php呼叫外部指令」下手,也許還有其他的解法。

先指引你去找參考資料,基本上以下的,我都還沒試過


* System program execution
* PHP system()、exec()、shell_exec() 的 差異

剛好最近有研究sudo,所以有查到一些資料。

* ubuntu 直接利用 script 執行 sudo 命令
* Ubuntu 如何修復改錯的 /etc/sudoers 檔案 (也許可以改採用pkexec這個指令)

你有試出什麼心得,還請不吝分享。


2015/3/3 0:11
應用擴展 工具箱
回覆: 如何在 php 中重新設定網路
會員一級
註冊日期:
2013/9/12 9:18
所屬群組:
已註冊使用者
等級: 3
HP : 0 / 57
MP : 7 / 1005
EXP: 31
離線
您好,
我目前先在本機測試,寫了一個 script test.sh,內容如下:

#!/bin/bash
/etc/init.d/networking restart

更改檔案權限為(利用 chmod u+s,a+x)
-rwsr-xr-x 1 root root test.sh

執行 ./test.sh,結果顯示權限不足(更改權限後這支程式在執行時應該會以 root 身份執行才是),只有用 sudo ./test.sh 才會正確

另一個問題是,在 php 中執行外部指令,這時候的擁有者跟 sudo 的 user 是不同的,所以應該也無法用 sudo 指令吧?

謝謝您

2015/3/3 8:34
應用擴展 工具箱
回覆: 如何在 php 中重新設定網路
會員一級
註冊日期:
2015/3/1 22:52
所屬群組:
已註冊使用者
等級: 2
HP : 0 / 43
MP : 5 / 572
EXP: 74
離線
用echo配和sudo -S即可

echo '<Your_Password>' | sudo -S ./test.sh

2015/3/3 12:51
應用擴展 工具箱
回覆: 如何在 php 中重新設定網路
會員四級
註冊日期:
2010/8/12 15:54
所屬群組:
已註冊使用者
等級: 18
HP : 0 / 443
MP : 135 / 11703
EXP: 72
離線
1. 先確定你的web daemon 是用哪個user 跑,先假設是apache
2. 修改 /etc/sudoers ,新增一行
apache ALL=NOPASSWD:/etc/init.d/networking
(允許 apache 這個帳號用 sudo 以root權限執行 /etc/init.d/networking)
3. 在php裡利用shell_exe 去執行 sudo /etc/init.d/networking stop|start|restart

註:
1. 只開單一指令的權限比較安全
2. NOPASSWD 不要求打密碼 = 不用在任何檔案中寫入密碼

2015/3/3 13:45
應用擴展 工具箱
回覆: 如何在 php 中重新設定網路
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 34
HP : 169 / 845
MP : 571 / 18143
EXP: 82
離線
seeing350 寫到:
您好,
我目前先在本機測試,寫了一個 script test.sh,內容如下:

#!/bin/bash
/etc/init.d/networking restart

更改檔案權限為(利用 chmod u+s,a+x)
-rwsr-xr-x 1 root root test.sh

執行 ./test.sh,結果顯示權限不足(更改權限後這支程式在執行時應該會以 root 身份執行才是),只有用 sudo ./test.sh 才會正確

另一個問題是,在 php 中執行外部指令,這時候的擁有者跟 sudo 的 user 是不同的,所以應該也無法用 sudo 指令吧?

謝謝您


hjc007 寫到:
用echo配和sudo -S即可

echo '<Your_Password>' | sudo -S ./test.sh



acman 寫到:
1. 先確定你的web daemon 是用哪個user 跑,先假設是apache
2. 修改 /etc/sudoers ,新增一行
apache ALL=NOPASSWD:/etc/init.d/networking
(允許 apache 這個帳號用 sudo 以root權限執行 /etc/init.d/networking)
3. 在php裡利用shell_exe 去執行 sudo /etc/init.d/networking stop|start|restart

註:
1. 只開單一指令的權限比較安全
2. NOPASSWD 不要求打密碼 = 不用在任何檔案中寫入密碼



關於apache執行時候的「使用者」和「群組」的概念,可以參考我「索引」中提到的討論。

* 回覆: 如何使用home 來架站 (1)(2)

* 回覆: [分享]快速安裝及設定 owncloud 7.0.4 (1) (2)

關於要讓某個「帳號」,可以執行sudo,可以參考我最近「查詢的資料」。

* Linux 使用者群組設定、透過group來給sudo權限(比改sudoer方便!)]

我目前看到的設定方式有兩種
一種是直接編輯「/etc/sudoers」,<-- 這個就是「acman」提到的方式
一種是將使用者加入sudo這個群組。

提供以上指引,讓你再去研究一些觀念,然後湊成你要達到的效果



另外關於這個「更改權限後這支程式在執行時應該會以 root 身份執行才是」
你可以再琢磨一下觀念,可以再多去了解一下關於「執行程序,是用什麼使用者來執行的」,真的是依據「檔案的權限」嗎?
這個你可以再去深究摟

seeing350 寫到:
您好,
我目前先在本機測試,寫了一個 script test.sh,內容如下:

#!/bin/bash
/etc/init.d/networking restart

更改檔案權限為(利用 chmod u+s,a+x)
-rwsr-xr-x 1 root root test.sh

執行 ./test.sh,結果顯示權限不足(更改權限後這支程式在執行時應該會以 root 身份執行才是),只有用 sudo ./test.sh 才會正確



## 更多參考

* 鳥哥的私房菜 / 第十七章、程序管理與 SELinux 初探

2015/3/3 14:31
應用擴展 工具箱
回覆: 如何在 php 中重新設定網路
會員四級
註冊日期:
2010/8/12 15:54
所屬群組:
已註冊使用者
等級: 18
HP : 0 / 443
MP : 135 / 11703
EXP: 72
離線
恕節錄

samwhelp 寫到:

關於要讓某個「帳號」,可以執行sudo,可以參考我最近「查詢的資料」。

* Linux 使用者群組設定、透過group來給sudo權限(比改sudoer方便!)]

我目前看到的設定方式有兩種
一種是直接編輯「/etc/sudoers」,
一種是將使用者加入sudo這個群組。

提供以上指引,讓你再去研究一些觀念,然後湊成你要達到的效果



加入sudo這個群組,表示該帳號可以使用 sudo
在預設設定裡,sudo 這個群組可以利用 sudo 執行所有指令
而 sudo 是可以精細設定到只開放特定指令的

所以編輯 /etc/sudoers 和把帳號加入sudo 群組,兩者並不完全相同

如果在多使用者環境或是樓主提的透過web執行特定指令
還是設一下開放範圍,僅允許必須的指令比較穩妥

2015/3/3 15:00
應用擴展 工具箱
回覆: 如何在 php 中重新設定網路
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 34
HP : 169 / 845
MP : 571 / 18143
EXP: 82
離線
acman 寫到:
恕節錄

samwhelp 寫到:

關於要讓某個「帳號」,可以執行sudo,可以參考我最近「查詢的資料」。

* Linux 使用者群組設定、透過group來給sudo權限(比改sudoer方便!)]

我目前看到的設定方式有兩種
一種是直接編輯「/etc/sudoers」,
一種是將使用者加入sudo這個群組。

提供以上指引,讓你再去研究一些觀念,然後湊成你要達到的效果



加入sudo這個群組,表示該帳號可以使用 sudo
在預設設定裡,sudo 這個群組可以利用 sudo 執行所有指令
而 sudo 是可以精細設定到只開放特定指令的

所以編輯 /etc/sudoers 和把帳號加入sudo 群組,兩者並不完全相同

如果在多使用者環境或是樓主提的透過web執行特定指令
還是設一下開放範圍,僅允許必須的指令比較穩妥


了解。

釐清一下,
我原意只是提供我知道的可以設定的方式,並沒有做任何推薦。
關於sudo,我還沒研究到透徹,歹勢,希望不要誤導了。
要用哪種方式,要自己斟酌喔,仔細研究什麼方式比較適合,還有安全性的考量。

例如

幾個考量點

* 「把密碼寫在script」,還是「acman」提到的「apache ALL=NOPASSWD:/etc/init.d/networking」。
* 還有acman上面說的,加入sudo群組,還是直接設定「/etc/sudoers」僅允許必須的指令。


2015/3/3 15:10
應用擴展 工具箱
回覆: 如何在 php 中重新設定網路
會員一級
註冊日期:
2013/9/12 9:18
所屬群組:
已註冊使用者
等級: 3
HP : 0 / 57
MP : 7 / 1005
EXP: 31
離線
感謝大家的協助!

根據各位高手的意見,我做了以下測試:

server 是 Raspbian(Debian wheezy) + Nginx
1. 在 php 中輸出 <?php echo exec('whoami'); ?>,發現 nginx 的user 是 www-data

2. 在 /etc/sudoers 中加入
www-data ALL=NOPASSWD:/etc/init.d/networking

3. 編輯 php,內容為
<?php exec("sudo /etc/init.d/networking restart"); ?>

指令確實有執行,但會出現以下的錯誤

smsc95xx 1-1.1:1.0 eth0: hardware isn't capable of remote wakeup
smsc95xx 1-1.1:1.0 eth0: hardware isn't capable of remote wakeup
smsc95xx 1-1.1:1.0 eth0: link up, 100Mbps, full-duplex, lpa 0xCDE1

目前推測可能是樹莓派的關係造成的,所以指令無法執行成功

等這個問題處理完再根據各位高手的意見來好好研究,感謝大家的協助!

2015/3/3 15:54
應用擴展 工具箱


 [無發表權] 請登錄或者註冊


可以查看帖子.
不可發帖.
不可回覆.
不可編輯自己的帖子.
不可刪除自己的帖子.
不可發起投票調查.
不可在投票調查中投票.
不可上傳附件.
不可不經審核直接發帖.