У меня есть приложение, которое должно монтировать диск на сервере. Диск и сервер все подключены, он просто должен использовать команду linux 'mount'.
Я написал php, который просто:
<? exec("/var/www/MountTheDisk.sh"); ?>
И я добавил скрипт bash: MountTheDisk.sh
#!/bin/bash diskutil mount /dev/xvdb1 /mnt/theDisk/ echo trying to mount
Теперь, если я запустил этот php, я не получаю никакого результата. Ничего не происходит, и диск не монтируется. Как я могу запустить эту команду удаленно? Может быть, php не лучший метод?
Это решение, похоже, не работает. Я не знаю, почему, поскольку я не использовал SetUID со сценариями оболочки. Но я позволил этому ответу остаться здесь на всякий случай, если кто-то захочет обратиться к нему.
По соображениям безопасности я бы рекомендовал вам поместить ваш код в файл bash. Используйте бит SetUID для выполнения файла bash как root из любого другого пользователя. Таким образом, ваш файл не может быть записан кем-либо другим, кроме root, и вам не нужно обращаться с sudo. В противном случае вы разрешаете вашему php-процессу выполнять код как root, что в большинстве случаев является очень плохой идеей.
Причина, по которой вы не получаете какой-либо вывод, вероятно, связана с тем, что он запрашивает пароль, и нет возможности для его ввода.
Изменить: измените ваш php-вызов на:
<? exec("/var/www/MountTheDisk.sh"); ?>
Затем создайте файл bash (/var/www/MountTheDisk.sh) с некоторым содержимым, подобным этому
#!/bin/sh // this script will be executed as root diskutil mount /dev/xvdb1 /mnt/theDisk/ echo trying to mount
Теперь установите бит SetUID и измените владельца на root. (нужно сделать через корневую оболочку)
// make script executable chmod +x /var/www/MountTheDisk.sh // setuid bit chmod u+s /var/www/MountTheDisk.sh // change owner to root chown root:root /var/www/MountTheDisk.sh
Примечание. Любой пользователь может запустить этот файл. Любой вызов приведет к его выполнению с правами root.
Пользовательским www-data
Apache должны быть предоставлены привилегии для выполнения определенных приложений с использованием sudo
.
sudo visudo
. На самом деле мы хотим отредактировать файл в etc/sudoers
Для этого, используя sudo visudo
в терминале, он дублирует (temp) файл sudoers
для редактирования. www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, /bin/mount
(Предполагается, что вы хотите запустить команды restart
и mount
с использованием привилегий суперпользователя (root).)
Однако, если вы хотите запускать каждое приложение с использованием привилегий суперпользователя, добавьте следующее вместо того, что указано выше. Возможно, вы не хотите делать это, а не для ALL
команд, очень опасно.
www-data ALL=NOPASSWD: ALL
3. После редактирования файла sudoers (по visudo
мы редактируем временный файл sudoers
чтобы сохранить и закрыть файл temp (visudo) для записи в файле sudoers
. ( wq!
)
4. Вот что, теперь используйте exec()
следующим образом внутри вашего скрипта xxx.php
. не забудьте использовать sudo
перед использованием команды в скрипте php.
например: –
exec ("sudo /etc/init.d/smokeping restart 2>&1");
Поэтому в вашей проблеме добавьте команды, которые вы хотите использовать, к step no (2.)
когда я добавляю и изменяю ваш php-скрипт так, как вы хотите.