php - ssh2_exec() 不会用 "cd"改变目录

标签 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 命令不起作用)。

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

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

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

最佳答案

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

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

当第二个命令结束时,shell 随之结束。连同工作目录信息。

换句话说,N命令的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);

关于php - ssh2_exec() 不会用 "cd"改变目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4627779/

相关文章:

mysql - Yii 代码生成器密码不起作用

mysql - 缺少 plesk-mysql-server.x86_64

php - 来自数据库jquery的字母表 Accordion

php - 如何使用构造函数测试 symfony 表单类型

python - Django centos 服务器没有收到请求

centos - 如何在 Plesk 11.5 上启用 CORS?

cron - 如何每 15 分钟在 Plesk 中设置一个 cron 任务?

php - IMG SRC inside PHP with more PHP inside 如何

php - 将未知大小的数组添加到数据库中

Hiveserver2 未启动 - 捕获异常 : ZooKeeper node/hiveserver2 is not ready yet