2011-01-07 93 views
6

我有一個ssh_exec()拒絕執行「cd」命令的問題。ssh2_exec()不會改變目錄與「cd」

如果我直接登錄到服務器並執行命令,它工作正常,所以我認爲問題不在我的命令。

我的代碼如下:

$str = ssh2_exec($sshStream, 'cp /var/www/compressed.tar.gz /var/www/vhosts/demo-domain1.com/httpdocs/'); 
$errstr = ssh2_fetch_stream($str, SSH2_STREAM_STDERR); 
stream_set_blocking($str, true); 
stream_set_blocking($errstr, true); 
echo "Output: " . stream_get_contents($str); 
echo "Error: " . stream_get_contents($errstr); 

$str = ssh2_exec($sshStream, 'cd /var/www/vhosts/demo-domain1.com/httpdocs/'); 
$errstr = ssh2_fetch_stream($str, SSH2_STREAM_STDERR); 
stream_set_blocking($str, true); 
stream_set_blocking($errstr, true); 
echo "Output: " . stream_get_contents($str); 
echo "Error: " . stream_get_contents($errstr); 

$str = ssh2_exec($sshStream, 'tar xzf c-class.tar.gz'); 
$errstr = ssh2_fetch_stream($str, SSH2_STREAM_STDERR); 
stream_set_blocking($str, true); 
stream_set_blocking($errstr, true); 
echo "Output: " . stream_get_contents($str); 
echo "Error: " . stream_get_contents($errstr); 

我以root身份登錄。

第一個命令正確運行並將文件複製到該位置。第二個命令不執行,但不輸出錯誤。第三個命令顯示一個錯誤(很明顯,因爲前面的cd命令不起作用)。

我知道它沒有改變目錄,因爲當我執行「pwd」時,它返回說它仍然在根目錄中。

如前所述,如果我從shell運行命令,它們執行得很好,所以我99.9%確定我的語法是正確的。

這是由1 & 1提供的專用服務器,運行CentOS的和Plesk 9.

+0

當您更改命令`CD會發生什麼/ var/www/vhosts/demo-domain1.com/httpdocs/||回聲「光盤失敗」`? – 2011-01-07 16:42:04

回答

14

要執行ssh2_exec() PHP開始將執行在遠程服務器上執行的ssh的處理。

遠程創建的shell進程有其自己的環境,包括當前的工作目錄。
cd命令將更改由第二個命令啓動的shell的工作目錄。

當第二個命令結束時,shell會隨之死亡。隨着工作目錄信息。

在其它方面,命令Ñ殼環境不會命令n + 1個的執行期間被記住。

如果你想在shell命令,同時視對方在環境方面的合作,你應該把一些命令在一個獨特的ssh2_exec

$str = ssh2_exec($sshStream, 'cd /var/www/vhosts/demo-domain1.com/httpdocs/;' 
          . 'tar xzf c-class.tar.gz'); 

$errstr = ssh2_fetch_stream($str, SSH2_STREAM_STDERR); 
stream_set_blocking($str, true); 
stream_set_blocking($errstr, true); 
echo "Output: " . stream_get_contents($str); 
echo "Error: " . stream_get_contents($errstr); 
+0

Thanks ring0 完美的作品:) – 2011-01-21 17:05:57