使用 proc_open() 加载 .profile

2024-03-04

情况是这样的:我编写了一个后端应用程序,在某个服务器上运行。在此服务器上,有一个可以通过 ssh 从前端服务器执行的脚本。然后,我的脚本将检查它所需的环境变量是否已正确加载,因为我在脚本本身中严重依赖它们。

这可行,尽管不是我想要的方式。建立连接后,./profile 不会仅使用以下命令加载exec('source /home/user/.profile');当然,这是行不通的。由于脚本已经在运行。 这就是为什么脚本是这样开始的:

#!/to/php/bin/php -n
<?php
    if (!$_SERVER['VAR_FROM_PROFILE'])
    {
        exec('/absolute/path/to/helperscript '.implode(' ',$argv),$r,$s);
        if ($s !== 0)
        {
            die('helper script fails: '.$s);
        }
        exit($r[0]);
    }

该帮助程序脚本是一个 ksh 脚本:

#!/path/ksh
source /.profile
$*

加载配置文件,并再次调用第一个脚本。 我希望第二个脚本消失,我觉得这很愚蠢......需要第二个脚本来运行第一个脚本。我知道可以使用 proc_open 设置环境值,但是将 .profile 重写为数组听起来更愚蠢。 我也尝试过proc_openshell,加载配置文件并从其内部再次运行脚本。结果发现脚本不断调用自身,让我相信配置文件根本没有加载。

到目前为止,这是我的尝试:

#!/to/php/bin/php -n
<?php
    if (!$_SERVER['VAR_FROM_PROFILE'] && $argv[1] !== 'fromself')
    {
        $res = proc_open('ksh',array(array('pipe','r'),array('pipe','w'),array('pipe','w')),$pipes);
        usleep(5);
        fwrite($pipes[0],'source /home/user/.profile & '.$argv[0].' fromself');
        fclose($pipes[0]);//tried using fflush and a second fwrite. It failed, too
        usleep(1);
        echo stream_get_contents($pipes[1]);
        fclose($pipes[1]);
        proc_close($res);
        exit();
    }
    var_dump($_SERVER);
?>

到目前为止我还没有运气,谁能告诉我我是否在这里忘记了什么?我究竟做错了什么?我在这里忽略了什么吗?


我没有ksh,但我已经设法做到了bash.

/home/galymzhan/.bash_profile:

export VAR_FROM_PROFILE="foobar"

/home/galymzhan/test.php:

#!/usr/bin/php -n
<?php
if (!isset($_SERVER['VAR_FROM_PROFILE'])) {
  $descriptors = array(0 => array('pipe', 'r'), 1 => array('pipe', 'w'));
  $process = proc_open('bash', $descriptors, $pipes);
  fwrite($pipes[0], escapeshellcmd('source /home/galymzhan/.bash_profile') . "\n");
  fwrite($pipes[0], escapeshellcmd('/home/galymzhan/test.php') . "\n");
  fclose($pipes[0]);
  echo "Output:\n";
  echo stream_get_contents($pipes[1]);
  echo "\n";
  fclose($pipes[1]);
  proc_close($process);
  exit;
}
print "Got env var {$_SERVER['VAR_FROM_PROFILE']}\n";
// Useful part of the script begins

我得到的输出:

[galymzhan@dinohost ~]$ ./test.php 
Output:
Got env var foobar
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 proc_open() 加载 .profile 的相关文章

