Как установить флаги при использовании функции phpseclib ssh2 exec ()?

Я использую phpseclib и вам нужно сделать пару php-функций, которые позволят кому-то программно ssh на свой сервер и изменить пароль root, а также изменить пароль пользователя, который, возможно, забыли свой пароль (так что вам нужно войти в систему как корень).

Я пробовал использовать libssh2, но нашел, что это немного противно использовать. Теперь я смотрю на phpseclib, который кажется более надежным. Но когда я пытался использовать команду su, вот так:

echo $ssh->exec('su'); 

Я получаю ответ:

 su: must be run from a terminal 

и когда я пытаюсь использовать sudo:

 echo $ssh->exec('sudo passwd root'); 

Я получаю сообщение об ошибке:

 sudo: no tty present and no askpass program specified 

В любом случае, оказывается, что su отключен для прямого доступа ssh, но, взглянув на эту статью , вы можете сделать это со следующей командой:

 ssh -t -t -l 'username' 'host' 'su -' 

Это то, что в конечном итоге помогло мне в любом случае при входе в терминал с моего ноутбука (работает ubuntu), а затем я ввел свой пароль, а затем пароль root, чтобы закончить.

Цитирование с сайта, связанного с выше:

Ssh (используя -t) удаленный sshd для установки «псевдотерминального» канала в рабочий процесс, когда задано значение -t.

, ssh делает это, пока его stdin является терминалом.

, Но если stdin ssh не является терминалом, ssh не будет направлять sshd, чтобы установить
псевдотерминал, если не указано TWO -t:

эхо-пароль | ssh -t -t -l имя пользователя remote_host

, Таким образом, с -t -t (из ssh) sshd устанавливает псевдотерминал для клиентского процесса.

, Клиент, будь то «tty» или «su», не может сказать, что он подключен к фиктивному терминалу:

echo dummystr | ssh -t -t -l имя пользователя host.com -c '' tty '

эхо-пароль | ssh -t -t -l имя пользователя host.com -c 'su -'

Итак, есть ответ. Используйте double -t, если вы «su root'ing» в ящике Linux через интерактивный клиент ssh, такой как OpenBSD.

Таким образом, он фактически работал с терминалом, как я сказал выше, используя:

 ssh -t -t -l 'username' 'host' 'su -' 

но я действительно хочу иметь возможность выполнить эту команду, используя phpseclib. Единственное, что я не знаю, как вставить любые флаги в функцию exec (). В частности, мне нужно вставить флаги -t (дважды).

Я искал веков и ничего не могу найти. Будьте очень благодарны за помощь в этом. Извините за длину этого сообщения. 🙂

ура

Джо

Solutions Collecting From Web of "Как установить флаги при использовании функции phpseclib ssh2 exec ()?"

Если root sudo passwd требует tty try read () / write () в phpseclib. например.

 <?php include('Net/SSH2.php'); $ssh = new Net_SSH2('localhost', 22); $ssh->login('username', 'password'); $ssh->read('[prompt]'); $ssh->write("sudo passwd root\n"); $ssh->read('Password:'); $ssh->write("Password\n"); echo $ssh->read('[prompt]'); ?> в <?php include('Net/SSH2.php'); $ssh = new Net_SSH2('localhost', 22); $ssh->login('username', 'password'); $ssh->read('[prompt]'); $ssh->write("sudo passwd root\n"); $ssh->read('Password:'); $ssh->write("Password\n"); echo $ssh->read('[prompt]'); ?> 

На самом деле, я просто копирую / вставляю из вашего другого сообщения: php ssh2_exec не выполняет команду 'su'

Похоже, что вы тут же помогли, а затем остановились? Кто-то предложил вам добавить новые строки в свои команды. Вы попробовали это? Они также предложили размещать сообщения на форумах поддержки phpseclib. Похоже на то, что мне посоветовали …

Пока я смотрел на Net_SSH2 Net_SSH2 . Похоже, он использует сокеты для подключения к серверу. Таким образом, нет возможности пройти через -t дважды. Это не вызов ssh .

Поскольку вы упомянули libssh2 в своем вопросе, есть оболочка PEAR, которая ее поддерживает, может сделать что-то проще, код только в SVN в настоящее время. Net_SSH2 PEAR также называется Net_SSH2 , но отличается от Net_SSH2 от Net_SSH2 (запутывает).

Ознакомьтесь с кодом здесь:

Чтобы загрузить его, выполните проверку svn:

 svn co http://svn.php.net/repository/pear/packages/Net_SSH2/trunk/ ./Net_SSH2 

Небольшой пример:

 <?php require_once './Net_SSH2/Net/SSH.php'; $ssh = new Net_SSH2::factory('LibSSH2', array( 'login_name' => 'user', 'password' => 'pass', 'hostname' => 'example.org', 'command' => 'su -', )); $ssh->sshExec($std_output, $std_error); var_dump($std_output, $std_error); 

Это поможет?

Вы можете включить псевдотерминал, позвонив

 $ssh->enablePTY(); 

после входа в систему, но перед exec. Это не позволит ему жаловаться на отсутствующий tty.