近来闲着没事，想给自己的Kali整个WayDroid跑安卓虚拟机玩玩，使用了GitHub上的一个安装脚本。 然而这个脚本在获取了root权限之后执行了apt upgrade。现象执行apt upgrade之后，等待了很长时间让apt完成了下载、解压缩、配置步骤。因为更新了太多库，xfce提示我重新登录relogin或重启restart。于是我就注销了想重新登陆。 没想到注销之后再输入kali账号密码登录之后，就一直卡在了如下的界面 重启也无法解决问题，依旧是这样或者是黑屏状态。拯救系统是安装在一个移动的机械硬盘上的，于是我尝试回到主系统（Windows）在VMware虚拟机中启动心爱的Kali Linux系统。 不知道为什么，在虚拟机中上方的任务条以及窗口都可以加载出来，但是所有的窗口都没有边框，桌面背景（以及桌面图标）也没有正确显示。谷歌一下，发现是xfwm4寄了。有大佬说使用xfwm4 --replace指令可以恢复边框，然而我执行后出现了如下报错The program 'xfwm4' received an X Window System error. This probably reflects a bug in the program. ... The error was 'BadValue (integer parameter out of range for operation)'. ... （部分信息已省略，主要是我也没保存下来）重新谷歌一番，没有找到可行的解决方案。不过问题大概就是在升级软件包时出现各种错误，导致没能正确完成升级流程。那我们尝试恢复。在桌面环境中，使用快捷键Ctrl+Alt+T启动虚拟终端，如果你无法进入桌面，可以使用Ctrl+Alt+[F1~F6]进入任意的tty。然后使用指令apt upgrade dpkg --configure -a紧张地等待完成后，出现了新的报错。... E: Sub-process /usr/bin/dpkg returned an error code (1)看上面报错的大意，好像是说：A软件包的安装配置依赖B软件包，但B安装配置同时依赖A，这就导致了无法处理依赖关系。谷歌了一下解决方案，E: Sub-process /usr/bin/dpkg returned an error code (1)错误解决 - jaryWang - 博客园 (cnblogs.com)sudo su #进入管理员账户 mv /var/lib/dpkg/info /var/lib/dpkg/info_old #现将info文件夹更名 mkdir /var/lib/dpkg/info #再新建一个新的info文件夹 apt-get update apt-get -f install #修复损坏软件包 mv /var/lib/dpkg/info/* /var/lib/dpkg/info_old #执行完上一步操作后会在新的info文件夹下生成一些文件，现将这些文件全部移到info_old文件夹下 rm -rf /var/lib/dpkg/info #把自己新建的info文件夹删掉 mv /var/lib/dpkg/info_old /var/lib/dpkg/info #把以前的info文件夹重新改回名字 reboot #重启然后重新进入系统，登入，发现一切恢复了正常。注如果进行了上述步骤还没有恢复，请再尝试 反复 执行下面的指令apt-get upgrade dpkg --configure -a apt -f install #修复损坏的软件包； apt-get clean #清理旧软件缓存；参考kali更新后出现黑屏，右上角出现光标闪烁不能开机的情况参考E: Sub-process /usr/bin/dpkg returned an error code (1)错误解决 - jaryWang - 博客园 (cnblogs.com)后记这个事故浪费了我整整一晚上的时间捣鼓，期间试过无数种方法，apt -f install以及apt upgrade执行过无数次，最终才成功。
上篇我们讲了如何快速部署使用PBF Next，这篇文章，我们来了解一下如何进行消息同步创建Socket中转ID 前往Socket中转服务器申请Client id 申请后记下提供的client_id和client_secret服务端准备您需要在服务端安装消息同步插件：MessageSyncChatImage（可选，如果您想在服务器中查看消息图片）并按照插件配置文件的注释进行配置。PBF服务请参考上一篇教程PBF Next 快速入手来部署PBF服务。接下来安装Banwords和MCServer插件pbf install-plugin Banwords pbf install-plugin MCServer然后编辑start.py启动文件，在# Modify more configurations here后面添加如下代码：config.plugins_config["mcserver"] = { "client_id": "123", # 您申请的Client ID "client_secret": "123", # 您申请的Client Secret "qn": [11451419], # 请替换为要进行消息同步的QQ群号 "enable_chatimage": True # 如果安装了ChatImage插件就是True，否则为False }然后，在WebUI中依次加载Banwords插件和MCServer插件即可！测试如果没有问题的话，在服务器中发送消息或者是QQ群中发送消息，消息应该能被成功同步了！
PBF Next 截至本文章发布为止已经更新到了5.0.10版本，这篇文章我们就来讲一下PBF Next的基本使用安装PBF前置环境您需要在具备Python 3.8+以及Git的环境中使用PBF安装通过pip安装：pip install PigBotFramework --upgrade快速初始化执行以下指令来快速初始化一个PBF服务mkdir workspace cd workspace pbf init pbf install-plugin webui pbf install-plugin menu pbf start然后，您可以访问http://localhost:8000/web来进一步管理机器人。 默认HTTP Basic Auth帐号密码是：帐号：admin 密码：admin 这里我们不过多讲解WebUI的使用。启动Lagrange这里我们以Lagrange为例，Lagrange.OneBot Docs首先按照文档说明前往GitHub Action下载可执行文件然后在可执行文件的同级目录下新建文件appsettings.json，内容如下{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "SignServerUrl": "https://sign.lagrangecore.org/api/sign/25765", "MusicSignServerUrl": "", "Account": { "Uin": 0, "Password": "", "Protocol": "Linux", "AutoReconnect": true, "GetOptimumServer": true }, "Message": { "IgnoreSelf": true, "StringPost": true }, "QrCode": { "ConsoleCompatibilityMode": false }, "Implementations": [ { "Type": "HttpPost", "Host": "localhost", "Port": 8000, "Suffix": "/", "HeartBeatEnable": false, "AccessToken": "123456", "Secret": "123456" }, { "Type": "Http", "Host": "*", "Port": 8001, "AccessToken": "123456" } ] }最后运行可执行文件，按照程序提示扫码登陆即可连接到OneBot实现打开工作目录下的start.py，在# Modify more configurations here部分后面添加新的代码：config.ob_access_token = "123456" config.ob_uri = "http://localhost:8001"然后执行指令fuser -k 8000/tcp && pbf start重启服务器检查连接在QQ群中发送菜单，您就应该能看到机器人的回复。什么？你机器人没反应？！肯定是你人品不行啦 请您检查上述配置的端口以及access_token是否正确进阶配置我们接下来还要对PBF服务做一些进阶配置。编辑工作目录下的start.pyWebUI基础认证在# Modify more configurations here部分后面添加新的代码：config.plugins_config[] = { "basic_auth": { "username": "root", "password": "123456" } }这样在重启PBF之后，您访问WebUI需要输入上面设定的用户名和密码来进行HTTP Basic Authentication更换服务器端口（可选）在from pbf.driver import Fastapi这一行下面添加如下代码# 注意缩进 Fastapi.fastapi_port = 8002 # 新端口 Fastapi.fastapi_host = "0.0.0.0" # 这样会监听网卡上的所有地址注意更换端口之后需要同时修改Lagrange的配置appsettings.json来保证连接做完上面这一切之后，别忘了执行fuser -k 8000/tcp && pbf start重启服务器
今天日常检查的时候发现OAuth登录后发送邮件提醒出现了问题，解决过程中发现了宝塔邮局的一个小坑，记录一下PHP使用PHPMailer报无法连接，于是打开宝塔面板，使用邮局内置的发送邮件功能测试一下：然后发现邮局会报无法连接错误（未留下截图，事后也无法复现故障，因此没记下具体错误内容）点击服务状态，发现没有任何问题这不对啊？！尝试重启了所有服务，但是还是不起作用。没办法，我们去查看各个服务的日志吧！切换到shell，使用systemctl status dovecot/rspamd/postfix依次查看每个服务的状态，发现所有服务状态都是active，但是在Postfix服务的日志中，发现了一些红红的东西 fatal: no SASL authentication mechanisms谷歌一波，有网友说是saslauthd服务未启动 于是尝试systemctl status saslauthd发现这个东东确实没有启动，于是systemctl start saslauthd && systemctl restart postfix，然后再去发送邮件测试，就可以成功收到邮件了
今天装php的memcached扩展的时候找到了一个宝塔的bug。去百度谷歌一番搜索都没有找到想要的答案。最终完美解决，在这里标记一下，防止后面的xdm掉坑。宝塔PHP安装扩展今天手痒，想给官网手撸个防CC，需要使用到memcached来记录IP地址安装memcached服务器CentOS直接yum install memcached -y就装好了，简单修改端口，然后使用systemctl enable memcached && systemctl start memcached就可以设为自启然后启动了。PHP使用memcached扩展由于是小坑标记，这里不多讲扩展的用法，就说一下遇到的坑。php装扩展，可以直接从宝塔的应用管理里面找到php加（如图） 注意是安装下面那个memcached而不是memcache装完之后phpinfo()却发现并没有启用memcached扩展然后去看了看php.ini发现最后面确有引用 那就奇怪了，去百度了一顿也没有找到原因后来发现最后面的引用与上面的都有区别，上面的都是使用的绝对地址，而memcached则是使用的相对地址（甚至路径都没有）找到上面存放so文件的路径（我的机器上是/www/server/php/72/lib/php/extensions/no-debug-non-zts-20170718/），发现memcached.so就在里面。于是将最后一行相对路径改成了绝对路径（如图） 保存，然后phpinfo()就有了总结宝塔PHP安装扩展如果没有用的话，就可以按照如上方法试一试，说不定呢（）服务器版本CentOS: 7.6BtPanel: 7.9.6 Python3
Q：gocq登陆好了，为啥机器人不能用？A：造成该问题可能有以下原因：请检查实例设置里面填写的gocq主机和端口是否正确。最简单的检查方式就是在实例管理页面查看是否连接到gocq，如提示无法连接到gocq，则肯定是gocq配置填错了。同时，请使用创建实例自动生成的config.yml，自己填的话容易填错Q：为啥显示能连接到gocq，但是机器人就是不回消息？A：出现该问题可能有多种原因：可能是上报消息失败。请检查gocq的黑窗口中的输出，看看有没有提示“上报失败”类似的字样。如果有且数量较多，请私聊联系群主可能是上报的消息被屏蔽。以下情况的消息会被屏蔽：在黑名单中。参见 https://qb.xzynb.top/blackList机器人自己的账号发送消息通常情况下，机器人不会处理自己发送的消息。发送消息的QQ号创建过机器人实例因为防止冲突，机器人不会处理机器人的消息，所以如果您使用当前QQ号创建过实例，i机器人就会认为当前QQ号是机器人，从而忽略掉，不处理。您的机器人实例没装任何插件。如果您不安装任何插件，那么机器人没有任何功能。比如说“菜单”就在基础插件里，如果不装的话就没有对应的功能。Q：我是云gocq氪金用户，为什么还是显示"连接不到"gocq？A：氪金用户您好，感谢您的支持。在您创建云gocq的同时，我们会自动修改机器人实例设置，将gocq主机和端口修改为正确的值。因此，不建议您在创建云gocq之后修改实例设置中的gocq相关设置，这都可能会造成无法连接到gocq。Q：我不知道如何下载gocq，GitHub打不开A：解决方案：遇到这种情况，我们建议您最好使用魔法上网您还可以尝试在gitee等可以访问的托管平台上搜索go-cqhttp的同步仓库如果以上两项您都无法实现，可以前往猪比交流QQ群，群文件中有rc3版本的386架构的exe可执行文件Q：gocq登录提示"密码错误"，但是我的密码没错，怎么办？A：遇到这种情况，建议使用扫码登录，具体步骤如下：在启动gocq之后输入2，选择扫码登录或修改config.yml，找到其中的password: Your Password修改为password: null。再启动gocq即可Q：我使用云端gocq，但是扫码登录的时候提示网络环境异常，怎么办？A：扫码登录需要两个设备处在同一个网络下，因此您不能在云端gocq直接进行扫码登录，您可以使用如下步骤登录：在本地使用gocq进行扫码登录将生成的session.token和device.json上传至云gocq，然后启动即可未完待续...
最近写猪比的云端GOCQ遇到了一个权限问题：我需要gocq用户对于/www/wwwroot/qb.xzynb.top/gocq目录及子目录下的文件拥有rwx权限而对于其他目录均只有--x权限很显然，普通的权限控制已经不能满足这个需求，那么这个时候就要使用我们的ACLACL是什么ACL是Access Control List（访问控制列表）的缩写，不过在Linux系统中，ACL用于设定用户针对文件的权限，而不是在交换路由器中用来控制数据访问的功能（类似于防火墙）。如何开启ACL查看是否开启：[root@localhost ~]# mount /dev/sda1 on /boot type ext4 (rw) /dev/sda3 on I type ext4 (rw) …省略部分输出… #使用mount命令可以看到系统中已经挂载的分区，但是并没有看到ACL权限的设置 [root@localhost ~]# dumpe2fs -h /dev/sda3 #dumpe2fs是查询指定分区文件系统详细信息的命令 …省略部分输出… Default mount options: user_xattr acl …省略部分输出…开启：[root@localhost ~]# mount -o remount, acl / #重新挂载根分区，并加入ACL权限 #使用 mount 命令重新挂载，并加入 ACL 权限。不过使用此命令是临时生效的。要想永久生效，需要修改 /etc/fstab 文件，命令如下： [root@localhost ~]#vi /etc/fstab UUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2 /ext4 defaults, acl 1 1 #加入ACL权限 [root@localhost ~]# mount -o remount / #重新挂载文件系统或重启系统，使修改生效ACL查看使用getfacl <文件名>指令可以查看ACL，这里不过多赘述设置ACL使用setfacl可以设置ACL选项：-m：设定 ACL 权限。如果是给予用户 ACL 权限，则使用"u:用户名：权限"格式赋予；如果是给予组 ACL 权限，则使用"g:组名：权限" 格式赋予；-x：删除指定的 ACL 权限；-b：删除所有的 ACL 权限；-d：设定默认 ACL 权限。只对目录生效，指目录中新建立的文件拥有此默认权限；-k：删除默认 ACL 权限；-R：递归设定 ACL 权限。指设定的 ACL 权限会对目录下的所有子文件生效；To be Continued.
最近写猪比的GOCQ托管服务，遇到了几个小坑，这里记录一下一、PHP的exec函数执行需要挂在后台的操作需要用exec运行gocq，一开始我是这么写的：exec("cd ./gocq/0/3582675884/ && nohup ./go-cqhttp 3582675884 az &");说白了就是使用nohup &来后台运行。但是这么做有个缺点，就是无法获取到终端的返回值。不过这倒不是问题，毕竟用nohup执行的一般也不需要返回值，那么直接header("Connection:close");不要让前端等太久以至于524不过问题很快来了，跑了一段时间相安无事，但是突然ps aux | grep go-cqhttp发现进程无了然后又试了很多种情况比如去掉nohup等，都没用不卖关子了，直接给出正解：exec("cd ./gocq/0/3582675884/ && ./go-cqhttp 3582675884 az > /dev/null &")这样的话就是把所有输出全部扔掉（应该是），不知道具体为啥，反正这样写之后再也没掉过也可以尝试这种方法二、cookie作用域问题写了一个很常见的页面，点按钮就会设cookie然后跳转到另一个详情页面然后两个按钮分别点了一下，按理说详情页面根据cookie不同内容也会不同，但是点进去后发现两次内容全部相同。然后看了一下Cookie，发现有两个相同的cookie。原来是这两个cookie作用域不同，结果导致PHP获取到的一直是另一个cookie那好吧，我们就统一一下作用域呗setcookie(键, 值, 过期时间, 作用域);然后js的话我用的是jq的cookie插件，详见菜鸟教程三、关于MDUI一些建议（一）MDUI有个自适应的网格布局，比如说.mdui-row-sm-6就是小屏幕设备及以上分两栏显示。但是如果仅仅是分两栏显示的话，不建议用网格布局（会很难看），可以用 Something Something 这样，如果是移动设备的话可以写个判断，结合jq的$(selector).width();等进行适配四、关于MDUI一些建议（二）网格布局文档里说.mdui-row必须要在.mdui-container中，但是mdui-container的边距某些情况下就相对较大可以将.mdui-container改为.mdui-m-x-1这样，设置x轴的margin为8px，这个边距就好很多了注：以上MDUI版本为1.0.1
最近猪比的MC服务器功能更新了一下，现支持绑定自己的MC服务器。请在绑定前确保您具备以下条件：使用MCSM面板有MCSM的用户API KeyStep: 1 使用官网前往官网 一只小猪比 - 登陆 登陆。前往 一只小猪比 - 绑定QQ 按照提示绑定QQ前往 一只小猪比 - 群聊设置 将自己的QQ号与QQ群绑定Step: 2 获取信息请您前往您的mcsm面板获取以下信息：用户信息页您的用户API Key实例设置页要绑定的实例的uuid（远程/本地实例标识符）要绑定的实例的remote_uuid（守护进程标识符）Step: 3 填写信息前往 一只小猪比 - 群聊设置 进入群聊设置页后将Step2中获取到的信息按提示填入，然后点击右下角的保存按钮即可保存配置。请注意MCSM接口地址的末尾不要有/！例如：http://110.40.235.29:23333而不是http://110.40.235.29:23333/Step: 4 测试在群中发送任意关于MC服务器的指令，如果机器人执行正常（成功）则配置正确，您可以尽情享受。如果不正常，请按照提示信息修改或联系作者（2417481092）！