我想运行一个本地脚本,完成后尝试通过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吗
答案 0 :(得分:0)
您可以使用ssh-keygen -R hostname
重置客户端系统上的现有密钥。
这引入了一个主要的安全漏洞,请谨慎使用并首先尝试理解ssh问题(例如在系统上运行命令并再次尝试PHP脚本)。
答案 1 :(得分:0)
好的,我已经解决了这个问题,相当令人费解。
_www
(Apache在OSX上运行的用户/组的名称,更改为系统中的任何内容)但我只能访问运行一个脚本。代码:
_www ALL=(ALL) NOPASSWD: /path/to/script/i/couldnt/change
详细了解sudoers文件here
我在PHP中使用sudo -u Luke
添加了调用脚本。这使得软件以我的方式运行二进制文件
然后我创建了一个带有ssh-keygen
的公钥,以允许无密码登录到我的服务器。我建议创建一个只能访问特定文件夹的新用户,然后在服务器的ssh_config上设置Match
指令来控制这个新用户