Вот что я пытаюсь сделать. Я пытаюсь запустить двоичный файл под другим пользователем, через скрипт 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"');
Не будет работать из-за того, как написан бинарный файл (он не найдет свои ресурсы, если вы не перейдете в папку раньше, протестировано на терминале)
Если у всех есть доступ к /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
соответственно).
Это проверенная строка оболочки, которую нам нужно запустить как конкретный пользователь:
cd /home/test/cs && ./hlds_run
Мы можем гарантировать, что он всегда работает как конкретный пользователь с sudo
, но sudo
использует execve семантику. Мы должны преобразовать нашу строку оболочки в execve
массив, и так как эта команда А. опирается на функциональность оболочки, как cd
и B. не включает динамические значения, лучший способ сделать это — просто вызвать оболочку, чтобы дословно интерпретировать ее:
{ sh
, -c
, cd /home/test/cs && ./hlds_run
}
Теперь мы можем подать заявку sudo
работать как наш конкретный пользователь:
{ sudo
, -u
, test
, sh
, -c
, cd /home/test/cs && ./hlds_run
}
passthru
работает как оболочка, так что теперь мы должны преобразовать execve
массив выше обратно в строку оболочки, с особой осторожностью обращаясь к кавычкам, чтобы оболочка проанализировала его в точном списке аргументов выше. К счастью, это относительно простой случай:
sudo -u test sh -c "cd /home/test/cs && ./hlds_run"
Теперь мы можем дать его passthru
:
passthru('sudo -u test sh -c "cd /home/test/cs && ./hlds_run"');
Вы пробовали это? (убедитесь, что у вас есть право exec для hlds_run)
passthru('bash -c "sudo -u test && /home/test/cs/hlds_run"');