返回

如何在共享托管上使用 PHP shell_exec() 将文件推送至 GitHub?

php

共享托管上使用 PHP shell_exec() 将文件推送至 GitHub

简介

使用 PHP 的 shell_exec() 函数将文件推送至 GitHub 在共享托管环境中可能是一个挑战。本文探讨了这种问题背后的原因以及解决方法,以帮助你克服这些限制。

问题的原因

在共享托管环境中,shell_exec() 函数无法执行 shell 命令的主要原因是:

  • 环境限制: 共享托管提供商通常会限制 PHP 脚本执行某些操作,包括执行 shell 命令。
  • 安全模式: 安全模式是一种 PHP 设置,可以限制脚本执行某些操作,例如执行外部命令。

解决方案

1. 检查 SSH 密钥

确保你的 GitHub 个人 SSH 密钥已添加到你的共享托管帐户中。这将允许你使用 SSH 协议推送文件,而不是 HTTPS 协议。

2. 检查权限

确保 PHP 脚本具有执行 shell 命令的权限。你可以编辑 .user.ini 文件并添加以下行:

exec = On

3. 禁用安全模式

如果启用了 PHP 安全模式,请禁用它以允许 shell_exec() 正常工作。

4. 修改 PHP 脚本

修改 PHP 脚本以在执行 git 命令之前明确指定 SSH 密钥文件的位置。例如:

$push = shell_exec('git push -u origin master --ssh="~/.ssh/id_rsa"');

5. 使用 exec() 函数

尝试使用 exec() 函数代替 shell_exec()。exec() 函数通常用于执行外部命令并捕获输出。例如:

exec('git push -u origin master', $output, $return_var);
if ($return_var !== 0) {
  echo "Error executing git push command";
  print_r($output);
}

6. 联系托管提供商

如果上述步骤不起作用,请联系你的共享托管提供商。他们可能能够提供有关特定托管环境的更多见解和支持。

示例代码

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

exec('git push -u origin master --ssh="~/.ssh/id_rsa"', $output, $return_var);
if ($return_var !== 0) {
  echo "Error executing git push command";
  print_r($output);
}

提示

  • 确保你的 PHP 版本是最新版本。
  • 使用绝对路径而不是相对路径来指定 SSH 密钥文件。
  • 仔细检查错误输出,以获取有关失败原因的更多详细信息。

常见问题解答

1. 为什么我无法在共享托管上执行 shell 命令?
答:这可能是由于环境限制或启用了安全模式。

2. 如何禁用 PHP 安全模式?
答:编辑 .user.ini 文件并添加以下行:exec = On。

3. 为什么 shell_exec() 无法捕获 git 命令的输出?
答:shell_exec() 只能返回命令的退出状态。使用 exec() 函数捕获输出。

4. 如何指定 SSH 密钥文件的位置?
答:在 git 命令中使用 --ssh="~/.ssh/id_rsa" 选项指定密钥文件的位置。

5. 为什么我的 PHP 脚本仍然无法将文件推送至 GitHub?
答:请检查 SSH 密钥是否正确添加,权限是否正确设置,并且没有其他环境限制阻止执行。