2013-04-23 85 views
0

當我在命令行中運行以下命令:SCP命令行和PHP的exec()不能做同樣的事情

scp -i private.ppk -P 22 foo.txt [email protected]:/home/someuser/foo.txt 

,一切工作正常。將foo.txt傳送到遠程服務器沒有任何問題。我需要從PHP運行完全相同的命令。所以,我有以下代碼:

$command = 'scp -i private.ppk -P 22 foo.txt [email protected]:/home/someuser/foo.txt'; 
exec($command); 

這是行不通的。 PHP文件正在與private.ppk相同的目錄中執行。當我var_dumpexec的結果,我得到一個NULL

我想知道這是否是一個權限問題。我知道我在命令行上運行的是誰,但我不確定誰在運行腳本。這可能是問題嗎?或者是完全不同的東西?

+0

嘗試使用完整的路徑foo.txt的 – Rob 2013-04-23 02:40:30

+0

OK,我做到了。這絕對是一個問題。不過,我仍然得到相同的結果。沒有文件傳輸。 NULL是'exec'的結果。 – snoopy76 2013-04-23 02:48:35

+0

我的腳本是作爲'nobody'運行的。這會導致任何問題嗎? – snoopy76 2013-04-23 02:52:28

回答

1

我認爲這是一個權限問題。 SSH客戶端通常拒絕連接,除非權限已設置爲第三方(例如用戶「nobody」)無法讀取密鑰。

也就是說,您使用* .ppk(這是PuTTY鍵使用的擴展名) - OpenSSH不支持這一點有點奇怪。我的建議是使用phpseclib's SCP client。您可以在PHP文件本身中將鍵作爲字符串使用,而不必讓它們存在於文件系統中。更多信息:

https://github.com/phpseclib/phpseclib/blob/master/phpseclib/Net/SCP.php