php - 读取 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 的路径,我的理解是首选完整路径)
谢谢
克雷格
解决方案
最后,我从 /home/me/.ssh 中删除了 pem 文件,并将它们放入 /var/www/.ssh 中,删除了我在这里的符号链接。我修改了代码以使用 /var/www/.ssh 有 chown www-data:www-data 所以它没有问题并且 git 工作
推荐阅读
- go - 在 Go 中遍历孩子的谱系
- mysql - 更好的选择而不是多个插入的功能
- sas - SAS EG 中的 PRXMATCH 在开放代码中不起作用
- google-analytics - 将过去的离线事件发送到 Google Analytics 360
- java - 架构包含在 Unix 中失败,但在 Windows 中有效
- javascript - 为什么 HttpUtility.JavaScriptStringEncode 不对双引号进行编码?
- android - 具有自定义 Tileset 或样式的 Mapbox NavigationView
- python - 保持递归dict函数的嵌套键级别?
- javascript - 启用/禁用具有动态生成的名称/标签的 HTML 元素
- python - 仅在多维数组中“垂直”打乱特定列