PHP运行一个期望SSH密码的脚本

时间:2016-02-19 20:02:12

标签: php ssh

我想运行一个本地脚本,完成后尝试通过SSH将tarball发送到我的服务器,因此需要密码。有没有办法使用ssh2库,proc_open或其他库来实现这一点。

我理解如何在PHP脚本中执行终端命令,当我尝试将此tarball发送到我的服务器时,我遇到了问题:

到目前为止我有什么

主叫代码

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吗

2 个答案:

答案 0 :(得分:0)

您可以使用ssh-keygen -R hostname重置客户端系统上的现有密钥。

这引入了一个主要的安全漏洞,请谨慎使用并首先尝试理解ssh问题(例如在系统上运行命令并再次尝试PHP脚本)。

答案 1 :(得分:0)

好的,我已经解决了这个问题,相当令人费解。

  • 我向群组sudoers添加了_www(Apache在OSX上运行的用户/组的名称,更改为系统中的任何内容)但我只能访问运行一个脚本。

代码:

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

详细了解sudoers文件here

  • 我在PHP中使用sudo -u Luke添加了调用脚本。这使得软件以我的方式运行二进制文件

  • 然后我创建了一个带有ssh-keygen的公钥,以允许无密码登录到我的服务器。我建议创建一个只能访问特定文件夹的新用户,然后在服务器的ssh_config上设置Match指令来控制这个新用户