Я пытаюсь в конечном счете использовать функцию shell_exec
php для создания новых пользователей Linux. Однако я столкнулся с проблемами даже при отладке. Вот мой код
<?PHP function adduser($username,$password,$server){ try{ //3 debug statements $output=shell_exec("pwd"); echo $output; shell_exec("touch test.txt"); //3 debug statements are requested by Christian echo '<pre>'; print_r(execute('pwd')); print_r(execute('touch test.txt')); //actuall code $output=shell_exec("ssh root@$server \"adduser $username; echo $password | passwd $username --stdin\""); } catch(Exception $e){ echo 'could not add user '.$e->getMessage(); } } $servers = array('192.168.1.8'); foreach($servers as $server){ echo $_GET['USER']." ".$_GET['PASSWORD']; adduser($_GET['USER'],$_GET['PASSWORD'],$server); }
Операторы try-catch
ничего не делают, поэтому я полагаю, что ошибки оболочки не распространяются как ошибки PHP (Python тоже такой). Строка $output=shell_exec("pwd")
возвращает правильный каталог. Однако строка shell_exec("touch test.txt")
не создает файл test.txt файла (даже если я даю полный путь «/home/user/…/test.txt»).
Разумеется, фактический код для добавления пользователей также не работает.
EDIT Мне удалось исправить код. Ошибка touch test.txt
была touch test.txt
недостаточными разрешениями. Apache регистрируется с пользовательскими www-данными, я просто создал домашнюю папку для этого пользователя и следил за файлом в этой домашней папке.
Однако добавление трех отладочных заявлений в соответствии с запросами Христиана вызывает проблемы.
РЕДАКТИРОВАТЬ При дальнейшем проверке это связано с неспособностью ssh как root при регистрации в качестве пользовательских www-данных. ssh -v
возвращает debug1: read_passphrase: can't open /dev/tty: No such device or address
. Я предполагаю, что ssh спрашивает, что общий «вы хотите постоянно добавлять xxx в known_hosts», но я не могу ответить. Есть ли способ вручную добавить пользователя в список известных хостов?
shell_exec()
В общем случае вместо того, чтобы PHP выполнял несколько команд последовательно, я пишу сценарий оболочки, который делает все, что мне нужно, а затем вызываю его из PHP. В отладке есть еще одна ссылка в цепочке, и я нахожу, что я намного проще.
Что касается вашей команды SSH, поскольку apache выполняется как www-data
, как она регистрируется в рассматриваемой машине как root? Вы добавили ключ пользователя apache к удаленному компьютеру.
Пожалуйста, используйте мою функцию, найденную здесь .
Запустите следующий код и сообщите нам его вывод:
echo '<pre>'; print_r(execute('pwd')); print_r(execute('touch test.txt'));
Изменить: если вы хотите сделать мой скрипт более ориентированным на OO:
function execute_o($cmd,$in){ $out=execute($cmd,$in); if($out['return']!=0) throw new Exception('Error '.$out['return'].': '.$out['stderr'].'.'); }