I’ve got a few servers that I’d like to connect to every so often to run a program. However, to make it easier, I’d like to make a PHP script connect to each of them via remote desktop and run each of them. Is this possible? If so, where should I start? An example would be lovely.
In theory you could implement a PHP script that could communicate with a server in the RDP protocol, but I certainly wouldn’t want to try to build a script that can do anything meaningful, as RDP is built to expose a remote machine’s user interface to the connected client and PHP is built first and foremost to manipulate text.
If you want a PHP script to remotely control another computer, then SSH is a far more sensible option, as PHP could easily connect to the remote cmputer’s CLI and issue commands to the server via shell commands, which are textual and therefore easily generated with PHP.
On the other hand, interfacing with the remote computer with RDP would be extremely difficult. Just think about clicking on an icon to get a directory listing for a start. You’d first have to determine where the mouse pointer is, whether the icon you want to click is visible and if so where its bounding box is relative to the mouse pointer. You’d then have to issue commands to move the mouse pointer to within the bounding box, then check that the mouse pointer is in the right place (a local or other remote user might be moving the mouse around) and then issue a pair of clicks with a short delay between them.
That’s going to be a lot harder than issuing “cd C:\Program Files\” followed by “dir”, for example.
No PHP cannot use RDP to connect to the server. They can use SSH or FTP or a socket to a listening port.
What you are asking is kinda crazy!!! =)
Since you insist on doing it here is what you need:
[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
You can find all those here: http://msdn.microsoft.com/en-us/library/cc216513(v=PROT.10).aspx
With this documentation you can determine the feasibilty of your project.
I am using
rdesktop -u username -p password 192.168.1.131 -g 1024x640
where 192.168.1.131 is the destination ip
and 1024×640 is the window size.
Also you can use
rdesktop -u username -p password 192.168.1.131 -f
for full screen.
Don’t forget to replace the username and password with your details.
I think it be best if the servers were running a service that you could connect to. For example they could be running a web service (e.g. php if that’s your desired language). You could then connect to that web address through port 80 which could run the applications. Of course you have security concerns, but you should be able to configure them so that they only accept requests from certain IPs. Alternatively you could make the script password-protected
The reason ppl are not recommending RDP to do this is because RDP has no API to do even remotely what you actually want.
The easiest way to do this while somehow staying within your requirements, is to install one of the software linked below on the host machines. Then you would need an API to connect:
This: http://www.codeproject.com/KB/system/remoteexec.aspx. In PHP all you would need is something as simple as exec(“rexec 184.108.40.206 notepad.exe “\fileserver1\test file.txt”) (you can modify it to accept a key for a bit of security)
TeamViewer (free): http://www.teamviewer.com/en/products/remotecontrol.aspx Then you would use TeamViewer WebConnect to connect to via PHP
OpenVPN (open source) Not sure if there is an API that comes with it but I wouldn’t be surprised
Log me in (same as above)
Install WAMP on the hosts and then have php run the commands on them. So it would be something like php to php where ur client would call something like curl(127.0.0.1/?key=loooong&command=blah) and the server would run exec(“passed command”)
vmware Esxi uses such a ui page but not with PERL application, After reading the answers it seems a real challenge. I’m working on such a thing for my web based hosts access. If I get something done, I’ll be happy to share with you.
Honestly, you’re best bet would be C#. This probably isn’t what you want to hear, but it’s extremely trivial to make an rdp client in that language.
If you’re allowed to create a user that has access to the logs. I’d make something that would run when the user is connected. The program would upload the logs to a unix server that has FTP access.
Then even if you can’t write a one click solution in C# you could at least just login manually wait for the upload to be done then log out.
Why not running a perl script from a cronjob or execute the programs with the backquotes?
If all you want to do is to connect to your many servers and run the same program, you could do a one-time upload of a php execute script to all your servers that should
exec() a command from input data (most likely from
$_GET). You then write a local script, which will send the command string to run your program to all the exec scripts on all your servers, so essentially typing the command to run whatever program you need will execute the command on every server.
Obviously you’ll need to require authentication for your exec script so nobody can abuse your servers. Of cause, this whole thing wouldn’t be suitable if the program you’re running requires much interaction (you did say you wanted to run a program, which implies you want to execute it and leave it to do it’s own thing)
Why not use FTP for what you need?
then generate and execute files with simple commands microsoft.
I think it would be better to set up daemon/service on server to which you want connect and communicate with it via TCP. In this case, you are free to implement any protocol you want.