【问题标题】:Executing a Golang binary from PHP's shell_exec() function从 PHP 的 shell_exec() 函数执行 Golang 二进制文件
【发布时间】:2020-01-15 08:21:57
【问题描述】:

我编译了一个带有 1 个参数的 golang 二进制文件,生成一个 PDF 文件,然后将其上传到 AWS S3。该二进制文件在 shell 中完美运行,但是当尝试使用 PHP 的 shell_exec()exec()passthru()service() 函数执行它时,它不会执行(没有错误消息或日志条目)。我什至尝试从 PHP 的 shell_exec 调用 shell 脚本 (.sh),它执行二进制文件(在 shell 中也可以正常工作),但无济于事。

权限很好,PHP 的shell_exec() 适用于所有其他实例。

【问题讨论】:

  • 如果你没有看到错误信息,你怎么知道它没有执行?没有消息就是好消息,不是吗?
  • :) golang 二进制文件显示所有 AWS 上传输出 (ETAG),所以即使我 echo shell_exec(/path/to/binary) 它应该输出响应
  • 您是否尝试在命令末尾添加2>&1?例如,如果您的命令是:shell_exec('your_script.sh');,它将变为 shell_exec('your_script.sh 2>&1');
  • @mdexp 刚刚尝试了您的建议的不同变体,但还没有成功
  • 请提供php-script中使用的执行字符串

标签: php go


【解决方案1】:

shell_exec 函数可能需要 sudo 的密码,

用于 sudo 密码的 Linux 管道

shell_exec('echo "YOURPASS" | sudo -u root -S your_script.sh');


【讨论】:

  • 我发现了我自己发布的问题。非常感谢您的意见!
  • 您能进一步解释一下吗?为什么需要使用 sudo 运行一些东西?
【解决方案2】:

看来我找到了自己的答案:

事实证明,GoLang 二进制文件在查找与二进制文件本身的目录路径关联的资产时遇到问题。对于任何有同样问题的人,事实证明@Intermernet answer 会帮助你很多。 (请注意@Intermernet 的答案不是公认的答案)

就我而言,编译后的二进制文件无法从可执行工作目录中找到资产(pdf、图像等)。

对于编译需要跟踪资产的可移植 golang 二进制文件的任何人,以下代码将是您的朋友:

ex, err := os.Executable()
if err != nil {
    panic(err)
}
exPath := filepath.Dir(ex)

注意exPathgo rungo build 之间不会相同。因此,您需要使用构建版本进行测试。

为什么我没有收到任何错误消息,我将保留另一个问题。

【讨论】:

    猜你喜欢
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多