能否使用PHP连接远程桌面?

8

我有几台服务器,想每隔一段时间连接它们运行程序。但是,为了方便起见,我想编写一个PHP脚本通过远程桌面连接到它们并分别运行它们。这可行吗?如果可以,从哪里开始?一个例子会很好。


你想使用RDP连接到服务器并运行PHP脚本吗?我建议使用VPN/SSH会话。 - Jared Farrish
4
最坏的情况下,你可以通过 PHP 打开一个套接字并进行双向通信。不过你需要反向工程/实现协议。但应该有更好的解决方案,比如在服务器上使用定时任务/调度程序。 - deceze
@deceze 是的,我考虑过直接打开一个套接字,但是暂时不想花时间嗅探连接并重建正常连接,以防有更简单的方法来完成它。 - Rob
Windows Server 2003和2008。我想通过一次点击就可以,但我确定有一种模拟的方法。 - Rob
我已经翻译了您的请求,意思是:一个类似RDP服务器的php代码。考虑到这一点,尽管他的回答没有回答您的问题,但我同意@Timur的观点。它可能并不像一些唱衰者所说的那么复杂。编写一个php脚本,捕获前台窗口(或其部分)并将图像发送到网页。使网页捕获鼠标单击坐标和按键,并通过ajax通过php传输到前台窗口。每隔一段时间重新捕获前台窗口,然后BAM-通过PHP进行远程桌面。我认为这是一个非常棒的想法。 - alfadog67
显示剩余3条评论
11个回答

9
理论上你可以实现一个能够使用RDP协议与服务器通信的PHP脚本,但我肯定不会尝试构建一个可以执行任何有意义操作的脚本,因为RDP是用来将远程计算机的用户界面暴露给连接的客户端的,而PHP首先是为了操作文本而构建的。
如果你想要一个PHP脚本来远程控制另一台计算机,那么SSH是一个更明智的选择,因为PHP可以轻松地连接到远程计算机的CLI,并通过shell命令向服务器发出命令,这些命令是文本化的,因此可以很容易地用PHP生成。
另一方面,使用RDP接口与远程计算机交互将非常困难。想想点击一个图标以获取目录列表。你首先必须确定鼠标指针的位置,所需的图标是否可见,如果可见,则其边界框相对于鼠标指针的位置在哪里。然后你需要发出命令将鼠标指针移动到边界框内部,然后检查鼠标指针是否在正确的位置(本地或其他远程用户可能正在移动鼠标),然后发出一对点击命令并在它们之间短暂延迟。
这比例如发出“cd C:\ Program Files \”然后是“dir”要困难得多。

3
进一步加剧难度的是,即使RDP协议被反向工程并且PHP脚本将鼠标移动到已知坐标...... RDP使用的显示设置可能是不一致的,因此不能保证每个会话中图标位于相同的位置。假设性的脚本可能最终只是将点击发送到屏幕上的无效区域。 - Farray

3

PHP无法使用RDP连接到服务器。它们可以使用SSH或FTP或套接字连接到一个监听端口。

你的要求有些疯狂哦!=)

编辑:

既然你坚持要这样做,那么你需要这样:

[MS-RDPBCGR]: Remote Desktop Protocol: Basic Connectivity and Graphics Remoting Specification
[MS-RDPCR2]: Remote Desktop Protocol: Composited Remoting V2 Specification
[MS-RDPEA]: Remote Desktop Protocol: Audio Output Virtual Channel Extension
[MS-RDPEAI]: Remote Desktop Protocol: Audio Input Redirection Virtual Channel Extension
[MS-RDPECLIP]: Remote Desktop Protocol: Clipboard Virtual Channel Extension
[MS-RDPEDC]: Remote Desktop Protocol: Desktop Composition Virtual Channel Extension
[MS-RDPEDYC]: Remote Desktop Protocol: Dynamic Channel Virtual Channel Extension
[MS-RDPEFS]: Remote Desktop Protocol: File System Virtual Channel Extension
[MS-RDPEGDI]: Remote Desktop Protocol: Graphics Device Interface (GDI) Acceleration Extensions
[MS-RDPELE]: Remote Desktop Protocol: Licensing Extension
[MS-RDPEMC]: Remote Desktop Protocol: Multiparty Virtual Channel Extension
[MS-RDPEPC]: Remote Desktop Protocol: Print Virtual Channel Extension
[MS-RDPEPNP]: Remote Desktop Protocol: Plug and Play Devices Virtual Channel Extension
[MS-RDPEPS]: Remote Desktop Protocol: Session Selection Extension
[MS-RDPERP]: Remote Desktop Protocol: Remote Programs Virtual Channel Extension
[MS-RDPESC]: Remote Desktop Protocol: Smart Card Virtual Channel Extension
[MS-RDPESP]: Remote Desktop Protocol: Serial and Parallel Port Virtual Channel Extension
[MS-RDPEUSB]: Remote Desktop Protocol: USB Devices Virtual Channel Extension
[MS-RDPEV]: Remote Desktop Protocol: Video Redirection Virtual Channel Extension
[MS-RDPEXPS]: Remote Desktop Protocol: XML Paper Specification (XPS) Print Virtual Channel Extension
[MS-RDPNSC]: Remote Desktop Protocol: NSCodec Extension
[MS-RDPRFX]: Remote Desktop Protocol: RemoteFX Codec Extension

