Laravel Windows 服务器上的 SSH

Laravel SSH on Windows Server

我有一个 Laravel 4.2 项目托管在一台服务器上(服务器 A),我需要能够从此应用程序上传文件并传输文件到同一本地网络上的 Windows 服务器(服务器 B)。

我已经在Windows服务器上安装了OpenSSH并启动了服务。我可以确认这是有效的,因为我可以在服务器 A.

上的终端中成功连接

在 Laravel 项目中,我在 app/config/remote.php 文件中创建了连接。

但是当我尝试使用以下代码 运行 服务器 A 上的 Laravel 项目中的命令时:

SSH::into('ServerB')->run(['IF EXIST folder (echo YES) ELSE (echo NO)'], function($line){
    echo $line.PHP_EOL;
});

我收到以下错误:

unpack(): Type N: not enough input, need 4, have 1

我在服务器 B 上尝试 运行 的每个命令都收到此错误。奇怪的是,如果我尝试使用相同的代码但将其指向 Linux 服务器,则代码可以正常工作。这会让我相信 SSH 服务器可能在服务器 B 上设置不正确,但事实上我可以通过 SSH 连接到服务器 B 来自服务器 A 在终端 window 混淆了整个事情!

有人知道我收到的错误的含义吗?

好像是在"the warning appears when the input data is not correct"

时出现这种错误

这可能是由于 php.ini 中的设置所致,即 "magic_quotes_runtime works by adding backslashes in content read from external sources, like textfiles, effectively destroying binary input like an .mo-file, and also destroying configuration-settings read from the database..." cfr this post

这可能是 phpseclib 的问题。检查您是否安装了最新版本,如果可能请更新。

Laravel 4.2 的 SSH 是将解析为 Illuminate\Remote\RemoteManager 的 Facade。它的 into() 方法将 return Illuminate\Remote\Connection 实例然后使用封装 phpseclib 库的 SecLibGateway 实例。 SecLibGateway 将 return phpseclib 的 System_SSH_Agent 实例(参见 Laravel 4.2 安装中 vendor/phpseclib/phpseclib/phpseclib/System 目录中的 SSH_Agent.php。在 System_SSH_Agent 的构造函数中,第 248 行:

$this->fsock = fsockopen('unix://' . $address, 0, $errno, $errstr);

它打开到 unix:// 的套接字连接。 OP 说 SSH 在 Linux 服务器中有效,但在 Windows 服务器中无效。我相信这可能是罪魁祸首。很少调用 PHP 的 unpack() 函数,例如第 274 行:

$length = current(unpack('N', fread($this->fsock, 4)));

它调用类型为 N 的 unpack(),需要输入 4 个数字。 fsock 不知何故无效,导致出现错误消息。