在php下使用shell去开发web管理Ubuntu系统其实并不难,按照一般步骤就可以了,不过要注意2个坑。
1.首先安装ssh扩展
apt-get install libssh2-1-dev libssh2-php
php -m |grep ssh2 查看ssh2是否安装成功
service apache2 restart
2.编写代码测试
<?php
$connection = ssh2_connect( '127.0.0.1', 22 );
if ( ssh2_auth_password( $connection, 'newpo', '123456' ) ) {
echo '登陆成功!<br>';
}
else{
echo '登陆失败<br>';
return;
}
?>
运行后输出以下内容,表示成功。
登陆成功!
现在开始要注意下面2个坑:
1.ssh2扩展使用shell命令与用户权限有关:
通常用安装系统创建的用户使用shell命令,在ssh里面都会提示输密码,因为他还不是root权限;ssh2扩展执行没有报错误,但root权限的shell都无法使用
$connection = ssh2_connect( '127.0.0.1', 22 );
if ( ssh2_auth_password( $connection, 'newpo', '123456' ) ) {
echo '登陆成功!<br>';
}
else{
echo '登陆失败<br>';
return;
}
$stream = ssh2_exec($connection, "service smbd restart");
stream_set_blocking( $stream, true );
echo "Output: " . stream_get_contents($stream);
我之前想过在Service smbd restart先执行sudo -i,然后输入密码,但是发现这种方法也是不行,根本就不出现输入密码提示。
最后想到一种办法就是以root身份登录,ssh2扩展就不会受到权限限制,不过Ubuntu本身root是没有密码,需要手动把root密码加上,执行passwd root,输入2次密码即可,设置好后修改登录代码在执行出现下面即可
$connection = ssh2_connect( '127.0.0.1', 22 );
if ( ssh2_auth_password( $connection, 'root', '123456' ) ) {
echo '登陆成功!<br>';
}
else{
echo '登陆失败<br>';
return;
}
$stream = ssh2_exec($connection, "service smbd restart");
stream_set_blocking( $stream, true );
echo "Output: " . stream_get_contents($stream);
登陆成功!
Output: smbd stop/waiting smbd start/running, process 24734
2.如果解决ssh扩展获取不了刷屏命令(如top)的信息和执行shell独占web资源
用web控制Ubuntu,最常见的功能就是获取系统的cpu占有率,内存等等,就使用top命令
$stream = ssh2_exec($connection, "top");
stream_set_blocking( $stream, true );
echo "Output: " . stream_get_contents($stream);
web打开什么信息都没有获取到(暂时不知道原因),网上提供了另一些方式取这信息
$stream = ssh2_exec($connection, "top -b -n 2 | grep -E '(Mem)|(Cpu)'");
stream_set_blocking( $stream, true );
echo "Output: " . stream_get_contents($stream);
如果执行,可以获取信息,只是web会等待几秒才可以获取到信息
解决上面情况有2种方法:
1.使用多线程php扩展或第3方扩展swoole等,需要编译php,所以没有去尝试,有空试一下
2.系统里面写一个脚本不断获取cpu和内存的信息,ssh执行这个脚本即可