1

我一直在两个 Ubuntu VM 之间使用 PHP 的 ssh_connect() 和多个 ssh_exec() 没有任何问题。但是,现在我需要通过OpenSSH/Cygwin从Ubuntu Server调用多个ssh_exec()到Windows机器。以下代码中 ssh2_exec() 的结果第一次打印位于 /var/www 的文件数组,但第二次或更多次返回空数组。

如果我在第二个 ssh_exec() 之前使用 ssh2_connect ,它会再次返回一个文件数组。我什至尝试使用 phpseclib 但遇到了同样的问题。此外,我需要执行其他命令,如 Git,因此 opendir() 或 readdir() 等 PHP 函数不足以解决此问题。

<?php
$host = "10.xx.x.xx"; 
$username = "sagunms"; 
$password = "password"; 

$conn = ssh2_connect($host, 22);
if (ssh2_auth_password($conn, $username, $password) === false) {
    throw new Exception('Login is invalid');
}

//First time execution - returns array of files successfully
$stream = ssh2_exec($conn, 'cd /var/www && ls'); 
stream_set_blocking($stream, true);
$cmdOutput = fread($stream, 4096);
fclose($stream); 
$result = explode("\n", $cmdOutput); // Convert string to array
print_r($result);                   // Print array

echo "<hr/>";

//Second time execution - returns an "empty array" but no errors seen
$stream = ssh2_exec($conn, 'cd /var/www && ls'); 
stream_set_blocking($stream, true);
$cmdOutput = fread($stream, 4096);
fclose($stream); 
$result = explode("\n", $cmdOutput); // Convert string to array
print_r($result); // Print array
?>

Cygwin OpenSSH 中是否存在导致此问题的内容?谢谢。

4

3 回答 3

2

Cygwin OpenSSH 有这个特殊的问题,即使我也没有解决方案。我建议您每次在 ssh2_exec() 之前创建一个条件语句 if(isWindows) then ssh_connect() else, ssh2_exec() 使用相同的 $conn 资源变量。

于 2013-06-07T03:59:19.147 回答
1

尽管如此,这是一个老问题,因为没有发布的解决方案。问题在于 cygwin 附带的 openssh 服务器。使用另一个 php 库(如 phpseclib)时,您将面临同样的问题。我遇到了同样的问题,这是供将来参考的解决方案。问题的原因是,在基于 Windows 的系统中,setuid 在执行新命令之前被调用。对于第一个命令,它最初是设置的,所以没有问题。然而,随后的调用会导致尝试重新分配它并且失败并且 openssh 将无法做到这一点。这已经在 ssh-host-config 脚本中进行了解释-

*** Info: You appear to be running Windows XP 64bit, Windows 2003 Server,
*** Info: or later.  On these systems, it's not possible to use the LocalSystem
*** Info: account for services that can change the user id without an
*** Info: explicit password (such as passwordless logins [e.g. public key
*** Info: authentication] via sshd).

*** Info: If you want to enable that functionality, it's required to create
*** Info: a new account with special privileges (unless a similar account
*** Info: already exists). This account is then used to run these special
*** Info: servers.

为了解决它,您需要创建脚本尝试创建的特权用户帐户,并确保在脚本末尾显示 -

*** Info: The sshd service has been installed under the 'cyg_server'
*** Info: account.  To start the service now, call `net start sshd' or
*** Info: `cygrunsrv -S sshd'.  Otherwise, it will start automatically
*** Info: after the next reboot.

任何表明该帐户未找到且默认为“SYSTEM”帐户的消息都将导致该问题。在这种情况下,请确保 passwd 文件是最新的并包含新用户。

当您启动 Windows 服务管理器并检查 CYGWIN sshd 服务的属性时,在登录选项卡下它需要说它正在使用新创建的特权帐户而不是本地帐户。

还要验证在组策略编辑器 -> 安全设置 -> 本地策略 -> 用户权限分配下,新用户帐户需要具有创建令牌对象并充当操作系统一部分的权限。

于 2015-02-01T14:21:55.700 回答
1

这似乎是 Cygwin 特定的问题。我遇到了同样的问题,后来决定使用适用于 Windows 的 Bitvise SSH 服务器,而不是使用带有 OpenSSH 的 Cygwin。这消除了您现在被迫执行的每个命令之前重新连接到 SSH 的需要。

于 2013-07-04T18:08:18.960 回答