
我有一個 php 腳本,例如 file.php,其中包含:
<?php
exec("ip netns exec vpn file2.php");
?>
如果我透過命令列以 root 身分執行 file.php,它就可以工作。但是,當我透過apache運行它時,www-data沒有使用ip netns exec的權限,但是,www-data可以使用ip netns清單。
我該如何 a) 讓 ip netns exec 由非 root 使用者執行,或授予 www-data 運行 ip net exec 內容的權限?
答案1
嘗試類似的東西
# ip netns exec vpn sudo -u www-data apache
作為根。
這樣 apache 將以非 root 使用者身分使用 netns 運行。如果您同時需要兩個命名空間,請啟動兩個實例,每個實例位於一個命名空間中。即時更改名稱空間似乎不起作用。
解釋:
目錄/var/run/netns
存放了所有的網路命名空間,當我們新增一個新的「abc」時,會在這個目錄中建立一個空檔案「abc」。每次我們在命名空間“abc”中執行程式“xyz”時,ip(1)
都會開啟並儲存 的檔案描述符/var/run/netns/abc
,然後呼叫unshare(2)
和setns(2)
。
那麼這兩個障礙就來了。一是檔案系統權限/var/run/netns/*
,二是特權系統呼叫的功能。