2011-01-07 109 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