1

我正在尝试通过网站以编程方式将 RSA 公钥附加到 authorized_keys 文件中,但我无法找到任何可行的解决方案。我尝试使用 PHP 的file_put_contents()函数,但遇到权限被拒绝错误,并且我有一个可以工作的 python 脚本,但我似乎无法让 PHP 使用exec()命令或shell_exec(). 这是相关的PHP代码:

if(@$_POST['action']=='submit'){
    $key = $_POST['key_field'];

    //file_put_contents("/home/biosproject/.ssh/authorized_keys", $key, FILE_APPEND);

    $test = "/usr/bin/python savetofile.py \"".$key."\"";
    $tmp = shell_exec($test);
}

我知道我需要清理输入,但该网站目前正在开发中,所以我只是在此期间像这样测试它。现在我正在使用运行 Apache 的 XAMPP。有什么我想念的或可以尝试的吗?对于 PHP exec/shell_exec,我尝试对命令的所有部分使用完整路径名,但还没有任何效果。python脚本如下:

#!usr/bin/python
import sys    
key = sys.argv[1]    
with open("/home/biosproject/.ssh/authorized_keys","a") as append:
    diditwork = append.write(key)
print key

正如我之前提到的,这个脚本是有效的,但我不能从 PHP 脚本中调用它。

编辑:

我的 authorized_keys 文件如下所示:
-rw-rw-rw- 1 biosproject www-data 1200 Apr 15 13:17 /home/biosproject/.ssh/authorized_keys

更新:

我通过使用从数据库条目附加必要信息的 cron 作业绕过权限来解决此问题。现在效果很好!

4

2 回答 2

0

关于我的内联代码的说明:

$text = "nice text to append :P";
// open a file handler with a+ flag that means "open file for append and if it does not exist, create it"
$fo = fopen("filename.ext", "a+");
// append $text to file handler with a \n at the end
fwrite($fo, $text . PHP_EOL);
于 2013-04-16T17:22:25.803 回答
0

Python 脚本在这里对您没有帮助 - 这是/home/biosproject/.ssh/authorized_keys文件的权限问题,即 Apache 没有修改它的权限,也不会产生任何进程,这将包括您的 Python 脚本。

最简单的解决方法是更改​​文件权限,使其可由 Apache 写入。假设 apache 作为 group 运行www-data,做...

sudo chgrp www-data /home/biosproject/.ssh/authorized_keys
sudo chmod g+w /home/biosproject/.ssh/authorized_keys

...虽然我忘记了 ifssh抱怨 ifauthorized_keys设置为g+w.

更新

在我看来,www-data还需要+x访问所有父目录/home/biosproject/.ssh/authorized_keys才能更改它,尽管我很确定如果您以这种方式更改目录权限ssh会抱怨。.ssh

您要么必须使用与/home/biosproject/.ssh目录所有者相同的 UID 运行 apache,要么使用setuid脚本进行更改。

于 2013-04-16T17:23:52.450 回答