【问题标题】:How to see the console history of all commands in my Linux server?如何查看我的 Linux 服务器中所有命令的控制台历史记录?
【发布时间】:2015-03-02 15:06:54
【问题描述】:

我正在寻找一种方法来查看服务器中回显的历史记录。 我正在使用 GitHub webhook,当自动部署发生时,会执行一个带有 echo 的脚本。例如下面的代码:

<?php
try
{
  $payload = json_decode($_REQUEST['payload']);
    echo 'payload is received; ';
}
catch(Exception $e)
{
    echo 'no payload; ';
  exit(0);
}

if ($payload->ref === 'refs/heads/development')
{   echo 'received updated in dev branch; bash/deploy_frontend2dev.sh ';
    exec('sh /var/www/html/bash/deploy_frontend2dev.sh', $output);
    var_dump($output);
}
else 
echo 'smth is called';

我知道您可以使用$ history 查看命令的历史记录,但是当我这样做时,它不会显示已回显的文本,而只会显示已运行的命令。反正有看吗?此外,如果您注意到代码中有一个var_dump,它也会打印到屏幕上。

顺便说一句,发生在 PHP 脚本中的 exec 就是这样做的:

cd /var/www/html/ezmob-frontend/;

git pull origin development;
echo "pulling file from dev branch";

rm -R ../dashboard;
echo "dashboard is updated";

unzip ezmob-frontend-built.zip -d ../;

chmod 777 -R dashboard;

这也应该回显一些文本,但没有显示任何内容。

【问题讨论】:

  • 如果您从命令行运行,您可以写入如下文件:php file.php &gt; output.txt。这会将所有输出写入output.txt 供您稍后阅读(或发送电子邮件)。您也可以使用脚本的 exec() 部分来执行此操作。
  • 我知道现在全小写被认为是时尚的,至少在某些方面是这样。但是,我们喜欢这里写得好且易于阅读的问题,所以如果您偶尔可以使用 Shift 键,我们将不胜感激 - 并且可以为编辑节省一些工作。
  • 我该怎么做?我应该在哪里写什么命令?

标签: php linux server


【解决方案1】:

设置 GitHub 网络挂钩。

正如您在问题中解释的那样,您已经有过这方面的经验,但是...

设置另一个脚本(监听器)来监听 GitHub 以将更新推送到您的脚本。然后,此侦听器将通过 exec() 调用您的其他脚本,该脚本会将所有输出写入文本文件。

使 GitHub webhook 指向脚本 listener.php

listener.php 中,添加以下内容:

<?php

//Run the file to run the auto-deployment and write all output to your log file.
$logfile = '/var/log/github-deployment/log_'. date('d-m-y_G:i:s') .'.log';
exec('php auto-deployment-is-a-go.php \''. http_build_query(json_decode($_POST['payload'], true)) .'\' > '. $logfile); 

(确保您已创建目录 /var/log/github-deployment/ 并且可写 - 或更改创建日志文件的路径)。

看到这个关于exec()的问题:How to pass parameters from command line to $_POST in php-script?

工人

现在侦听器已将命令传递给工作人员 (auto-deployment-is-a-go.php) 以完成其工作,您不必担心日志记录,因为侦听器中的 exec() 命令会将输出写入日志文件。

例如,您必须将您的 $payload 值更改为使用 parse_str

<?php
$payload = null;
parse_str($argv[1], $payload);

try {
  if( $payload == null ) {
      throw new Exception("no payload detected");
  } 
} catch(Exception $e) {
   die($e->getMessage());
}

// ...

完成后通知您

一般情况下,您不希望通过日志进行推送。因此,让系统通过电子邮件将输出发送给您。因此,在您的 listener.php 脚本中,您将拥有(在您调用 exec() 之后);

exec("echo 'Pushed to live. Log files attached' > /tmp/pushtolive.txt");
exec("/bin/mail -s \"Pushed to live!\" -a '. $logfile .' \"email@company.com\" < /tmp/pushtolive.txt");

从命令行发送电子邮件请参阅此答案:https://serverfault.com/a/194388/207143

【讨论】:

  • 感谢您的回答。但是我不能在输出中使用“file_put_contents()”吗?
  • 并将要回显的文本存储在变量中,并将其添加到“file_put_contents()”中。
  • 你可以的。虽然我更喜欢 bash 方法,但无论哪种方式最适合您的环境和应用程序
猜你喜欢
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
  • 2011-11-16
  • 2017-10-21
  • 2013-02-13
  • 2011-10-21
  • 2015-05-11
相关资源
最近更新 更多