首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在中执行长多Bash命令

问在中执行长多Bash命令
EN

Stack Overflow用户
提问于 2020-12-04 20:41:57
回答 1查看 183关注 0票数 0

我正试图通过Laravel调度程序每天从服务器上删除敏感的历史命令

当我运行这段代码时:

代码语言:javascript
复制
$schedule->exec(`for h in $(history | grep mysql | awk '{print $1-N}' | tac) ; do history -d $h ; done; history -d $(history | tail -1 | awk '{print $1}') ; history`)->{$interval}()->emailOutputTo($email)->environments('prod');

我知道这个错误:

代码语言:javascript
复制
⚡️  app2020  php artisan schedule:run                                                                                                             
                                                                                                                                                   
   ErrorException                                                                                                                                  
                                                                                                                                                   
  Undefined variable: h                                                                                                                            
                                                                                                                                                   
  at app/Console/Kernel.php:44

注意到这是一个完美的工作命令。

代码语言:javascript
复制
for h in $(history | grep mysql | awk '{print $1-N}' | tac) ; do history -d $h ; done; history -d $(history | tail -1 | awk '{print $1}') ; history

注意:我知道我可以通过将上面的命令添加到crontab来实现,但目标是将所有cron活动组织在Laravel项目中。

由于bash和PHP使用$作为它们的变量,那么如何使类似的bash命令工作呢?

任何暗示,我都会接受的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-04 21:14:01

您正在用backticks包装您的命令,这既可以插入变量,也可以作为命令执行该值。你不想要这两样东西。

使用单引号构建命令,然后将其传递给exec()。

代码语言:javascript
复制
$cmd =  'for h in $(history | grep mysql | awk \'{print $1-N}\' | tac) ;';
$cmd .= '    do history -d $h ;';
$cmd .= 'done;';
$cmd .= 'history -d $(history | tail -1 | awk \'{print $1}\') ;';
$cmd .= 'history';

$schedule
    ->exec($cmd)
    ->{$interval}()
    ->emailOutputTo($email)
    ->environments('prod');

为了获得更有效的方法,您可以尝试直接编辑历史文件。

代码语言:javascript
复制
$cmd = 'sed -i /mysql/d "$HOME/.bash_history"';

没有必要删除文件中的最后一个条目,因为它是交互式shell命令的历史记录。

显然,最好的做法是不要把“敏感”的东西放在命令行中。对于MySQL,可以通过向.my.cnf文件添加凭据来实现这一点。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65150445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档