我在两个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中有什么东西导致了这个问题吗?感谢。
答案 0 :(得分:2)
Cygwin OpenSSH有这个特殊的问题,即使我没有解决方案。我建议你创建一个条件语句,如果(isWindows)然后ssh_connect()每次在ssh2_exec()之后,ssh2_exec()使用相同的$ conn资源变量。
答案 1 :(得分:1)
这似乎是Cygwin的具体问题。我遇到了同样的问题,后来决定使用Bitvise SSH Server for Windows而不是Cygwin使用OpenSSH。这样就无需在每个命令之前重新连接到SSH,因为您现在必须这样做。
答案 2 :(得分:1)
尽管如此,这是一个老问题,因为没有发布解决方案。 问题在于cygwin附带的openssh服务器。使用像phpseclib这样的另一个php库会遇到同样的问题。 我遇到了同样的问题,这是未来参考的解决方案。 问题的原因是,在基于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服务的属性时,在登录选项卡下,它需要说它正在使用新创建的特权帐户而不是本地帐户。
同时在组策略编辑器中验证 - &gt;安全设置 - &gt;本地政策 - &gt;用户权限分配,新用户帐户需要具有创建令牌对象的权限,并作为操作系统的一部分。