Я хотел бы запустить локальный скрипт, который по завершении пытается отправить tarball через SSH на мой сервер и поэтому требует пароль. Есть ли способ использовать библиотеки ssh2, proc_open или другую библиотеку для достижения этого в PHP.

Я понимаю, как выполнять команды терминала из сценария PHP, я застреваю, когда пытаюсь отправить этот архив на свой сервер:

Что у меня есть

Телефонный код

private function run($command, array $arguments = array(), Response $response = null) {
    $pipes = array();
    $descriptorspec = array(
       array('pipe', 'r'),  // STDIN
       array('pipe', 'w'),  // STDOUT
       array('pipe', 'w'),  // STDERR
    );
    $process = proc_open($command, $descriptorspec, $pipes, $this->directory);
    foreach ($arguments as $arg) {
        // Write each of the supplied arguments to STDIN
        fwrite($pipes[0], (preg_match("/\n(:?\s+)?$/", $arg) ? $arg : "{$arg}\n"));
    }
    if (!$response) {
        $response = new Response;
    }
    $response->addCompletedCommand(stream_get_contents($pipes[1]), $command, $arguments);
    $error = stream_get_contents($pipes[2]);
    if ($error) {
        $response->addError($error, $command, $arguments);
    }
    // Make sure that each pipe is closed to prevent a lockout
    foreach ($pipes as $pipe) {
        fclose($pipe);
    }
    proc_close($process);
    return $response;
}

Команда

$this->run('shell_script_i_cannot_change_that_runs_ssh', array('password'));

Ошибка:

Host key verification failed

Я не могу изменить скрипт, я могу вызвать его только из PHP. Если есть решение, может ли это быть только PHP?

-1
Luke Madhanga 19 Фев 2016 в 23:02

2 ответа

Лучший ответ

Хорошо, я решил проблему, довольно запутанно.

  • Я добавил _www (имя пользователя / группы, которую Apache запускает в OSX, измените на то, что есть в вашей системе) в группу sudoers, но Я ПРЕДОСТАВИЛ ДОСТУП ТОЛЬКО ДЛЯ ЗАПУСКА ОДНОГО СКРИПТА.

Код:

 _www    ALL=(ALL) NOPASSWD: /path/to/script/i/couldnt/change

Подробнее о файле sudoers здесь

  • Я добавил перед вызывающим скриптом в PHP sudo -u Luke. Это заставляет программное обеспечение запускать двоичный файл как я

  • Затем я создал открытый ключ с ssh-keygen, чтобы разрешить вход на мой сервер без пароля. Я бы посоветовал создать нового пользователя, который имеет доступ только к определенным папкам, а затем, возможно, настроить директиву Match в ssh_config вашего сервера для управления этим новым пользователем

0
Luke Madhanga 20 Фев 2016 в 00:30

Вероятно, вы можете просто сбросить существующий ключ в клиентской системе, используя ssh-keygen -R hostname.

Это приводит к серьезной уязвимости безопасности, пожалуйста, используйте ее осторожно и сначала попытайтесь понять проблему ssh (например, запустите команду в системе и снова попробуйте свой PHP-скрипт).

0
Thomas Dutrion 19 Фев 2016 в 20:17