2012-01-12 97 views
1

我需要在我的本地Web服務器上允許PHP腳本,以SSH連接到另一臺計算機,以便在某些文件上執行指定的任務。我的httpd以低權限運行爲_www,因此設置直接無密碼SSH很困難,不要說不明智。允許PHP腳本ssh使用sudo

現在我做的方法是讓一個最小的PHP腳本,sudo-exec的(就像我)一個shell腳本在文檔根之外。 shell腳本依次調用(和我一樣)執行SSH實際工作的PHP代碼,並打印它的輸出。這是代碼。

read_remote_files.php(我是從我的瀏覽器調用腳本):

exec('sudo -u me -n /home/me/run_php.sh /path/to/my_prog.php', $results); 
print $results; 

/home/me/run_php.sh(運行作爲我,稱不管它給):

php $1 2>&1 

sudoers

_www ALL = (me) NOPASSWD: /home/me/run_php.sh 

這一切都有效,因爲my_prog.php被稱爲我並且可以和我一樣SSH。看起來它不是太不安全,因爲run_php.sh不能直接從瀏覽器(文檔根外)調用。我遇到的問題是my_prog.php未被稱爲HTTP程序,因此無法訪問HTTP環境變量(DOCUMENT_ROOT等)。

兩個問題:

  1. 上午我做這個太複雜了?
  2. 是否有一個簡單的方法讓我的最終腳本獲取HTTP變量?

謝謝! Andy

+0

如果你的服務器配置從不/很少改變,那麼就硬編碼所需的值到您的遠程腳本,否則你會試圖在腳本中重新創建一個Apache運行時環境。 – 2012-01-12 21:44:03

+1

使用php和ssh我這種方式非常不正統,請問你爲什麼試圖以這種方式提供文件?爲什麼不使用網絡文件系統而不使用SSH或Web代理/防火牆而不使用PHP? – 2012-01-12 21:46:20

+0

大衛,是的,這絕對是非正統的!我有很多服務器運行不同的任務,我需要ssh的靈活性來檢查運行的進程。我通過ssh(直接或通過Windows機器上的Cygwin)管理所有內容。我正在使用php爲一些日常任務提供Web界面。 – 2012-01-12 22:02:24

回答

0

「我需要在我的本地Web服務器上允許PHP腳本,以SSH連接到另一臺計算機,以便在某些文件上執行指定的任務。」

我認爲你是在你已經在往返於工作,而不是要求難度解決方案方面措辭這一點。當然你應該說的是「我想從機器A上的Apache下運行的PHP腳本調用機器B上的任務。」然後研究解決這個問題的方法 - 有許多方法可以從簡單的「自己動手」的RPC通過HTTP(S)隧道傳輸到使用XMLRPC或SOA框架。

兩個注意事項:

  • 做一個phpinfo()函數;在兩臺機器上,以檢查哪些擴展可用,
  • 另外,請檢查您的php.ini的設置,以確保您的服務提供商沒有禁用,您希望使用任何功能(或做問答& d腳本echo 'disable_functions = ' . ini_get('disable_functions') . "\n"; ...)

如果您瀏覽這裏和更廣泛的互聯網,你會發現許多例子。Here是,我使用了類似的目的。

+0

是的,我很擔心讓我選擇的解決方案實施,我忽視重新檢查問題。我會進一步閱讀。謝謝! – 2012-01-13 02:05:54

2

許多系統使用經常檢查文件,數據庫記錄或某種其他資源的存在的(特權)cron作業來做類似的工作,然後執行操作(如果有)。

這樣做的一個巨大優勢就是PHP腳本和特權腳本之間沒有直接的交互。 PHP腳本將指令留在資源中,特權腳本將其提取。只要指令不會導致系統受到損害或損壞,它肯定比sudoing更安全。

缺點是你無法隨時隨地推送更改;你必須等到cron作業再次運行。但也許這是一個選擇嗎?

+0

謝謝Pekka,這是斷開的又一步驟,比我已經採取了。 PS:我閱讀並享受您的流行CSS文章。 – 2012-01-13 02:08:36

相關問題