menu Chancel's Blog
rss_feed lightbulb_outline

我的笔记

invalid privatekey: [B@3e50d0c8 - DBeaver

使用SSH通道连接测试服务器的Mariadb服务出现提示

invalid privatekey: [B@3e50d0c8

这种情况是在使用非对称加密的私钥登录时出现,在确定密钥可以正常SSH连接服务端,排除密钥问题发现可能是OpenSSL生成的密钥版本问题

重新生成对钥,添加参数 -m PEM 生成证书之后连接一切正常

完整指令参考

ssh-keygen -t rsa -b 2048 -m PEM

Operating System 2020-03-15 19:41:18 location_on

Linux - 硬盘测速命令技巧

假设新购入一块SSD硬盘/机械硬盘并接入Linux系统中,通过dd & hdparm两个Linux自带工具可以快速测出该硬盘的性能水准

这里暂定接入的设备为/dev/sdc

hdparm测速方法

sudo hdparm -tT /dev/sdc

// 读速输出如下
/dev/sdc:
 Timing cached reads:   24384 MB in  1.99 seconds = 12263.71 MB/sec
 Timing buffered disk reads: 454 MB in  3.00 seconds = 151.25 MB/sec

hdparm的可以简单快捷的测出硬盘的读速,但这个测试方法过于简单,如果需要更确切的性能数据,更推荐使用dd

dd的测速方法

sudo dd if=/dev/zero of=/tmp/speedfile bs=8k count=10000 oflag=direct

// 写入速度输出如下
10000+0 records in
10000+0 records out
81920000 bytes (82 MB, 78 MiB) copied, 7.25587 s, 11.3 MB/s

sudo dd if=/tmp/speedfile of=/dev/null bs=8k count=10000 

// 读取速度输出如下
10000+0 records in
10000+0 records out
81920000 bytes (82 MB, 78 MiB) copied, 0.702369 s, 117 MB/s

dd测速命令解释

首先是两个系统自带设备(即上面测试用到的两个本地设备)

  • /dev/null:空设备,写入该设备不会产生IO(形似黑洞,写入即被丢弃),所以可以用来做新盘测试读速的写入对象
  • /dev/zero:零设备,可以无限提供空字符,一般用来生成特定大文件的虚拟设备

另外类似的设备还有/dev/random、/dev/urandom之类的,有兴趣可自行搜索

参数

  • bs:一次写入大小,block size
  • count:写入次数,一般联合bs进行测试
  • skip(可选):原文件读取的起始位置(单位与bs一致)
  • seek(可选):目标文件写入的起始位置(单位与bs一致)
  • oflag:表示写入的符号标志(通常代表不同的写入方式),direct表示直接I/O写入而不使用缓存

dd测速忽略了硬盘缓存等特性,测试的数据不够严谨,但作为个人测速使用相对还是比较直观的

Develop Base Linux 2020-05-05 22:56:16 location_on

Cent7OS安装指定版本MySQL方法

MySQL有许多版本,分为付费跟收费的版本,简单罗列如下

  • MySQL Community Server
    • 社区版本,开源免费,但不提供官方技术支持。
  • MySQL Enterprise Edition
    • 企业版本,需付费,可以试用30天。
  • MySQL Cluster
    • 集群版,开源免费。可将几个MySQL Server封装成一个Server。
  • MySQL Cluster CGE
    • 高级集群版,需付费。
  • MySQL Workbench(GUI TOOL)
    • 一款专为MySQL设计的ER/数据库建模工具。它是著名的数据库设计工具DBDesigner4的继任者。
  • MySQL Workbench OSS
    • MySQL Workbench社区版
  • MySQL Workbench SE
    • MySQL Workbench商用版
  • MySQL Community Server
    • 开源免费的,这也是我们通常用的MySQL的版本。根据不同的操作系统平台细分为多个版本

安装指定版本的方法也很简单

  1. MySQL官网下载合适系统版本的repo库

  2. 将下载的repo包安装到仓库

     # 先查看repo包包含哪些包
     rpm -qpl mysql80-community-release-el7-1.noarch.rpm
     # 安装repo
     rpm -ivh mysql80-community-release-el7-1.noarch.rpm
  3. 指定我们要的版本,编辑完成后保存即可

    # enabled=0禁用版本,enabled=1启用指定版本
     vim /etc/yum.repos.d/mysql-community.repo
    
  4. 查询已经启用的版本

     yum repolist enabled | grep mysql
  5. 如果输出里面有你要的版本,那就直接安装就OK了

     yum install mysql-community-server

Develop Base Linux 2020-01-08 14:33:37 location_on

Flask SQLAIchemy - 给Model对象添加to_dict方法让让所有查询带上外键对象

后台项目使用SQLAIchemy作为ORM框架,为了方便直接返回数据对象,在Model处加了一个自定义的 to_dict方法

to_dict方法将所有的colunm转换成键值类型

这样一来,根据条件查询结果之后只需要直接 to_dict() 并dump成Json即可返回给前台所有数据对象

示例代码如下

from flask_sqlalchemy import SQLAlchemy
Model = SQLAlchemy().Model
Model.to_dict = lambda self: {c.name: getattr(self, c.name, None) for c in self.__table__.columns}

# 文章类型表
class TArticleType(Model):
    __tablename__ = 't_article_type'

    id = Column(INTEGER(3), primary_key=True)
    t_type = Column(String(255), nullable=False)

# 文章表
class TArticle(Model):
    __tablename__ = 't_articles'

    id = Column(INTEGER(10), primary_key=True)
    a_title = Column(String(50), nullable=False)
    a_type = Column(ForeignKey('t_article_type.id'),
                    nullable=False, index=True)
    update_time = Column(DateTime)

    t_article_type = relationship('TArticleType')

但这样有个缺陷,我返回文章列表的时候,前台需要根据 a_type 的值再次请求查询文章类型名称,后台需要增加接口提供给前台查询对应ID的文章类型名称

显而易见,在查询文章的时候,我希望直接返回文章的类型信息(包括id和类型名称),一开始做的方案是直接在查询的时候手动添加一次查询文章类型表的操作,如下

articles = TArticle.query.filter().order_by(desc(table_obj.id)).limit(10)
for art in articles:
    art.a_type = TArticleType.query.filter(TArticleType.id == art.a_type).first()
_list = []
for _new in articles:
    _list.append(_new.to_dict())
return json.dumps(_list, ensure_ascii=False, default=lambda obj: obj.__dict__)

然而分页已经做了全局封装,没有机会这样手动修改返回对象代码,更多的情况是调用封装好的分页方法将对象传进去,如下

 return get_table_page_data(TArticle)

即使我们修改了 get_table_page_data 方法,还需要修改to_dict()方法,目前to_dict()方法只是转换了所有的colunm,并不包含自定义元素

那么既然要修改to_dict方法,不如直接在to_dict里将外键列表也转换成一个属性,代码如下

def to_dict(self):
    _dict = {}
    for c in self.__table__.columns:
        _dict[c.name] =  getattr(self, c.name, None)
    # 循环遍历属性,获取Model对象的属性
    for attr in dir(self):
        if isinstance(getattr(self,attr),Model):
            _dict[attr] = getattr(self,attr).to_dict()
    return _dict

Model.to_dict = to_dict

至此,完成了一个自动将Model子类对象转换成包含外键对象的键值类型对象

Develop Technology Python 2020-01-07 17:08:15 location_on

Mariadb - 配置远程访问显示"connect reset"错误

今天在内网机器上搭建一个测试MariaDB数据库,按照习惯配置远程访问

CREATE USER chancel@chancel IDENTIFIED BY 'chancel';
GRANT ALL PRIVILEGES ON chancel_api.* TO 'chancel'@'192.168.11.13' IDENTIFIED BY 'chancel' WITH GRANT OPTION;

然后在远程机器上访问到时候弹出了connect reset,这很明显说连接到端口就被拒绝了,看了下防火墙也是打开3306的默认端口,猜测下可能是MariaDB的问题

查查3306端口的情况

chancel@chancel-nas /etc/mysql/mariadb.conf.d » netstat -ntulp | grep 3306
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      127.0.0.1:3306            0.0.0.0:*               LISTEN

显然说db绑定了127.0.0.1的本地端口导致外网连接不了,找一下MariaDB到配置文件,编辑‘127.0.0.1’并改成'0.0.0.0'即可

chancel@chancel-nas ~» vim  /etc/mysql/mariadb.conf.d/50-server.cnf

...
bind-address        = 0.0.0.0 # 编辑‘127.0.0.1’并改成'0.0.0.0'即可
...

Develop Base Database 2020-01-07 17:05:19 location_on

x-prober - 一款精美的 PHP 探針

kmvan/x-prober - github

安装非常简单,点击release然后下载prober.php

放到PHP目录后更改名称为index.php(视情况而定)即可

效果如图

Github Star 2020-01-07 17:04:05 location_on

Widnows - HTTPS双向认证客户端证书无法正常显示问题

因为工作项目牵扯到一个客户端认证,网站做了一个基本的HTTPS双向认证,测试没有问题,测试效果如下

结果正式使用之后发现部分Windows7无法在访问网站的时候正确出现证书选择,明明证书已经安装了,Google了很久也没有查到相关资料(可能自定义客户端证书用的人不多)

访问网站之后直接被判定为没有证书,效果如下

这个问题困扰了整整一周,连chrome都差编译出来看看到底里面为什么没调到证书,最后发现一个规律

在重启之后的前半分钟(不太固定)证书是能正确显示的,这个线索很重要,提示了应该是某个服务破坏了证书的验证机制,遂逐个逐个服务关掉

在关掉一个服务之后果然证书就正常了,如图

至于原因还没有找到,后面再详细看看这个服务是做什么的(但其实应该是某些流氓软件篡改了系统设置,因为测试正常安装的Windows7并没有这个问题)

Operating System Windows 2019-12-20 17:14:45 location_on

Wol - 远程唤醒计算机

经常做过Wol远程唤醒,但没细究过里面的设置,这里归纳一下如何设置以及为什么要这样设置,以一台Windows10的机器为例子

首先我们需要更改BIOS设置,大部分情况下只需要注意打开有以下关键字的选项为Enabled状态即可

  • Wake on lan

其次是开机后在Windows10里,按Win+X打开快捷菜单,按M打开设备管理器,找到网络设配器并展开,选择你的网卡,有线网卡通常是Realtek开头的,右键打开属性对话框,选择选项卡电源管理

勾选如下两个选项

  • 允许计算机关闭此设备以节约电源(这里可以理解为接管网卡电源)
  • 允许此设备唤醒计算机

可选选项

  • 只允许幻数据包唤醒计算机(不勾选则任何数据包都可以激活你的电脑,勾选则只允许魔术包激活你的计算机)

再选中高级选项卡,查看以下两个值,确保是 Enabled状态

  • Wake on Magic Packet
  • Wake on pattern match

确保下面这个选项是 Disabled状态(有些计算机没有这个选项也很正常,注意,此选项若是启用,则在关机一段时间后无法唤醒)

  • Wake on lan after shutdown

关机后,查看网口提示灯是否亮着,如果亮着则说明设置成功,但请注意如果网口提示灯没有亮并不代表失败!

有些机型是默认设置即使开启WOL唤醒网口提示灯也不会亮的,我们需要尝试使用唤醒计算机来最终确认是否设置成功

发送WOL包的方法很多,这里以Ubuntu 18.04为例子,安装etherwake并发送wol包

chancel@chancel-nas ~ » sudo apt install etherwake                                                                                                                                      100 ↵ Reading package lists... Done
Building dependency tree
Reading state information... Done
...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
chancel@chancel-nas ~ » ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 70:85:c2:82:20:27 brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.11/24 brd 192.168.11.255 scope global enp1s0
       valid_lft forever preferred_lft forever
    inet6 fe80::7285:c2ff:fe82:2027/64 scope link
       valid_lft forever preferred_lft forever
chancel@chancel-nas ~ » sudo etherwake -i enp1s0 -b 3C:97:3E:E0:01:DC

Operating System 2019-11-10 23:44:03 location_on

Webmin - 基于Web网站的系统管理工具

Webmin is a web-based system administration tool for Unix-like servers, and services with over 1,000,000 installations worldwide. Using it, it is possible to configure operating system internals, such as users, disk quotas, services or configuration files, as well as modify, and control open-source apps, such as BIND DNS Server, Apache HTTP Server, PHP, MySQL, and many more.

强大而灵活的基于Web的服务器管理控制面板

个人一直很喜欢宝塔面板,但出于对国产软件的无信心,一直想找一款类似的程序(开源更好)来替代宝塔面板,无意间发现了Webmin如获至宝!

安装方法也很简单,Linux大部分发行版直接运行 setup.sh 按照提示一步一步安装

Webmin - Powerful and flexible web-based server management control panel

由于支持主题更改(重点!)所以界面UI选择空间非常大,这里可以参考以下二款主题!

Official theme for the best server management panel of the 21st Century

BWTheme - A simple and beautiful theme for Webmin and Usermin made using Bootstrap and Font Awesome

Web Site Star Linux 2019-10-30 11:13:35 location_on

Gnome - 设置默认打开文件/文件夹的程序

最近Gnome从Chrome打开下载文件的文件夹总是用VSCODE打开让我惊呆了

查了一下资料,根据reddit.com提供的资料我们可以重新设置打开文件夹的工具为org.gnome.Nautilus.desktop

在终端执行

gio mime inode/directory org.gnome.Nautilus.desktop

Operating System Linux 2019-10-29 15:13:05 location_on

7 of 13 | A total of 128