Я использую 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 (дважды).
Я искал веков и ничего не могу найти. Будьте очень благодарны за помощь в этом. Извините за длину этого сообщения. 🙂
ура
Джо
Если 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.