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

mutmk8jj  于 2022-11-07  发布在  其他
关注(0)|答案(1)|浏览(199)

我遇到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。

watbbzwu

watbbzwu1#

为了执行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);

相关问题