11

提供我的环境背景:

我有 3 台机器 A、B 和 C

A = Webserver,运行一个 php 网站,基本上充当 B & C 的接口

B = Linux Ubuntu 机器,我有 root 访问权限、SSH 和通过 SSH 客户端在机器上工作所需的所有优点(我有这个服务器的 .ppk 私钥文件)

C = 在 Linux 上运行的 MySql 数据库服务器

我可以在 C (Mysql) 上成功执行来自 A (php) 的查询并返回结果。但现在我试图从 A 在 B 上执行 linux 命令。

例如。

我有一个在 B 上运行的脚本,并想从 A (php) 执行命令以显示脚本的状态。

在命令行中执行此操作很容易 - ./SomeScript status

但我想在服务器 A 上托管的网站中显示此脚本的状态。

甚至只是检查服务器 A 上服务器 B 的正常运行时间。

这无论如何可能。我似乎永远在谷歌上搜索,但我没有到达任何地方,如果连接安全与否,我不会太分阶段,因为这是一个封闭的网络,无法从外部访问该网络。

任何建议将不胜感激。

谢谢

4

3 回答 3

12

通过服务器 A 上的 PHP 向服务器 B 运行 SSH 命令。

以下是如何在 linux 中使用命令行运行 ssh 命令:http ://www.youtube.com/watch?NR=1&feature=fvwp&v=YLqqdQZHzsU

为了使用 PHP 在 linux 上运行命令,请使用exec()命令。

我希望这会让你开始寻找正确的方向。

查看这两个帖子以自动提示密码

这是一个带有非工作代码的快速示例,可让您思考:

<?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>';
?>

推荐的流程是在服务器 A 上运行命令以通过 SSH 连接到服务器 B

于 2013-06-10T17:17:52.210 回答
1

使用phpseclib安全地 SSH 或 SCP 到远程服务器

安装 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
于 2020-07-24T08:56:05.767 回答
0

我推荐SSH2在远程机器上执行命令。您可以使用pecl它轻松安装。之后,您可以使用ssh2_exec()函数来执行您的命令和ssh2_fetch_stream()函数来获取标准错误。下面列出了示例代码:

// 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');

干杯。

于 2020-11-18T09:55:37.413 回答