linux — запустить команду bash через PHP, изменить dir, а затем выполнить бинарный файл

Вот что я пытаюсь сделать. Я пытаюсь запустить двоичный файл под другим пользователем, через скрипт PHP. Apache имеет доступ sudo. Команда работает нормально, когда запускается через putty, вошедшего в систему как «test».

passthru('bash -c "sudo -u test cd /home/test/cs/ ; ./hlds_run"');

также могу ли я добавить, что

passthru('bash -c "sudo -u test ./home/test/cs/hlds_run"');

Не будет работать из-за того, как написан бинарный файл (он не найдет свои ресурсы, если вы не перейдете в папку раньше, протестировано на терминале)

0

Решение

Если у всех есть доступ к /home/test/cs:

passthru('cd /home/test/cs && sudo -u test ./hlds_run');

Если бы только пользователь test имеет доступ к каталогу:

passhtru('sudo -u test sh -c "cd /home/test/cs && ./hlds_run"');

Чтобы прийти ко второму вызову, вы должны быть уже знакомы с system против execve семантика (используется passthru а также sudo соответственно).

  1. Это проверенная строка оболочки, которую нам нужно запустить как конкретный пользователь:

    cd /home/test/cs && ./hlds_run

  2. Мы можем гарантировать, что он всегда работает как конкретный пользователь с sudo, но sudo использует execve семантику. Мы должны преобразовать нашу строку оболочки в execve массив, и так как эта команда А. опирается на функциональность оболочки, как cd и B. не включает динамические значения, лучший способ сделать это — просто вызвать оболочку, чтобы дословно интерпретировать ее:

    { sh, -c, cd /home/test/cs && ./hlds_run }

  3. Теперь мы можем подать заявку sudo работать как наш конкретный пользователь:

    { sudo, -u, test, sh, -c, cd /home/test/cs && ./hlds_run }

  4. passthru работает как оболочка, так что теперь мы должны преобразовать execve массив выше обратно в строку оболочки, с особой осторожностью обращаясь к кавычкам, чтобы оболочка проанализировала его в точном списке аргументов выше. К счастью, это относительно простой случай:

    sudo -u test sh -c "cd /home/test/cs && ./hlds_run"

  5. Теперь мы можем дать его passthru:

    passthru('sudo -u test sh -c "cd /home/test/cs && ./hlds_run"');

1

Другие решения

Вы пробовали это? (убедитесь, что у вас есть право exec для hlds_run)

passthru('bash -c "sudo -u test && /home/test/cs/hlds_run"');
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector