首页 > 解决方案 > 读取 pem 文件的 file_get_contents 文件权限问题

问题描述

首先,下面的代码测试适用于我尝试的第一个 pem 文件,但是当我尝试另一个 pem 文件时它失败了。我更改了权限,现在我无法使用 file_get_content 读取任何 pem 文件。

我的目标是将 pem 文件加载到 php 中,以便在远程与 phpseclib 一起使用。所有过程都适用于我的本地开发盒(在 Windows 上),但不适用于 ubuntu 盒。使用 stat、file_exists 和 is_readable 也都返回 false。我的假设是我的权限都错了,但是让它们正确却碰壁了。值得注意的是,我在 rsync 命令中包含了指向 pem 文件的相同路径,这是可行的。

我试过使用 chmod 和 777、755、600、644、666 都没有工作。我用 www-data:me me:me www-data:www-data 和 me:www-data 尝试了 chown

这些文件位于 .ssh 文件夹中,用户 me:me 的权限为 0700

如果我执行 nano 并粘贴文件名(即 sudo nano /home/me/.ssh/the_pem_file.pem 然后我可以查看内容),则确定的文件存在

use phpseclib\Crypt\RSA;

$path = $_POST['path'];

if (!$GLOBALS['cygwin']) {
    $new_path = str_replace( '~', '/home/me', $path ); //Dev Windows
} else {
    $new_path = str_replace( '~', 'C:/Users/Me', $path ); // Live Linux
}
clearstatcache();
$exists = file_exists( $new_path );
$is_readable = is_readable( $new_path );
if ( $exists || $is_readable) {
    $perms = decoct( fileperms( $new_path ) & 0777 );
    if ( $perms == 0600 ) {
        //Not implemented test
    }
    $key = new RSA();

    $pub = file_get_contents($new_path);
    if ($key->load($pub)) {
        $sshPass = $key;
    } else {
        var_dump($pub);
        var_dump($key);
        die($path);
    }
...........
} else {
    $pub = file_get_contents($new_path);
    var_dump( $pub );
    var_dump( stat( $new_path ) );
    var_dump( $new_path );
    var_dump( $exists );
    var_dump( $is_readable );
}

网页上的输出是

{removed path}:boolean false

{removed path}:boolean false

{removed path}:string '/home/me/.ssh/the_pem_file.pem' (length=??)

{removed path}:boolean false

{removed path:boolean false

正如所指出的,这正在使用我的一个 pem 文件,但在我更改权限之前不能使用另一个。现在都不管用。权限最初是 600 和 www-data:me ,但这不再有效。

请注意,我在测试之前使用了 clearstatcache(),并且我在代码的错误部分仔细检查了加载文件,以防万一它确实在工作,但 file_exists 返回 false 作为误报。

在此花费了太长时间,因此任何帮助指导或建议将不胜感激。我还查看了这里有类似问题的其他帖子,但似乎没有一个适合我的场景(最常用的 url 或相对于 doc root 的路径,我的理解是首选完整路径)

谢谢

克雷格

标签: phpssh-keysphpseclibfile-exists

解决方案


最后,我从 /home/me/.ssh 中删除了 pem 文件,并将它们放入 /var/www/.ssh 中,删除了我在这里的符号链接。我修改了代码以使用 /var/www/.ssh 有 chown www-data:www-data 所以它没有问题并且 git 工作


推荐阅读