php shell_exec touch redirect и adduser

Я пытаюсь в конечном счете использовать функцию 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», но я не могу ответить. Есть ли способ вручную добавить пользователя в список известных хостов?

Related of "php shell_exec touch redirect и adduser"

  • Многие (большинство?) Внутренних функций PHP не генерируют исключений, они вызывают ошибки. Я не думаю, что вы когда-нибудь увидите исключение, shell_exec()
  • Я мог бы var_dump () вернуть значение, просто чтобы убедиться, что вы явно знаете, что он возвращается.
  • Я также предлагаю изучить функции, такие как escapeshellarg (), чтобы избежать проблем с вашим вводом.

В общем случае вместо того, чтобы 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'].'.'); }