Execute commands on remote machine via PHP
Run SSH commands through PHP on server A to server B.
Here is how to run ssh commands with the command line in linux: http://www.youtube.com/watch?NR=1&feature=fvwp&v=YLqqdQZHzsU
In order to run commands on linux with PHP use the exec() command.
I hope this will get you started looking in the right direction.
Look at these two posts for automating the password prompt
- https://serverfault.com/questions/241588/how-to-automate-ssh-login-with-password
- https://serverfault.com/questions/187036/execute-ssh-command-without-password
Here is a quick example with non-working code to get you thinking:
<?php $server = "serverB.example.org"; //ip address will work too i.e. 192.168.254.254 just make sure this is your public ip address not private as is the example //specify your username $username = "root"; //select port to use for SSH $port = "22"; //command that will be run on server B $command = "uptime"; //form full command with ssh and command, you will need to use links above for auto authentication help $cmd_string = "ssh -p ".$port." ".$username."@".$server." ".$command; //this will run the above command on server A (localhost of the php file) exec($cmd_string, $output); //return the output to the browser //This will output the uptime for server B on page on server A echo '<pre>'; print_r($output); echo '</pre>';?>
The recommended flow is to run a command on server A to SSH to server B
Use phpseclib to securely SSH or SCP to remote servers
Install withcomposer require phpseclib/phpseclib
use phpseclib\Crypt\RSA;use phpseclib\Net\SSH2;use phpseclib\Net\SCP;// Load your private key$key = new RSA();$key->loadKey('private key string');// Connect to the server$ssh = new SSH2('ip_address', 'port', 'timeout');if (!$ssh->login('username', $key)) { throw new Exception("Unable to connect");}// Run a remote commandecho $ssh->exec('whoami');// SCP put a string$result = (new SCP($ssh))->put('remotePath', 'content to put');// SCP put a file$result = (new SCP($ssh))->put('remotePath', 'localPath', SCP::SOURCE_LOCAL_FILE);// SCP get a file$result = (new SCP($this->ssh))->get('remotePath', 'localPath');// $result is true or false
I recommend SSH2 to execute commands on remote machine. You can use pecl
to install it easily. After that, you may use ssh2_exec()
function to execute your commands and ssh2_fetch_stream()
function to get stderr. Example codes are listed below:
// start connection$connection = ssh2_connect("your remote ip address", your port);ssh2_auth_password($connection,"your user name","your passwd");// connection established, start to execute codes$stream = ssh2_exec($connection, "your command"); $errorStream = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR);// block 2 streams simutaneouslystream_set_blocking($errorStream, true);stream_set_blocking($stream,true);// write stdout and stderr to log filefile_put_contents("your log file-path", date('Y-m-d H:i:s')."\nError: ".stream_get_contents($errorStream)."\nOutput: ".stream_get_contents($stream), FILE_APPEND)// close 2 streams fclose($errorStream);fclose($stream);// close remote connectionssh2_exec($connection, 'exit');
Cheers.