【问题标题】:Possible to manage linux services from website?可以从网站管理 linux 服务吗?
【发布时间】:2012-05-17 17:08:26
【问题描述】:

我有几个服务,我想从网站访问。就像一个简单的网站,用户可以登录并访问启动|停止|如果服务关闭,则重新启动服务。 IDK 如果这在网页中是可能的,因为我还没有经历过。

在 shell 中,我只需输入 service b3-2 start 即可启动该服务。现在我只想能够在开始|停止|重新启动是按钮的网页中执行此操作,并且在所有内容下方都有一个信息/状态区域和一个输出框,以显示任何错误。

如果有人可以帮助我,那就太棒了。我的问题主要是-

  • 是否可以通过网页执行此操作?
  • 如果是这样,创建起来有多难?
  • 您还能告诉我什么可以更好地帮助我解决这个问题?

顺便说一句,我主要只将它用于我的 B3 服务(Big Brother Bot)。

【问题讨论】:

  • 我本身不会把它放在 PHP 标记下。我怀疑您可能在某个地方可以安装某种包来创建这样一个网站(但是,我在第一个搜索结果中没有找到任何包,我没有时间进一步查看)。
  • 您可以查看webmin,尽管这对您的项目来说可能有点矫枉过正。
  • 我同意 styxxy,我希望已经有一个我可以修改的网络界面,或者它可以开箱即用。但如果需要,我会尝试创建自己的。
  • Webmin 可能会为您执行此操作,但对于少数服务而言,它的杀伤力太大了​​。 webmin.com/standard.html你在服务器故障上可能会有更好的运气。

标签: php html shell scripting webpage


【解决方案1】:

我很久以前用http://de.php.net/manual/en/book.ssh2.php模块用PHP写了一个“Eggdrop Webinterface”。

您可以通过 SSH 将此模块连接到您的 linux 服务器并提交 shell 命令。在我的 Web 界面中,我编写了一个 Shellscript 来完成所有工作(添加/删除/启动/停止等)并通过 php ssh2 模块执行。

<?php
class ssh
{
private $sql;
private $con;

private static $instance;

public static function getInstance()
{
    if (!self::$instance)
    {
        self::$instance = new ssh();
    }
    return self::$instance;
}

function __construct()
{
    $this->sql = sql::getInstance(); 
}

/* Verbindung über SSH aufnehmen */
public function connect ($rootid)
{
    global $cfg;

    $q = $this->sql->query("SELECT ROOT_SSH_IP, ROOT_SSH_USER, ROOT_SSH_PASS, ROOT_SSH_PORT FROM ".prfx."rootserver WHERE ROOT_ID = '".$rootid."'");

    $r = $this->sql->content($q);

    $blowfish = new Blowfish($cfg["BLOWFISHKEY"]);

    $pass = $blowfish->Decrypt($r["ROOT_SSH_PASS"]);

    $this->ssh_connect($r["ROOT_SSH_IP"], $r["ROOT_SSH_PORT"], $pass, $r["ROOT_SSH_USER"]);

    return true;

}

/* Disconnect */
public function my_ssh_disconnect($reason, $message, $language) {
    printf("Server disconnected with reason code [%d] and message: %s\n",
    $reason, $message);

    return true;
}

/* Eigentliche ssh_connect Funktion */
public function ssh_connect($host, $port, $pass, $user="root")
{
    $methods = array(
      'kex' => 'diffie-hellman-group1-sha1',
      'client_to_server' => array(
        'crypt' => '3des-cbc',
        'comp' => 'none'),
      'server_to_client' => array(
        'crypt' => 'aes256-cbc,aes192-cbc,aes128-cbc',
        'comp' => 'none'));

    $callbacks = array();

    $this->con = ssh2_connect($host, $port, $methods, $callbacks);
    if (!$this->con) die('Connection failed');
    else {

        if (!ssh2_auth_password($this->con, $user, trim($pass))) {
            die("login failed.");
        }
    }

    return true;
}

/* Befehle ausführen */
public function ssh_exec ($cmd, $stderr=true)
{
    if ($stderr == true)
    {
        $stream = ssh2_exec($this->con, $cmd);

        $err_stream = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR);

        stream_set_blocking($err_stream, true);
        $result_err = stream_get_contents($err_stream);

        if (empty($result_err))
        {
            stream_set_blocking($stream, true);

            $out = stream_get_contents($stream);

            return $out;
        }
        else {
            return $result_err;
        }
    }
    else {

        $stream = ssh2_exec($this->con, $cmd);

        stream_set_blocking($stream, true);

        $out = stream_get_contents($stream);

        return $out;
    }
}

/* Verbindung beenden */
public function quit()
{
    $stream = ssh2_exec($this->con, 'exit');
    stream_set_blocking($stream, true);
    $output = stream_get_contents($stream);

    return true;                
}

}

在我的例子中,我使用加密密码将 Serveraccounts 存储在 MySQL 表中。

希望小课堂能有所帮助

【讨论】:

  • 感谢脚本,我回家后会进一步研究。
【解决方案2】:

如果您想“自己编写”,您可以混合使用 bash、php 和/或其他脚本。

【讨论】:

  • 我只需要一个简单的网页。我可以在 cpanel 中使用密码保护目录。我只需要一个可以控制这项服务的网页,而不会破坏银行或复制起来很复杂。