Как сделать системный вызов удаленно?

У меня есть приложение, которое должно монтировать диск на сервере. Диск и сервер все подключены, он просто должен использовать команду 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 .

  1. Запустите команду sudo visudo . На самом деле мы хотим отредактировать файл в etc/sudoers Для этого, используя sudo visudo в терминале, он дублирует (temp) файл sudoers для редактирования.
  2. В конце файла добавьте следующий ex: -если мы хотим использовать команду для перезапуска smokeping и команду mount для другого действия,

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-скрипт так, как вы хотите.