Tag Archives: linux

对比用SHELL SCRIPT和C语言API操作RASPBERRY PI GPIO的速度

对Raspberry Pi的GPIO在shell script里面可以直接用sysfs的方式进行操作,也可以调用gpio命令来进行操作,还可以用API来进行操作。今天做了个实验对比sysfs方式、第三方gpio命令以及C语言API操作对效率的影响。

昨天写的文章里面提到了用GPIO来控制LED灯的显示,今天其实是突发奇想,想看看用第三方gpio命令来操作和直接操作sysfs的效率到底有多大的区别。

物理连线

连线和昨天写的文章里面的连线方法基本一样,只是在GPIO管脚和GND之间跨接了一个可以测频率的万用表(UNI-T UT136D)。

Shell Script 响应速度测试

测试脚本

方法1:直接调用sysfs控制通断

脚本中默认没有注释掉的就是方法1,相当于用下面命令来操作gpio实现让电路通断:

实测频率在1.1kHz左右。目测LED基本感觉不到闪烁。

测试结果照片如下,最后两位数字在不断跳动。

万用表测试GPIO接口频率 (Shell Script)

方法2:用shell脚本中的函数调用sysfs控制通断

相当于用下面命令来通过自定义函数gpio_ben操作gpio,实现电路通断:

【BASH脚本】通过LINUX SYSFS调用GPIO实现LED显示RASPBERRY PI内存占用率

这几天弄了个树莓派(Raspberry Pi)玩,装了个Linux。树莓派的GPIO其实非常容易调用,甚至可以直接通过Linux的sysfs来读写GPIO接口的状态,周末空闲的时候写了段bash Shell Script来控制LED灯来展示Linux的内存占用率。这只是个很简单的bash脚本,主要来示意一下如何通过Linux sysfs来调用GPIO来操作LED,通过修改脚本其实可以实现更多的功能,例如显示CPU的温度是否过高等。

我使用的硬件设备:

  1. Raspberry Pi
  2. LED x3 (不同颜色)
  3. 470Ω 电阻 x3 (用来为LED降压)
  4. 杜邦线 (母-公) x3 (用来连接树莓派的GPIO到面包板)
  5. 面包板 x1

第一步:用gpio命令验证物理连线

gpio命令是需要安装WiringPI之后才有的,默认系统不带。安装之后用root权限(sudo)执行 gpio readall,将得到类似下面的结果:

Phy对应的是针脚的位置, GPIO对应的是GPIO的编号。需要注意两点:

  1. 实际执行这个命令后Raspberry Pi显示的GPIO编号很可能和我的不一样,要仔细看好然后再看看要用哪个编号。
  2. GPIO的编号和物理针脚不一定是顺序对应的,比如我这次要用的是针脚11, 12, 13,对应的GPIO编号是17, 18, 27。当然如果要用wiringPi的逻辑pin的话就是0, 1, 2,但是我这次不打算用wiringPi,只用sysfs来实现对LED的控制。

第二步:连接线路

注意:连线前断电,连好之后请再三确认之后再通电!

raspberrypi-led-gpiov2
Raspberry Pi Control LED by using GPIO
gpio2_bb
GPIO LED 树莓派 面包板接线示意图

gpio_circuit_diagram-900x647
GPIO 连接LED 电路图

连接好线之后,请再次目视检查确认线没接错,特别是0v (GND)一定不要接错!再三确认之后再通电,进入Raspberry Pi的命令行界面测试接线是否正确。刚刚接好线的时候LED是不会像上图那样亮起来的,可以执行下面命令看看LED是否会亮(注意要有root权限):

修改GPIO的数字,依次测试。如果一切正常,那么三盏LED灯会依次亮起来,记住每个数字对应的LED的颜色。

第三步:编写脚本通过sysfs调用GPIO实现用LED灯展示内存占用率

我写的脚本如下,如果你愿意,你可以随意使用/修改后再使用/分发。

