PHP скрипт не будет работать - PullRequest
0 голосов
/ 14 мая 2018

В основном, я хочу запустить ниже сценарий локально, чтобы начать перезапустить перезапустить и получить статус службы. И он должен показывать вывод каждой кнопки команды. Я использую php 5.6 для запуска этого кода.

Ниже приведен код:

<code><?php
    // define cmds
    $commands = [
    'stop_apache' => [
        'description' => 'Stop Apache2',
        'cmd' => 'systemctl stop apache2'
    ],
    'restart_apache' => [
        'description' => 'Restart Apache2',
        'cmd' => 'systemctl restart apache2'
    ],
    'start_apache' => [
        'description' => 'Start Apache2',
        'cmd' => 'systemctl start apache2'
    ],
    'status_apache' => [
        'description' => 'Status Apache2',
        'cmd' => 'systemctl status apache2'
    ],
    ];

    // handle post
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $error = [];
    $result = '';

    // validate input
    if (empty($_POST['service'])) {
        $error = [
            'service' => 'Service type required!'    
        ];
    } elseif (!array_key_exists($_POST['service'], $commands)) {
        $error = [
            'service' => 'Invalid Service!'    
        ];
    }
    }
    ?>
    <form action="" method="post">
    <?php if (!empty($error)): ?>
    <h3>Error</h3>
    <pre><?= print_r($error, true) ?>
<? php endif?> <? php foreach ($ commands as $ key => $ command):?> <? php endforeach?> <? php if (! empty ($ result)):?>
<?= print_r($result, true) ?>
<? php endif?>

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Скорее всего, у вас возникнут проблемы с разрешениями, поскольку пользователь веб-сервера www-data не будет иметь разрешения для перезапуска службы.

Так что, если вы не разрешите это, это неидти на работу. Предыдущий код , который работает, заключается в том, что вы входите через SSH с пользователем root.

Хорошо, так что если вы добавили разрешение www-data для перезапуска службы, ваш код будет похож наследующий.Используя exec() для выполнения команды.

<code><?php
// define cmds
$commands = [
    'stop_apache' => [
        'description' => 'Stop Apache2',
        'cmd' => 'systemctl stop apache2'
    ],
    'restart_apache' => [
        'description' => 'Restart Apache2',
        'cmd' => 'systemctl restart apache2'
    ],
    'start_apache' => [
        'description' => 'Start Apache2',
        'cmd' => 'systemctl start apache2'
    ],
    'status_apache' => [
        'description' => 'Status Apache2',
        'cmd' => 'systemctl status apache2'
    ],
];

// handle post
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $error = [];
    $result = '';

    // validate input
    if (empty($_POST['service'])) {
        $error = [
            'service' => 'Service type required!'    
        ];
    } elseif (!array_key_exists($_POST['service'], $commands)) {
        $error = [
            'service' => 'Invalid Service!'    
        ];
    }

    if (empty($error)) {
        exec($commands[$_POST['service']]['cmd'], $output, $status_code);
        if ($status_code === 0) {
            $result = 'Service restarted';
        } else {
            $error = 'Could not restart service! Status code: '.$status_code;
        }
    }
}
?>
<form action="" method="post">
    <?php if (!empty($error)): ?>
    <h3>Error</h3>
    <pre><?= print_r($error, true) ?>
$ command):?>
<?= print_r($result, true) ?>

Вы заметите, что произойдет сбой с Could not restart service! Status code: 1 - потому что www-data не будет иметь разрешений.Вы должны прочитать https://serverfault.com/questions/69847/linux-how-to-give-a-user-permission-to-restart-apache о том, как это исправить, также имейте в виду, что это открывает возможность плохого кода, постоянно перезапускающего apache и DOSing.

Лично я бы не стал делать это напрямую, как вы хотитеделать, но вместо этого настроить задачу, которая запускается пользователем root, и вы помещаете операции (перезапуск, остановка и т. д.) в очередь для запуска.

Надеюсь, это поможет.

0 голосов
/ 14 мая 2018
// handle post
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$error = [];
$result = '';

// validate input
if (empty($_POST['service'])) {
    $error = [
        'service' => 'Service type required!'    
    ];
} elseif (!array_key_exists($_POST['service'], $commands)) {
    $error = [
        'service' => 'Invalid Service!'    
    ];
}
//you need add this line
else $result = $commands[$_POST['service']];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...