【问题标题】:file_get_contents file permission issue reading a pem file读取 pem 文件的 file_get_contents 文件权限问题
【发布时间】:2019-12-25 13:34:59
【问题描述】:

首先,下面的代码测试适用于我尝试的第一个 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 的路径,我的理解是首选完整路径)

谢谢

克雷格

【问题讨论】:

  • 您没有更改.ssh 文件夹本身的权限吗? glob("/home/me/.ssh/*") 返回什么?
  • 我想我改变了 .ssh 文件夹,同时试图在这个线程之前让它工作。尽管 glob 返回了一个空数组,但您却击中了它的头部。我使用 sudo chown www-data .ssh 设置了权限,现在似乎正在按预期添加 pem 文件。我将检查主要脚本现在是否正常工作。
  • 修改 .ssh 文件后,我现在无法在此服务器上执行 git pull。我读到 .ssh 中文件的权限具有特定权限,即 id_rsa.pub 为 644,其余为 0600 我目前拥有 chown,因为 www-data:me git 可以工作,如果这是我:我现在完全迷路了。当然它不能与 git 或我的脚本一起使用?我还应该提到我在 var/www/.ssh 中具有与符号链接相同的键,这些键设置为 777(似乎无法更改)

标签: php ssh-keys phpseclib file-exists


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2018-09-21
    • 2017-01-26
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 2011-05-27
    相关资源
    最近更新 更多