php shell_exec touch redirect и adduser - PullRequest
       8

php shell_exec touch redirect и adduser

2 голосов
/ 18 апреля 2011

Я пытаюсь в конечном итоге использовать функцию php shell_exec для создания новых пользователей 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 была вызвана недостаточными разрешениями.Apache входит в систему с пользовательскими данными www, я просто создал домашнюю папку для этого пользователя и позаботился о том, чтобы прикоснуться к файлу в этой домашней папке.

Добавление трех операторов отладки в соответствии с запросами Кристиана,Однако сейчас возникают проблемы.

РЕДАКТИРОВАТЬ При дальнейшей проверке это связано с невозможностью использовать ssh как root при входе в систему как пользовательские www-данные.ssh -v возвращает debug1: read_passphrase: can't open /dev/tty: No such device or address.Я предполагаю, что ssh спрашивает, что общий "вы хотели бы добавить xxx навсегда к известному_хосту", но я не могу ответить.Есть ли возможность вручную добавить пользователя в список известных хостов?

Ответы [ 2 ]

1 голос
/ 18 апреля 2011

Пожалуйста, используйте мою функцию , найденную здесь .

Запустите следующий код и сообщите нам его вывод:

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'].'.');
}
1 голос
/ 18 апреля 2011
  • Многие (большинство?) Внутренних функций PHP не выдают исключений, они вызывают ошибки.Я не думаю, что вы когда-нибудь увидите исключение, выданное shell_exec()
  • Я мог бы var_dump () вернуть значение, просто чтобы убедиться, что вы явно знаете, что оно возвращается.
  • Я бы также предложил рассмотреть такие функции, как escapeshellarg () , чтобы избежать проблем с вашим вводом.

В общем случае вместо того, чтобы PHP выполнял несколькопоследовательно, я пишу сценарий оболочки, который делает все, что мне нужно, а затем вызываю его из PHP.При отладке в цепочке на одну ссылку меньше, и я нахожу, что мне намного проще.

Что касается самой вашей команды SSH, поскольку apache выполняется как www-data, как он входит в систему на рассматриваемом компьютере?как корень?Вы добавили ключ пользователя apache на удаленный компьютер?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...