上面的脚本实现每10秒钟检查一次内存占用率(利用free命令),如果可用率高于60%,那么亮绿灯;如果可用率低于30%,则亮红灯。在30%到60%之间时亮橙色灯。在退出程序后,LED都会灭掉。

将上面脚本保存为.sh后缀,然后chmod +x赋予执行权限,再执行就可以了。

对上面的脚本稍加修改也可以实现用LED监控树莓派的CPU温度等等,这里就不一一列举代码了。用Shell获取树莓派的CPU/GPU温度可以参考这里:Raspberry Pi onboard temperature sensors

FAIL2BAN ON UBUNTU

本文主要介绍如何使用 fail2ban 来削弱针对ssh的猜密码攻击。Ubuntu上自带的 fail2ban 默认规则有些小问题,看似不能直接生效。本文对系统自带 fail2ban 规则做了些修改,实际在Ubuntu Linux 14上测试可用。

清明假期的时候闲的没事将主机从AWS迁移出来了,blog平台也换成了WordPress。新的主机在所在的网段被无聊的人扫来扫去(有种回到校园网的感觉),而且有不少尝试对ssh的攻击,本着“不折腾不会死”的做死精神,在新的主机上启用了fail2ban。

新的主机跑的是Ubuntu Linux的,使用系统默认配置的fail2ban之后发现其实是不生效的。上网搜了一下发现不少人在抱怨fail2ban不能用。这周末自己闲在家里稍微研究了一下,原来是Ubuntu默认安装的fail2ban规则和系统auth.log产生的log不能匹配造成的。

简单记录一下让Ubuntu Linux上的fail2ban来阻挡ssh猜用户名/密码的攻击方法:

  1. 保证机器的时间正确(时区也看看),安装fail2ban(参考这里)。
  2. 启用ssh证书认证(对,这个和fail2ban没任何关系,但总比用密码认证安全些),具体参考这里: How To Set Up SSH Keys
  3. 看一下/var/log/auth.log中的sshd的报错,我这里放几个我遇到的比较典型的(student是随便一个用户名,10.1.1.1是任意的一个ip,example.com是任意的域名):
    • Invalid user student from 10.1.1.1
    • Received disconnect from 10.1.1.1: 11: Bye Bye [preauth]
    • Address 10.1.1.1 maps to example.com, but this does not map back to the address – POSSIBLE BREAK-IN ATTEMPT!
    • reverse mapping checking getaddrinfo for example.com [10.1.1.1] failed – POSSIBLE BREAK-IN ATTEMPT!
  4. copy /etc/fail2ban/filter.d/ssh.conf /etc/fail2ban/filter.d/bad-ssh.conf
  5. vi (或者你任何喜欢的文本编辑器,别和我争论这点,我是习惯用vi了)bad-ssh.conf,修改成以下内容:

  1. 修改/etc/fail2ban/jail.local,增加下面一段内容

  1. [optional] 修改 /etc/fail2ban/action.d/iptables-blocktype.conf,我是认为直接drop就好了,对这种无聊的攻击没义务发icmp port unreachable回去

  1. 执行service fail2ban restart,注意观察/var/log/fail2ban.log和auth.log,再有攻击发生会能看到类似下面的日志:

如果想要测试自己写的正则表达式是否正确,可以使用fail2ban自带的”fail2ban-regex”来测试,从auth.log中找出自己想匹配的一条日志,然后执行一下这个命令来试试看自己写的表达式是否会匹配即可。例如下面的例子:

需要注意,如果日志里面有中括号([])等特殊字符,记得要用正则表达式的转义字符”\”来匹配。要想匹配的更准确些,还可以考虑用上”$”(行尾)”^”行首等等……正则表达式怎么写就不多说了,网上的教程一大堆……

最后还是要多废话几句,fail2ban不能完全阻止所有的针对ssh的攻击,只能靠暂时封禁来削弱这种攻击的强度。定期看系统日志,发现潜在异常并且根据日志来进行相应的调整是系统管理员必须要做的事情。