我使用下面的方法通过Web界面向多台Linux计算机发送命令。如果我选择 30 或 40 个客户端,我必须等待命令在所有客户端上运行,然后才能获得任何结果。有没有办法在每台计算机上运行命令后立即开始列出结果?
<?php
include('Net/SSH2.php');
$user = "user";
$pass = "pass";
$ip = $_POST['clients'];
$ssh = new Net_SSH2($ip);
$cmds = $_POST['commands'];
if(!empty($_POST['clients'])) {
foreach($_POST['clients'] as $ip) {
$ssh = new Net_SSH2($ip);
if (!$ssh->login($user, $pass)) {exit('Login Failed');}
echo "$ip: " . $ssh->exec($cmds) . "<br>";
}
}
?>
<form action="phpseclib/commands.php" method="post" target="main">
<input type="checkbox" name="clients[]" value="192.168.0.51">Client001<br>
<input type="checkbox" name="clients[]" value="192.168.0.52">Client002<br>
<input type="checkbox" name="clients[]" value="192.168.0.53">Client003<br>
<input type="checkbox" name="clients[]" value="192.168.0.54">Client004<br>
<input type="checkbox" name="clients[]" value="192.168.0.55">Client005<br>
<br/>
<select name="commands">
<option value="">Select Command</option>
<option value="uptime | sed 's/.*up '([^,]*'), .*/'1/'">Uptime</option>
<option value="printf $(free | grep -e-/+ | awk '{print $3/($3+$4) * 100.0 ''}' | cut -d '.' -f1)%%">Memory Usage</option>
</select>
<br>
<br/>
<input type="submit" value="Submit" />
</form>
您可以使用 AJAX 请求,而不是依赖表单中的 POST 数据。每次选择客户端时,都可以发送异步请求,并在浏览器中包含更新。
关于安全性的快速旁注,您是否允许从浏览器注入 shell 命令?如果这些input
选项值的内容毫无疑问地执行,那么用户可以在其中放置任何内容。