На сервере установлен антивирус для сканирования файлов (Антивирус Касперского 8.0 для Linux File Servers). Когда пользователь сайта загружает файл на сервер, надо проверить файл на наличие вируса. С консоли все работает, например:
sudo-s / opt/kaspersky/kav4fs/bin/kav4fs-control - scan-file / var/www/file.exe
Могу ли я запускать команду без sudo? Мне нужно методом php вызвать эту команду.
Я добавил в /etc /sudoers:
username ALL = NOPASSWD: / opt/kaspersky/kav4fs/bin/kav4fs-control
но это не помогло. Могу ли я запустить команду например методом eхес() или другим методом php?
Сам метод exec работает, так как echo(exec('whoami')); выводит - ngnix. То есть команда запускается от юзера ngnix

/etc /sudoers:
nginx    ALL=(ALL)    ALL
nginx ALL=NOPASSWD: /opt/kaspersky/kav4fs/bin/kav4fs-control

Вроде все права на исполение команды дал, но запустить так и не могу без sudo. По этому не могу запустить команду с php

2

vadim.draganyuk пишет:

но запустить так и не могу без sudo.

Почему вы решили, что будет работать без sudo?

Вы как раз разрешаете вызов определённой команды посредством sudo без запроса пароля.

Ну я только предполагаю что будет работать, не уверен. Но в принципе если зайдя из под пользователя, от имени которого выполняется php-скрипт  смогу успешно запустить команду и она успешно выполнится, тогда с php будет то же самое.
С точностью до ограничения на время выполнения и память

4

vadim.draganyuk пишет:

Ну я только предполагаю что будет работать, не уверен. Но в принципе если зайдя из под пользователя, от имени которого выполняется php-скрипт  смогу успешно запустить команду и она успешно выполнится, тогда с php будет то же самое.
С точностью до ограничения на время выполнения и память

Ещё раз, вот эта строка в файле /etc/sudoers позволит указанному пользователю делая вызов указанной команды посредством sudo не вводить пароль

vadim.draganyuk пишет:

username ALL = NOPASSWD: / opt/kaspersky/kav4fs/bin/kav4fs-control

а не запускать указанную команду от root без sudo.

Поэтому вам нужно вызывать в php "sudo /opt/kaspersky/kav4fs/bin/kav4fs-control ..."

5 (30.07.2014 13:15:35 отредактировано vadim.draganyuk)

Я уже пробовал этот вариант. Пробовал даже через файлы sh исполнить команду. Когда вывожу ошибки исполнения команды то пишет 126 ошибку

6

vadim.draganyuk пишет:

На сервере установлен антивирус для сканирования файлов (Антивирус Касперского 8.0 для Linux File Servers). Когда пользователь сайта загружает файл на сервер, надо проверить файл на наличие вируса.

Я бы вообще не стал вписывать в код сервера запуск каких либо задач. Есть inotifywait. Контролирует файловую систему, определенный каталог. И по наступлению определенных событий можно вызвать нужный обработчик. Тот же антивирусный сканнер. Ну а дальше - принимай решение по результатам анализа. Скрипт там элементарный, на пару команд всего.

Cruiser78 пишет:
vadim.draganyuk пишет:

На сервере установлен антивирус для сканирования файлов (Антивирус Касперского 8.0 для Linux File Servers). Когда пользователь сайта загружает файл на сервер, надо проверить файл на наличие вируса.

Я бы вообще не стал вписывать в код сервера запуск каких либо задач. Есть inotifywait. Контролирует файловую систему, определенный каталог. И по наступлению определенных событий можно вызвать нужный обработчик. Тот же антивирусный сканнер. Ну а дальше - принимай решение по результатам анализа. Скрипт там элементарный, на пару команд всего.

Дело в том, что я пишу файловое хранилище, что то типу дропбокса, и мне нужно проверить файл именно при загрузке пользователем на сайт(сервер) и записать в базу информацию, проверен он или нет, вирус или нет, по этому нужно через методы php

8

vadim.draganyuk пишет:

Дело в том, что я пишу файловое хранилище, что то типу дропбокса, и мне нужно проверить файл именно при загрузке пользователем на сайт(сервер) и записать в базу информацию, проверен он или нет, вирус или нет, по этому нужно через методы php

Так inotifiwait как раз и вызовет проверку файла, как только он будет загружен на сервер (станет файлом в файловой системе). Как только кончится загрузка, произойдет соответствующее событие файловой системы. По нему дернется проверочный скрипт, в котором вы вполне сможете решить, что именно дальше делать. Например, помимо антивирусной проверки посчитать хэш файла и решить - есть ли такой файл в вашем хранилище или нет. И если есть - то новую копию не хранить, а сделать хардлинк на существующий файл. Или что еще придумать... Естественно и в базу нужную информацию записать...

У меня на этом inotifywait реализована антивирусная защита файлового сервера. Если там появляется новый файл или имеющийся файл изменяется - вызывается проверочный скрипт. А там - если файл "заражен", то он переносится в карантин. А юзеру, владельцу этого файла, идет соответствующий е-мейл с уведомлением.

В чем достоинство inotifywait - каким бы Вы образом не закидывали свой файл на сервер (а вдруг способов будет много?) файл всегда пройдет стандартные проверочные процедуры. В отличие от проверки, реализованной в одном загружающем модуле. А появится второй-третий? А потом - решите добавить ftp...