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

Я использую phpseclib, и мне нужно сделать пару функций php, которые позволяют кому-то программно подключаться к серверу по ssh и изменить пароль root, а также изменить пароль пользователя, который, возможно, забыл свой пароль (поэтому необходимо войти в систему как 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 ssh не является терминалом, ssh не будет указывать sshd для установки псевдотерминала
, пока не будут заданы ДВА -t:

эхо-пароль | ssh -t -t -l имя пользователя удаленный_хост

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

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

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

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

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

Итак, это действительно работало с терминала, как я сказал выше, используя:

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

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

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

Ваше здоровье

Джо


person Joe    schedule 20.04.2011    source источник
comment
Вы можете поделиться, какую библиотеку вы уже используете. Мне пришлось погуглить phpseclib, а затем я обнаружил две реализации ssh.   -  person Till    schedule 23.04.2011
comment
Ах, извините. Я использую то, что считаю последней версией phpseclib: v 1.53.   -  person Joe    schedule 23.04.2011
comment
Нет, я имею в виду, что phpseclib упоминает Net_SSH и Net_SSH2. Что вы используете? :)   -  person Till    schedule 23.04.2011


Ответы (3)


Если для sudo passwd root требуется tty, попробуйте 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 ssh2_exec не выполняется команда "су"

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

person rhinestone    schedule 24.04.2011
comment
Я все равно не понимаю, как пример Тилля будет работать. su - запрашивает пароль, не так ли? Где, в примере с Тиллом, предоставляется пароль для su? Есть пароль для входа по SSH на сервер, но нет пароля для выполнения su... Кроме того, когда я выполняю поиск в Google, я вижу Net_SSH1 и Net_SSH2 для phpseclib. Не Net_SSH и Net_SSH2. Я думаю, это важно, потому что есть два разных протокола SSH — SSH1 и SSH2. Похоже, что один класс будет соответствовать одному, а другой класс будет соответствовать другому... - person rhinestone; 24.04.2011
comment
Зависит - я думаю, вы могли бы использовать sudo вместо этого. Это может быть лучшим вариантом. - person Till; 26.04.2011

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

$ssh->enablePTY();

после входа в систему, но до выполнения exec. Это предотвратит жалобы на отсутствие tty.

person Benubird    schedule 23.11.2015

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

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

Проверьте код здесь:

Чтобы загрузить его, выполните проверку 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);

Это поможет?

person Till    schedule 23.04.2011
comment
Спасибо Тилль. Еще нет времени проверить это, но я сделаю это. Отправлю назад, как только сделаю. - person Joe; 25.04.2011