А не лучше сделать владельцем скрипта рута и поставить suid-бит? Только надо быть на все 100% уверенным, что скрипт ничего не натворит, и никакой rootkit через него не залезет. И да, такой скрипт - хороший backdoor, можно вообще сделать http-терминал с правами рута, и, как только уволили... :)
case «${command}» in
fs.ls)
/bin/ls ${args}
;;
sys.user.list)
getent passwd
;;
*)
echo 'Unknown command'
;;
esac
exit 0
Далее /etc/xinetd.d/my_root_proga:
service my_root_proga
{
id = myRootProgaId
type = UNLISTED
disable = no
port = 2345
socket_type = stream
protocol = tcp
wait = no
user = root
passenv = PATH
server = /usr/local/sbin/my_root_proga.sh
env = HOME=/tmp
bind = 127.0.0.1 # или просто закомментарьте
}
Далее:
killall -HUP xinetd
Далее, (если параметр 'bind' не был указан в настройке xinetd) /etc/hosts.allow:
myRootProgaId: <ip-адреса, кто может стучаться к сервису>
Далее, если есть SELinux:
semanage port --add --type 'http_port_t' 12345
/прочие системы укрепления безопасности уже изучайте сами/
Далее, из php открывайте сокет и пишите в него
<пароль> <команда> <параметры>
Читайте из него ответ. Всё.
если я правильно понял я должен сначала создать сокет и передать в него параметры при помощи функции socket_write(). Можете все таки набрасать небольшой примерчик «для лучшего уразумения» правильного вызова socket_write().
если я правильно понял скрипт не должен крутится постоянно его перезапустит сам xinetd? . И строку вы указали только для теста read secret command args или ее наличие необходимо?
браузер ожидает до бесконечности, к самому демону подсоединится могу по
#telnet localhost xxx [enter]
ля-ля [enter]
permissions denied.
#
Вроде все правильно.
«ля-ля» конечно так для проверки. что не так?