php - 是否有一种编程方式来区分 bash 脚本是由用户执行还是通过 PHP 中的 shell_exec 执行?
问题描述
我编写了简单的数据库备份脚本,可以毫无问题地完成这项工作,但为了避免嵌入任何凭据,我将所有内容都作为参数传递。
private function dumpDatabase(): void
{
$this->fileSystem->disk('local')->makeDirectory('temp');
$relativePathToDump = 'storage/app/temp/dump.sql';
$executableChunks = [
'HOST=' . config('database.connections.mysql.host'),
'PORT=' . config('database.connections.mysql.port'),
'USER=' . config('database.connections.mysql.username'),
'PASSWORD=' . config('database.connections.mysql.password'),
'DATABASE_NAME=' . config('database.connections.mysql.database'),
'RELATIVE_PATH_TO_DUMP=' . $relativePathToDump,
base_path('bin/backup_database.sh'),
];
$command = implode(' ', $executableChunks);
shell_exec($command);
}
脚本本身:
#!/usr/bin/env bash
mysqldump --force --routines -h $HOST --port=$PORT -u $USER -p$PASSWORD $DATABASE_NAME > $RELATIVE_PATH_TO_DUMP
如果用户通过以下方式手动触发脚本,有没有办法立即停止脚本的执行:
./bin/backup_database.sh
但让它在通过以下方式调用时完成工作:
shell_exec($command);
我可以添加更多检查以查看是否存在参数:
if [[ -z "${HOST}" ]]; then
echo "Database host (HOST=) has not been provided."
exit 1
fi
但这不是关于争论,而是关于谁/什么是脚本的“执行者”。可行吗?
if [[ not triggered programatically by shell_exec ]]; then
echo "Bye"
exit 1
fi
解决方案
您可以查看父进程的名称(请参阅Get the name of the caller script in bash script)。在. php
_PARENT_COMMAND
caller=$(ps -o comm= $PPID)
if [[ "${caller}" =~ php ]]; then
echo "Bingo"
fi
推荐阅读
- c# - 将多个 Excel 工作表导入 SQL Server 表
- python - 使用 Python 导入包含文本和数字数据的文件
- node.js - 平均堆栈:刷新或输入直接 URL 会导致“无法 GET/”?
- sql - 如果超出现有数量,则触发以阻止订单更新
- swift - 未解析的标识符“计数”
- javascript - 将改造对象发送到新活动
- python - 如何使用特里计算最长的字谜?
- makefile - “make”命令使用哪个协议?
- php - 在 web 应用程序或 rest API 上实现图像上传和缩略图生成?
- laravel - 如何在 PHP Netbeans 中输入提示静态方法