Windows Server上的Laravel SSH

Dan*_*son 6 ssh openssh laravel

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

我在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;
});
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

unpack(): Type N: not enough input, need 4, have 1
Run Code Online (Sandbox Code Playgroud)

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

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

bog*_*ogl 5

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


Zam*_*ara 2

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

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

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

$length = current(unpack('N', fread($this->fsock, 4)));
Run Code Online (Sandbox Code Playgroud)

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