你可以在这里找到所有相关文档:http://msdn.microsoft.com/en-us/library/cc216513(v=PROT.10).aspx
通过这些文档,你可以确定项目的可行性。

1
为什么这很疯狂?启用了RDP的服务器将会监听3389端口,所以我相信我可以通过套接字来模拟它... - Rob
2
RDP能够提供图形化界面,让你控制鼠标和键盘。编写一个可以实现你想要的功能的应用程序真的是有些疯狂,并且会有一定的困难,因为它不像连接到控制台那样直接运行命令。 - Timothy Martens
1
我的观点是模拟它将很困难...虽然可能是可行的。做任何有用的事情和做你想做的事情都是困难的^2。如果您在远程服务器上启用了SSH并编写了自己的PHP监听器,那么这将是一件轻而易举的事情。那就是我会做的! - Timothy Martens
我必须同意Timothy Martens的观点,虽然理论上可能是可行的,但尝试这样做是绝对疯狂的。SSH是一种更加明智的选择。 - GordonM

2
我正在使用。
rdesktop -u username -p password 192.168.1.131 -g 1024x640

在Linux中, 192.168.1.131是目标IP地址, 1024x640是窗口大小。
此外,您还可以使用


rdesktop -u username -p password 192.168.1.131 -f 

全屏显示。

别忘了用你的详细信息替换用户名和密码。


请与我分享您的PHP代码。还需要提供操作系统版本、Apache2版本和PHP版本。 - LOKESH

0

我认为最好的方式是让服务器运行一个可以连接的服务。例如,它们可以运行一个 Web 服务(例如 PHP,如果这是您想要的语言)。然后,您可以通过端口 80 连接到该 Web 地址,从而运行应用程序。当然,您需要考虑安全问题,但您应该能够配置它们,以便仅接受来自某些 IP 的请求。或者,您可以使脚本受密码保护。


这样做是可行的,但是我有很多台机器。在每台机器上设置httpd会很麻烦。 - Rob
您无需设置Web服务,只需创建一个在特定端口上侦听的PHP脚本即可。 - Timothy Martens

0

VMware ESXi使用这样的UI页面,但不使用PERL应用程序。阅读答案后,似乎是一个真正的挑战。我正在为我的基于Web的主机访问开发类似的东西。如果我完成了什么,我很乐意与您分享。

https://labs.vmware.com/flings/esxi-embedded-host-client


你有没有得到任何有用的东西? - undefined

0

人们不建议使用RDP来完成这项任务的原因是因为RDP没有API可以远程执行你实际想要的操作。最简单的方法是在主机上安装下面链接的软件之一,同时需要一个API来连接:

  • 这个:http://www.codeproject.com/KB/system/remoteexec.aspx。在PHP中,你只需要像这样简单的exec("rexec 123.21.61.12 notepad.exe "\fileserver1\test file.txt") (你可以修改它来接受一个密钥用于一点安全性)

  • TeamViewer(免费):http://www.teamviewer.com/en/products/remotecontrol.aspx 然后你可以使用TeamViewer WebConnect通过PHP连接

  • OpenVPN(开源),不确定是否附带API,但我不会感到惊讶

  • Log me in(与上述相同)

  • 在主机上安装WAMP,然后让PHP在主机上运行命令。所以它会像php对php那样,你的客户端会调用类似curl(127.0.0.1/?key=loooong&command=blah)这样的东西,服务器将运行exec("passed command")


-1
老实说,你最好的选择应该是C#。这可能不是你想听到的,但用这种语言制作一个rdp客户端非常简单。
如果你被允许创建一个具有访问日志权限的用户,那我建议你创建一个程序,当用户连接时运行该程序。该程序会将日志上传到具有FTP访问权限的Unix服务器上。
然后,即使你不能在C#中编写一键式解决方案,你至少可以手动登录,等待上传完成然后退出。

2
完美,用C#编写一个小程序,然后从PHP中调用它。听起来对我来说是个好主意。 - Timothy Martens
没有人说要用C#编写一些东西,然后从PHP中调用它。那是愚蠢的。试图在PHP中编写RDP客户端同样愚蠢,这就是为什么我建议使用C#的原因。我提出了一种替代和更好的方法来完成他想做的事情,但却被投票否决了。更有趣的是,我不得不解决与OP相同的问题。我用上面的答案解决了这个问题,所以我知道它确实可行。我编写了一个C#的RDP客户端,可以循环遍历主机列表,登录,执行命令,然后注销。 - William

-1
为什么不从cronjob运行perl脚本或使用反引号执行程序?

-1
如果你只是想连接到多台服务器并运行同一个程序,可以将一个 PHP 执行脚本上传到所有服务器上,该脚本应该使用输入数据(很可能来自于 $_POST 或者 $_GET)执行一个命令。然后编写一个本地脚本,将要运行程序的命令字符串发送到所有服务器上的 exec 脚本,这样键入命令以运行所需程序,将在每个服务器上执行该命令。
显然,你需要为 exec 脚本要求身份验证,以防止有人滥用你的服务器。当然,如果你要运行的程序需要进行大量交互,那么整个过程就不太适用了(你说过你想“运行”一个程序,这意味着你想执行它并让它自己去做事情)。

-1
为什么不使用FTP来满足您的需求?然后使用微软的简单命令生成和执行文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接