2016-07-26 2 views
1

Я использую phpseclib для вызова команды ssh из php.как запустить команду ubuntu с правами root с помощью phpseclib

$ip = 'ip_address'; 
$login = 'user'; 
$password = 'password'; 
$ssh = new SSH2($ip); 
$ssh->login($login, $password); 

В приведенном ниже примере все нормально (потому что я не нужны права):

$command = 'ifconfig'; 
$result = $ssh->exec($command); // result = 'eth0 ..., eth1 etc.' 

Проблема возникает в следующем примере:

$command = 'ip addr flush dev eth1'; 
$result = $ssh->exec($command); // result = 'Failed to send flush request: Operation not permitted' 

Я попытался войти в систему с Sudo су :

$result = $ssh->read('$'); // result = '..... [email protected]:~$' 
$result = $ssh->write("sudo su\n"); //result = true 
$result = $ssh->read(':'); // result = 'sudo su\n [sudo] password for user:' 
$result = $ssh->write($password."\n"); // result = true 
$result = $ssh->read('#'); //result = '[email protected]:/home/user# 

Кажется, что t (я нахожусь на корне), но:

$command = 'ip addr flush dev eth1'; 
$result = $ssh->exec($command); // result = 'Failed to send flush request: Operation not permitted' 

Где проблема? Заранее спасибо!

+0

попробуйте добавить себя в файл sudoers, а затем просто введите sudo, за которым следует команда (вам не нужно вставлять пароль). –

+0

'su' уже является двоичным. нет необходимости запускать его 'sudo', потому что он ВСЕГДА работает от имени root. –

+0

Я пробовал что-то подобное в терминале: 'adduser user sudo', а результат: ' Пользователь пользователя 'уже является членом' sudo''. Затем я использовал только «su» в терминале, и результат: «Пароль: su: Ошибка аутентификации» – Krzychu

ответ

1

я использовал следующий код из http://mrbluecoat.blogspot.com/2014/03/running-sudo-commands-with-phpseclib.html:

$ssh->read('/.*@.*[$|#]/', NET_SSH2_READ_REGEX); 
$ssh->write("sudo YOUR COMMAND HERE\n"); 
$ssh->setTimeout(10); 
$output = $ssh->read('/.*@.*[$|#]|.*[pP]assword.*/', NET_SSH2_READ_REGEX); 
if (preg_match('/.*[pP]assword.*/', $output)) { 
    $ssh->write($sudo_password."\n"); 
    $ssh->read('/.*@.*[$|#]/', NET_SSH2_READ_REGEX); 
} 

и это работает!

+0

Выполнение '$ ssh-> setTimeout (10)' не обязательно. – neubert

0

Вам потребуется добавить httpd-процесс (apache, php) в корневую группу пользователей. Это вспомогательный процесс может выполняться с помощью root perm.