为什么 PHP 反引号和 SSH 不是 return 相同的值?
Why does PHP backticks and SSH not return identical values?
当我 运行 ps cax
使用我的 ssh 命令行时,我得到以下信息:
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
..这样持续了很长时间。
当我 运行 在同一台服务器上执行相同的命令时,为什么看不到相同的进程?我希望它们是相同的。
如果您没有根访问权限:
创建文件 '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;
当您通过 Web 浏览器 运行 一个 PHP 脚本时,它作为 www user
执行,这是一个较低特权的脚本。您只能看到 www
拥有的进程。这就是为什么您只看到 httpd
即 apache
子进程的原因。当您通过 shell 运行 相同的脚本时,它 运行 作为相应的用户(root 或您用于 ssh 的用户名)。该用户可能拥有比 www user
更多的权限。所以你可以看到系统中几乎所有的进程运行ning。
如果你想在通过浏览器执行脚本时获得相同的结果,你需要升级 www user
的权限,这是一个安全威胁。浏览您网站的任何人都将获得相同的权限,他们可以轻松破解您的服务器。所以我不会推荐它。
当我 运行 ps cax
使用我的 ssh 命令行时,我得到以下信息:
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
..这样持续了很长时间。
当我 运行 在同一台服务器上执行相同的命令时,为什么看不到相同的进程?我希望它们是相同的。
如果您没有根访问权限: 创建文件 '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;
当您通过 Web 浏览器 运行 一个 PHP 脚本时,它作为 www user
执行,这是一个较低特权的脚本。您只能看到 www
拥有的进程。这就是为什么您只看到 httpd
即 apache
子进程的原因。当您通过 shell 运行 相同的脚本时,它 运行 作为相应的用户(root 或您用于 ssh 的用户名)。该用户可能拥有比 www user
更多的权限。所以你可以看到系统中几乎所有的进程运行ning。
如果你想在通过浏览器执行脚本时获得相同的结果,你需要升级 www user
的权限,这是一个安全威胁。浏览您网站的任何人都将获得相同的权限,他们可以轻松破解您的服务器。所以我不会推荐它。