Я попытался запустить команду su с функцией PHP shell_exec. Сначала попробовал:
<?php
echo(shell_exec('echo \'password\' | su user -c \'whoami\' 2>&1;'));
?>
и я получил:
su: must be run from a terminal
Затем я прочитал о порождении терминала с помощью python pty и поместил его в код оболочки:
<?php
echo(shell_exec('echo "if [ -t 1 ] ; then echo "terminal found"; fi; echo \'password\' | su user -c \'whoami\'; exit" | python -c \'import pty; pty.spawn("/bin/bash")\' 2>&1;'));
?>
и вот результат:
if [ -t 1 ] ; then echo terminal found; fi; echo 'password' | su user -c 'whoami'; exit
www-data@server:/some/directory$ if [ -t 1 ] ; then echo terminal found; fi; echo 'password' | su user -c 'whoami'; exit
terminal found
su: must be run from a terminal
exit
Есть идеи, почему pty не работает, или какой другой инструмент мне следует использовать для создания терминала? PHP работает за Apache в Debian.
EDIT: я ищу обходной путь, который не требует физического доступа к серверу или подключения через SSH. Предположим, я хочу использовать su для запуска sshd, и только рабочие серверы - это FTP и Apache.
Ответ (не решение) просто ты не можешь.
Хороший админ всегда будет этому препятствовать. Это очень плохая идея, и вы знаете, что вам следует избегать ее и использовать лучшее решение.
Например. установить просто флаг через php (FTP или любой другой метод)
Т.е. запланировать некоторые действия (например, перезапустить SSH-сервер), когда определенный флаг установлен через php (например, присутствует файл, ответ json или значение db).
Триггер может быть любым из PHP, но ключ в том, что действие должно быть предварительно определено и иметь надежный ожидаемый результат с резервным вариантом, когда часть php выходит из строя (например, когда кому-то удается запустить часть php без вашего разрешения) .
Другим решением может быть написание сценариев bash, выполняющих необходимые действия, настройка доступа к этим сценариям без пароля (в sudoers
файл) и запустить их через php.
Запускать что-либо, связанное с su, через PHP на веб-сервере - очень плохая идея. Это открывает слишком много возможностей для компрометации сервера.
Если какой-то конкретный исполняемый файл необходимо запустить от имени пользователя root, вы можете использовать sudo
механизм для этого. К сожалению, настройка sudo
требует довольно много усилий.
Если необходимо использовать su
из вашей программы php, то правильный способ - использовать его через expect
. Вы можете использовать небольшой скрипт:
#!/use/bin/expect -f
spawn "su some_user -c cmd.sh"
expect {
ssword: { send "myStrongPass\r" }
}
interact
Но вы должны знать, что это создает угрозу безопасности - вы храните открытый текстовый пароль пользователя в файле, доступном для чтения веб-сервером. И этот пользователь имеет доступ к sudo
.. Надо хорошенько подумать.
Мой друг показал мне, как получить tty, а затем su.
<?php
shell_exec('nc -l -p 1234 -c /bin/sh');
?>
Затем вам нужно подключиться к порту 1234 по telnet и ввести следующие команды:
python -c 'import pty; pty.spawn("/bin/sh")'
tty
и он отлично работает.
Вместо бега su
напрямую, запустите его через sudo
Убедитесь, что вы дали пользователю Apache разрешение делать это без пароля, поэтому это будет так просто, как: sudo su …
. Вы также можете (и вам лучше) ограничить, какие команды должны запускаться, используя sudo
сопоставление с образцом и, конечно, вы можете использовать sudo
сам без вызова su
.