<?php
$ssh = ssh2_connect('domain.tld');
ssh2_auth_password($ssh, 'username', 'password');
$shell = ssh2_shell($ssh);
echo fread($shell, 1024*1024);
fwrite($shell, "sudo ls -la\n");
$output = fread($shell, 1024*1024);
echo $output;
if (preg_match('#[pP]assword[^:]*:#', $output)) {
fwrite($shell, "password\n");
echo fread($shell, 1024*1024);
}
Run Code Online (Sandbox Code Playgroud)
所做的只是显示横幅和提示。它实际上并没有给我 ls -la 命令的输出。在 phpseclib 上它工作得很好。
有任何想法吗?
我写了一个 SSH 包装器 ( https://github.com/bubba-h57/PHP-SSH2 ) 来促进我自己的很多需要通过 SSH 连接到远程服务器的 PHP 脚本,并且经常遇到这个问题。
我用这个咒语解决了它:
echo <password> | sudo -S <command>
Run Code Online (Sandbox Code Playgroud)
对你来说可能看起来像:
fwrite($shell, "echo $mySudoPassword | sudo -S ls -la\n");
Run Code Online (Sandbox Code Playgroud)
每次使用 sudo 时,我都会输入密码,无论我是否认为需要它。
使用我自己的包装器,它看起来像:
require_once 'SSH2.php';
// Test Unix
$username = 'someuser';
$password = 'somepwd';
$host = 'somenixhost.com';
$port = 22;
$ssh2 = new My_SSH2($host, $port);
$ssh2->authPassword( $username, $password);
$ssh2->setPrompt(':~#'); // Set initial expected prompt
$ssh2->openShell();
$ssh2->setPrompt("MYCUSTOMSSHPROMPT> "); // Create a unique, easily found prompt
$ssh2->exec("PS1='MYCUSTOMSSHPROMPT> '"); // Execute the command.
echo $ssh2->exec('cd /var/www') . "\n"; // Change directories.
echo $ssh2->exec("echo $password | sudo -S ls -la\n") . "\n"; // Print LS
echo "\n===================Begin History=============\n";
echo $ssh2->getHistory();
$ssh2->disconnect();
echo "\n===================end=============\n";
exit;
Run Code Online (Sandbox Code Playgroud)