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

Php ssh2_exec()不会用“更改目录”;cd";,php,centos,plesk,Php,Centos,Plesk,我在ssh\u 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_bl

我在
ssh\u 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”时,它返回说它仍然在根dir中

如前所述,如果我从shell运行命令,它们执行得很好,因此我99.9%确信我的语法是正确的

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

要执行
ssh2\u exec()
PHP启动一个进程,该进程将在远程服务器上执行
ssh

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

当第二个命令结束时,外壳将随之消亡。以及工作目录信息

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

如果希望shell命令在环境方面相互依赖的情况下工作,那么应该将多个命令放在一个唯一的
ssh2\u 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);

当您将命令更改为
cd/var/www/vhosts/demo-domain1.com/httpdocs/| | echo“cd failed”
时会发生什么情况?web上的其他答案非常混乱,这一个清楚地说明了为什么它不起作用。我不得不把我所有的命令放在一个ssh2_exec中,而不是放在多个ssh2_exec中,因为它们是相互遵循的。