Как установить флаги при использовании функции phpseclib ssh2 exec ()? - PullRequest
3 голосов
/ 20 апреля 2011

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

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

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

echo password |ssh -t -t -l username удаленный_хост

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

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

echo dummystr |ssh -t -t -l username host.com -c '' tty '

пароль эха |ssh -t -t -l username host.com -c 'su -'

Итак, ответ есть.Используйте double -t, если вы 'su root'ing' на компьютере с Linux через> интерактивный клиент ssh, подобный OpenBSD.

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

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

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

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

Ура

Джо

Ответы [ 3 ]

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

Если 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 не выполняет команду 'su'

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

2 голосов
/ 23 ноября 2015

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

$ssh->enablePTY();

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

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

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

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

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

Чтобы скачать его, выполните svn checkout с:

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);

Это поможет?

...