【问题标题】:Why does PHP backticks and SSH not return identical values?为什么 PHP 反引号和 SSH 不返回相同的值?
【发布时间】:2015-03-23 13:05:04
【问题描述】:

当我使用 ssh 命令行运行 ps cax 时,我得到以下信息:

user@dqeb ~ $ ps cax
PID TTY      STAT   TIME COMMAND
3277 ?        Ss    12:51 httpd
6797 ?        S      1:45 httpd
7190 ?        Ss     0:00 gpopd.pl
7291 ?        S      0:02 httpd
7303 ?        S      0:05 httpd
7309 ?        S      0:03 httpd
7336 ?        S      0:02 httpd
7361 ?        S      0:03 httpd
7419 ?        S      0:02 httpd
7426 ?        S      0:02 httpd
7427 ?        R      0:03 httpd
7440 ?        S      0:02 httpd
7457 ?        S      0:01 httpd
7468 ?        S      0:01 httpd
7504 ?        S      0:02 httpd
7743 ?        S      0:00 wrapper
7744 ?        Sl     0:00 java
7812 ?        S      0:00 qmail-local
7843 ?        S      0:00 qmail-local
7848 pts/3    R+     0:00 ps
8769 ?        Sl     0:00 sshd
8775 pts/5    Ss+    0:00 bash
9159 pts/2    S      0:00 su
9160 pts/2    S+     0:00 bash
9241 pts/5    S      0:00 gimap.pl
30334 ?        S      0:00 imap
30335 ?        S      0:00 imap
30340 ?        S      0:00 imap
30582 ?        Sl     0:00 sshd
30589 pts/3    Ss     0:00 bash

但是,当我运行以下 PHP 代码时:

$newline = chr(10);
$out = `ps cax`;
$out = str_replace($newline, '<br>', $out);
echo $out;

我明白了

7519 ? R 0:00 ps
15886 ? S 0:00 httpd
15890 ? S 0:00 httpd
15891 ? S 0:00 httpd
15917 ? S 0:00 httpd
15920 ? S 0:00 httpd
15930 ? S 0:00 httpd
15932 ? S 0:00 httpd
15933 ? S 0:00 httpd
16124 ? S 0:00 httpd
16125 ? S 0:00 httpd
16126 ? S 0:00 httpd
16128 ? S 0:00 httpd
16129 ? S 0:00 httpd
16130 ? S 0:00 httpd
16131 ? S 0:00 httpd
16134 ? S 0:00 httpd
16137 ? S 0:00 httpd
16138 ? S 0:00 httpd
16448 ? S 0:00 httpd

..这样持续了很长时间。

为什么我在同一台服务器上运行相同的命令时看不到相同的进程?我希望它们是相同的。

【问题讨论】:

  • 怀疑输出中有 tab 符号,但 HTML 呈现为简单的空格。尝试在
     元素中渲染输出
  • 我说的不是格式,而是实际的过程。
  • 请试试这个:sudo su www-data ps cax 如果进程列表不完整,请看下面我的回答。
  • @SofianeSadi 我没有根权限
  • 您是否以 httpd 用户身份运行该脚本?如果是这样,它将仅显示该用户可用的进程。

标签: php shell command shell-exec backticks


【解决方案1】:

当您通过 Web 浏览器运行 PHP 脚本时,它会以 www user 的形式执行,这是一个特权较低的脚本。您只能看到www 拥有的那些进程。这就是为什么您只看到httpdapache 子进程的原因。当您通过 shell 运行相同的脚本时,它会作为相应的用户(root 或您用于 ssh 的用户名)运行。该用户可能拥有比www user 更多的权限。所以你可以看到系统中运行的几乎所有进程。

如果您想在通过浏览器执行脚本时获得相同的结果,则需要升级www user 的权限,这是一个安全威胁。浏览您网站的任何人都将获得相同的权限,他们可以轻松破解您的服务器。所以我不会推荐它。

【讨论】:

  • 好答案。现在我需要找到一种安全的方法来以特定用户身份从我的 php 脚本运行 bash 命令。答案here 是个好方法吗?我应该问一个新问题吗?
  • 即创建一个cron来执行命令并将输出存储在一个文件中。然后只需读取文件并获取输出。
【解决方案2】:

如果您没有 root 访问权限: 创建一个文件“mypass.secret” [输入你的密码user@dqeb密码] 并来自 php:

$newline = chr(10);
$out = `sudo -u user -S ps cax < ~/mypass.secret`;
$out = str_replace($newline, '<br>', $out);
echo $out;

如果您有 root 访问权限:

您应该将 www-data 添加到您的 /etc/sudoers 文件中:

sudo visudo -f /etc/sudoers
www-data ALL=(ALL) NOPASSWD: ALL

那么您应该能够使用以下方法获取所有进程:

$newline = chr(10);
$out = `sudo ps cax`;
$out = str_replace($newline, '<br>', $out);
echo $out;

【讨论】:

  • 我猜 'sudo -u user -S ps cax
  • 这样做有什么安全隐患?它不会使服务器更容易受到入侵吗?
  • 第二个。第一个带有 'sudo -u user ...' 应该不会真正影响您的服务器安全。
  • 我试图忽略这一点,但我不能。您永远不应该允许公众以 root 身份运行某些东西。 Sudo 使命令以 root 身份运行。那是一个主要的不不不不不。您的问题是您想要一个进程,按照设计,它不应该能够看到机器上的所有进程,并且您试图强制它看到机器上的所有进程。你应该做的是问自己:为什么一大群人设计它,让这个进程看不到机器上运行的所有进程?
  • 是的,我真的太害怕安全问题,甚至不敢尝试
猜你喜欢
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
  • 2017-05-22
  • 2014-02-10
  • 1970-01-01
相关资源
最近更新 更多