在 Laravel 调度程序中执行长多 Bash 命令
Execute Long Multi Bash Commands in Laravel Scheduler
我正在尝试通过 Laravel 调度程序
每天从我的服务器上擦除敏感的历史命令
当我运行这段代码时:
$schedule->exec(`for h in $(history | grep mysql | awk '{print -N}' | tac) ; do history -d $h ; done; history -d $(history | tail -1 | awk '{print }') ; history`)->{$interval}()->emailOutputTo($email)->environments('prod');
我收到这个错误:
⚡️ app2020 php artisan schedule:run
ErrorException
Undefined variable: h
at app/Console/Kernel.php:44
注意到这是一个完美的工作命令
for h in $(history | grep mysql | awk '{print -N}' | tac) ; do history -d $h ; done; history -d $(history | tail -1 | awk '{print }') ; history
注:
我知道我可以通过将上面的命令添加到 crontab 来实现它,但目标是保持所有 cron 活动在 Laravel 项目
中组织
由于 bash 和 PHP 使用 $
作为他们的变量,如何才能使类似的 bash 命令起作用?
任何提示,我都会接受。
您将命令包装在反引号中,这将插入变量并将值作为命令执行。这些你都不想要。
使用单引号构建命令,然后将其传递给exec()
。
$cmd = 'for h in $(history | grep mysql | awk \'{print -N}\' | tac) ;';
$cmd .= ' do history -d $h ;';
$cmd .= 'done;';
$cmd .= 'history -d $(history | tail -1 | awk \'{print }\') ;';
$cmd .= 'history';
$schedule
->exec($cmd)
->{$interval}()
->emailOutputTo($email)
->environments('prod');
对于更有效的方法,您可以尝试直接编辑历史文件。
$cmd = 'sed -i /mysql/d "$HOME/.bash_history"';
无需删除文件中的最后一个条目,因为它是交互式 shell 命令的历史记录。
显然,最好的办法是不要在命令行中放置“敏感”内容。对于 MySQL,这可以通过将凭据添加到 .my.cnf
文件来完成。
我正在尝试通过 Laravel 调度程序
每天从我的服务器上擦除敏感的历史命令当我运行这段代码时:
$schedule->exec(`for h in $(history | grep mysql | awk '{print -N}' | tac) ; do history -d $h ; done; history -d $(history | tail -1 | awk '{print }') ; history`)->{$interval}()->emailOutputTo($email)->environments('prod');
我收到这个错误:
⚡️ app2020 php artisan schedule:run
ErrorException
Undefined variable: h
at app/Console/Kernel.php:44
注意到这是一个完美的工作命令
for h in $(history | grep mysql | awk '{print -N}' | tac) ; do history -d $h ; done; history -d $(history | tail -1 | awk '{print }') ; history
注: 我知道我可以通过将上面的命令添加到 crontab 来实现它,但目标是保持所有 cron 活动在 Laravel 项目
中组织由于 bash 和 PHP 使用 $
作为他们的变量,如何才能使类似的 bash 命令起作用?
任何提示,我都会接受。
您将命令包装在反引号中,这将插入变量并将值作为命令执行。这些你都不想要。
使用单引号构建命令,然后将其传递给exec()
。
$cmd = 'for h in $(history | grep mysql | awk \'{print -N}\' | tac) ;';
$cmd .= ' do history -d $h ;';
$cmd .= 'done;';
$cmd .= 'history -d $(history | tail -1 | awk \'{print }\') ;';
$cmd .= 'history';
$schedule
->exec($cmd)
->{$interval}()
->emailOutputTo($email)
->environments('prod');
对于更有效的方法,您可以尝试直接编辑历史文件。
$cmd = 'sed -i /mysql/d "$HOME/.bash_history"';
无需删除文件中的最后一个条目,因为它是交互式 shell 命令的历史记录。
显然,最好的办法是不要在命令行中放置“敏感”内容。对于 MySQL,这可以通过将凭据添加到 .my.cnf
文件来完成。