Почему PHP backticks и SSH не возвращают одинаковые значения?

Когда я запускаю 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

..и так продолжается довольно долго.

Почему я не вижу одни и те же процессы, когда запускаю одну и ту же команду на одном сервере? Я ожидал, что они будут идентичными.


person Coert Grobbelaar    schedule 23.03.2015    source источник
comment
Подозреваю, что в выводе есть символы tab, но HTML отображается как простые пробелы. Попробуйте отобразить вывод в элементе ‹pre›   -  person phts    schedule 23.03.2015
comment
Я не про форматирование, а собственно процессы.   -  person Coert Grobbelaar    schedule 23.03.2015
comment
Попробуйте это, пожалуйста: sudo su www-data ps cax Если список процессов неполный, см. мой ответ ниже.   -  person Sofiane Sadi    schedule 23.03.2015
comment
@SofianeSadi У меня нет корневых прав   -  person Coert Grobbelaar    schedule 23.03.2015
comment
Вы запускаете этот скрипт как пользователь httpd? Если это так, он покажет только процессы, доступные этому пользователю.   -  person Mike Brant    schedule 23.03.2015


Ответы (2)


Когда вы запускаете PHP-скрипт через веб-браузер, он выполняется как www user, что является менее привилегированным. Вы можете видеть только те процессы, которыми владеет www. Вот почему вы видите только httpd дочерних процессов apache. Когда вы запускаете тот же скрипт через оболочку, он запускается от соответствующего пользователя (root или имя пользователя, которое вы использовали для ssh). Этот пользователь может иметь больше привилегий, чем www user. Таким образом, вы можете видеть почти все процессы, запущенные в системе.

Если вы хотите получить такой же результат при выполнении скрипта через браузер, вам необходимо повысить привилегию www user, что является угрозой безопасности. Любой, кто просматривает ваш сайт, получит такую ​​же привилегию, и они могут легко взломать ваш сервер. Так что рекомендовать не буду.

person Harikrishnan    schedule 23.03.2015
comment
Хороший ответ. Теперь мне нужно найти безопасный способ запустить команду bash из моего php-скрипта от имени определенного пользователя. Является ли ответ здесь хорошим способом? Должен ли я задать новый вопрос? - person Coert Grobbelaar; 24.03.2015
comment
т.е. создать cron для выполнения команды и сохранить результат в файле. Затем просто прочитайте файл и получите вывод. - person Harikrishnan; 24.03.2015

Если у вас нет root-доступа: Создайте файл «mypass.secret» [Введите пароль user@dqeb password] И из php:

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

если у вас есть root-доступ:

Вы должны добавить www-данные в ваш файл /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;
person Sofiane Sadi    schedule 23.03.2015
comment
Я предполагаю, что часть «sudo -u user -S ps cax ‹ ~/mypass.secret» должна быть в обратных кавычках? - person Coert Grobbelaar; 23.03.2015
comment
Каковы последствия этого для безопасности? Не сделает ли это сервер более уязвимым для вторжения? - person Coert Grobbelaar; 24.03.2015
comment
Второй будет. Первый с «sudo -u user ...» не должен сильно влиять на безопасность вашего сервера. - person Sofiane Sadi; 24.03.2015
comment
Я пытался игнорировать это, но не могу. Вы никогда не должны позволять широкой публике запускать что-либо от имени пользователя root. Sudo запускает команду от имени пользователя root. Это главное нет нет нет нет нет. Ваша проблема в том, что вам нужен процесс, который по замыслу не должен видеть все процессы на машине, и вы пытаетесь заставить его видеть все процессы на машине. Что вы должны сделать, так это спросить себя: почему большая группа людей спроектировала его таким образом, что этот процесс не может видеть все процессы, работающие на машине? - person kainaw; 24.03.2015
comment
Да, я, честно говоря, слишком боялся проблем с безопасностью, чтобы даже попробовать это. - person Coert Grobbelaar; 26.03.2015