Execute commands on remote machine via PHP

前端 未结 3 621
夕颜
夕颜 2021-02-03 12:11

To give background on my environment:

I have 3 machines A, B & C

A = Webserver, running a php website which basically acts as an interface for B & C

相关标签:
3条回答
  • 2021-02-03 12:52

    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 simutaneously
    stream_set_blocking($errorStream, true);
    stream_set_blocking($stream,true);
    
    // write stdout and stderr to log file
    file_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 connection
    ssh2_exec($connection, 'exit');
    

    Cheers.

    0 讨论(0)
  • 2021-02-03 13:01

    Use phpseclib to securely SSH or SCP to remote servers

    Install with composer 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 command
    echo $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
    
    0 讨论(0)
  • 2021-02-03 13:13

    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

    0 讨论(0)
提交回复
热议问题