随机推荐

  • 不同功能的样本数量不同

    plot x 3 x 2 5 x 12 是否可以设置x 3只有 2 个样本并且x 2 5 x 12比如说同一个图中有 1000 个样本 这是可以做到的 但不是开箱即用的 第一个变体使用临时文件来保存一个低采样率的函数 并稍后将其与高分辨率函
  • Android Studio - 未找到 SDK - 设置向导失败 - 防火墙代理

    言归正传 我处于公司防火墙后面 我必须手动下载 Android Studio 的 zip 文件 并将其提取到我的计算机上的程序文件 Windows 10 中 当我启动工作室时 我的对话工作室需要检索 SDK 我尝试这样做 但在这 3 个 z
  • 如何在 iOS 上制作爆炸动画?

    我有一款 iOS 游戏 当球击中目标时就会爆炸 动画爆炸的最佳方式是什么 如果您正在寻找简单的东西 制作一系列动画爆炸的图像 将它们添加到 UIImageView 并启动动画 像这样的事情 UIImage image0 UIImage im
  • SoapUI:如何将指纹作为 SecurityTokenReference 添加到 wss SIGNATURE 条目

    我有一个关于soapUI的问题 我正在尝试将 ws security 标头添加到包含签名的肥皂请求中 为此 我在项目首选项中使用了soapUI 对话框 WS Security Configurations 它按预期工作 但我的服务器应用程序
  • 如何验证 AWS SigV4 签名

    我有一个服务器将接收带有 SigV4 授权标头的请求 并且基于 SigV4 的验证 我将授予数据访问权限 我们如何验证SigV4 我一直在尝试获取用于验证 SigV4 的文档 但无法获取它 有什么办法可以反编译签名并检查身份验证然后授权吗
  • 使用 PHP 正则表达式从字符串中删除换行符

    如何使用 PHP 从字符串中删除换行符 string str replace PHP EOL string or string str replace array n r string
  • 通过 PostMessage 发送/接收字符串

    尽管网上已经有一些资源可以解决这个粗略的主题 但我仍然没有找到适合我的答案 我希望我的同事之间能有充分的沟通VB net过程和我的C 过程 我希望能够发送一个字符串到and来自C 过程 但目前我需要实现 Sending一个字符串到C 处理并
  • MongoDB 交易

    我在 C 中有如下方法 private void Save object mongoCollection Save object someotherRelationaldb Save object 我有两个数据库 我必须在其中保存一个对象
  • 使用 VBA 访问 iframe 内的元素

    我正在尝试使用 PowerPoint VBA 访问使用 Wix Site Builder 制作的网页上的 iframe 元素 我尝试了在谷歌和其他网页上找到的所有内容 但我无法弄清楚 当我尝试使用时 最常见的错误是 自动化错误 conten
  • 如何使用TextureView代替SurfaceView与ExoPlayer的PlayerView一起使用?

    我知道可以在 ExoPlayer 中使用TextureView 但我找不到任何有关如何以正确的方式实现此功能的示例 你能帮我解决这个问题吗 The PlayerView有一个 xml 属性surface type让您选择是否要使用Surfa
  • 在 XML 中意味着什么?

    什么是
  • 如何在 Eclipse 模拟器中创建代表 Samsung Galaxy S 的 AVD?

    我正在开发一款专门针对三星 Galaxy S 的应用程序 我不是在这里做出决定的人 他们希望其布局达到像素精度 我可以只使用普通的 2 1 AVD 吗 所以我尝试创建 WQVGA432 但它看起来像这样 我不知道为什么 LinearLayo
  • 构建参数未解决

    我有 docker compose 和以下代码 version 3 8 services php container name php build context php args PHPVERSION 7 4 XDEBUGVERSION
  • 如何触发/强制更新 Svelte 组件

    我正在尝试了解 svelte 3 反应性的事情 我想在单击按钮时强制刷新用户界面 我正在使用自定义组件AsyncFetcher接受 HTTP post 数据并返回data其插槽的对象 http post 结果 我想要一个禁用功能 因此 当单
  • HttpWebRequest 和本机 GZip 压缩

    当请求使用 Gzip 压缩的页面时 我收到很多以下错误 System IO InvalidDataException GZip 页脚中的 CRC 与 根据解压后计算出的CRC 数据 我正在使用本机 GZipStream 来解压缩 并正在考虑
  • 在虚拟 getter 中添加参数

    我想做的是这样的 Schema virtual getSomething get function what if what return this somethingElse else return this something what
  • Laravel 5 - 写入供应商目录

    Laravel 5 在工作一段时间后崩溃了 这是错误 file put contents Library WebServer Documents project vendor services json 无法打开流 权限被拒绝 在 File
  • java.lang.UnsatisfiedLinkError:dlopen失败:找不到库“/Users/...”

    我想添加另一个库android ndk hello libs https github com googlesamples android ndk issues 364例子 In CMakeLists txt I add this is f
  • MediaRecorder:启动失败

    我已经用谷歌搜索过但没有找到任何解决方案 我正在记录来电和去电 code 与拨出电话配合使用效果良好但给出来电异常 recorder new MediaRecorder File sdCard Environment getExternal
  • 使用 proc_open() 加载 .profile

    情况是这样的 我编写了一个后端应用程序 在某个服务器上运行 在此服务器上 有一个可以通过 ssh 从前端服务器执行的脚本 然后 我的脚本将检查它所需的环境变量是否已正确加载 因为我在脚本本身中严重依赖它们 这可行 尽管不是我想要的方式 建立