Я использую 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 (дважды).
Я искал целую вечность и ничего не мог найти. Будьте очень благодарны за некоторую помощь в этом. Извините также за длину этого поста. :)
Ваше здоровье
Джо
Net_SSH
иNet_SSH2
. Что вы используете? :) - person Till   schedule 23.04.2011