ssh2_exec()不会用“cd”更改目录

时间:2011-01-07 16:31:49

标签: php centos plesk

我遇到ssh_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命令不起作用)。

我知道它没有改变dirs,因为当我执行“pwd”时,它返回说它仍在根目录中。

如前所述,如果我从shell运行命令,它们执行正常,所以我99.9%确定我的语法是正确的。

这是1& 1提供的专用服务器,运行CentOS和Plesk 9。

1 个答案:

答案 0 :(得分:14)

执行ssh2_exec() PHP启动一个将在远程服务器上执行ssh的进程。

远程创建的shell进程有自己的环境,包括当前的工作目录 cd命令将更改由第二个命令启动的shell的工作目录。

当第二个命令结束时,shell就会死掉它。连同工作目录信息。

换句话说,在执行命令 n + 1 期间,将不会记住命令 n shell环境。

如果你希望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);