如何查看我的 Linux 服务器中所有命令的控制台历史记录


How to see the console history of all commands in my Linux server?

我正在寻找一种方法来查看服务器中回显内容的历史记录。我正在使用 GitHub 网络钩子,当发生自动部署时,会执行带有 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 脚本中发生的可执行文件是这样做的:

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;

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

设置 GitHub webhook。

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

设置另一个脚本(侦听器(来侦听 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()的问题:如何在php脚本中将参数从命令行传递到$_POST?

工人

现在侦听器已经将命令传递给工作线程(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