为什么通过 Putty 的 SSH 命令与通过 PHP 的 phpseclib 命令的工作方式不同?

Why would SSH commands through Putty work differently to those via PHP's phpseclib?

我正在编写脚本以自动从我的 windows 开发 PC 部署到共享主机服务器。

我得到不同的结果,具体取决于我是通过 Putty 还是通过 PHP (在我的电脑上都 运行ning 执行命令).

在 putty 中,当我通过 SSH 登录服务器时,我可以 运行 命令如下:

cd /www/
ls -la    #outputs contents of /www

但是当我通过 PHP 使用 phpseclib 执行此操作时,如下所示,任何 cd 命令都被完全忽略:

<?php
require_once __DIR__.'/vendor/autoload.php';
use phpseclib\Net\SSH2;
$ssh = new SSH2('ssh.mydomain.com');
if (!$ssh->login('mydomain.com', 'mypassword')) {
    trigger_error("Login Failed", E_ERROR);
}
echo $ssh->exec('pwd');
$ssh->exec('cd /www/');
echo $ssh->exec('pwd'); // unchanged
echo $ssh->exec('ls -la'); // does NOT output contents of /www/
echo $ssh->exec('ls /www/ -la'); // DOES output contents of /www/

在上面指定一个绝对 URL 是一个可接受的解决方法。但是,下面是一个主要问题。

如果我上传一个文件,stuff.zip 到 /www/ 然后尝试提取它,以下通过 Putty 工作:

unzip /www/stuff.zip -d /www/

但如果我通过 PHP 尝试此操作:

echo $ssh->exec('unzip /www/stuff.zip -d /www/');

我收到错误:

unzip: cannot find or open /www/stuff.zip, /www/stuff.zip.zip or /www/stuff.zip.ZIP.

我已经试过了chmod 777 /www/stuff.zip,但没什么区别。

我怎么diagnose/fix这个问题?

From the documentation:

Successive calls to exec()

If done on an interactive shell, the output you'd receive for the first pwd would (depending on how your system is setup) be different than the output of the second pwd. The above code snippet, however, will yield two identical lines.

The reason for this is that any "state changes" you make to the one-time shell are gone once the exec() has been ran and the channel has been deleted.

我看到两个选项。选项 1:

试试 interactive shell examplesread()write() 函数,我觉得它们很难看。

选项 2:

将您的脚本编写为服务器上的 shell 脚本,并通过单个 $ssh->exec() 调用来调用该脚本。