首页 > 解决方案 > 是否有一种编程方式来区分 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

标签: phpbash

解决方案


您可以查看父进程的名称(请参阅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

推荐阅读