
2. 使用usbguard:USBGuard是一种开源软件,可以根据标识符和规则来管理USB设备的访问,可以有效防止未知的USB设备被连接到系统。
3. 通过iptables:可以使用iptables来限制USB设备的流量,例如可以设置一组规则来阻止不同类型的USB设备访问系统。
4. 通过usbkill:usbkill是一款开源的Linux安全工具,可以监控特定的USB设备,当检测到特定的USB设备连接到系统时,可以立即停止系统的运行。
udev的规则文件以行为单位,以“#”开头的行代表注释行。其余的每一行代表一个规则。每个规则分成一个或多个匹配部分和赋值部分。匹配部分用匹配专用的关键字来表示,相应的赋值部分用赋值专用的
关键字来表示。匹配关键字包括:ACTION(行为)、KERNEL(匹配内核设备名)、BUS(匹配总线类
型)、SUBSYSTEM(匹配子系统名)、ATTR(属性)等,赋值关键字包括:NAME(创建的设备文件
名)、SYMLINK(符号创建链接名)、OWNER(设置设备的所有者)、GROUP(设置设备的组)、
IMPORT(调用外部程序)、MODE(节点访问权限)等。
例如,如下规则:
SUBSYSTEM=="net"
, ACTION=="add"
, DRIVERS==" *"
, ATTR{address}=="08:00:27:35:be:ff"
,
ATTR{dev_id}=="0x0"
, ATTR{type}=="1"
, KERNEL=="eth*"
, NAME="eth1"
其中的“匹配”部分包括SUBSYSTEM、ACTION、ATTR、KERNEL等,而“赋值”部分有一项,是
NAME。这个规则的意思是:当系统中出现的新硬件属于net子系统范畴,系统对该硬件采取的动作
是“add”这个硬件,且这个硬件的“address”属性信息等于“08:00:27:35:be:ff”
,
“dev_id”属性等
于“0x0”
、
“type”属性为1等,此时,对这个硬件在udev层次施行的动作是创建/dev/eth1。
通过一个简单的例子可以看出udev和devfs在命名方面的差异。如果系统中有两个USB打印机,一个可
能被称为/dev/usb/lp0,另外一个便是/dev/usb/lp1。但是到底哪个文件对应哪个打印机是无法确定的,
lp0、lp1和实际的设备没有一一对应的关系,映射关系会因设备发现的顺序、打印机本身关闭等而不确
定。因此,理想的方式是两个打印机应该采用基于它们的序列号或者其他标识信息的办法来进行确定的映
射,devfs无法做到这一点,udev却可以做到。使用如下规则:
SUBSYSTEM="usb"
,ATTR{serial}="HXOLL0012202323480"
,NAME="lp_epson"
,SYMLINK+="printers/
epson_stylus"
该规则中的匹配项目有SUBSYSTEM和ATTR,赋值项目为NAME和SYMLINK,它意味着当一台USB
打印机的序列号为“HXOLL0012202323480”时,创建/dev/lp_epson文件,并同时创建一个符号链
接/dev/printers/epson_styles。序列号为“HXOLL0012202323480”的USB打印机不管何时被插入,对应的设
备名都是/dev/lp_epson,而devfs显然无法实现设备的这种固定命名。
udev规则的写法非常灵活,在匹配部分,可以通过“*”
、
“?”
、[a~c]、[1~9]等shell通配符来灵活匹配
多个项目。
*类似于shell中的*通配符,代替任意长度的任意字符串,?代替一个字符。此外,%k就是
KERNEL,%n则是设备的KERNEL序号(如存储设备的分区号)。
笔者在工作中遇到自动挂载U盘,于是在树莓派和红帽系统上研究了一下U盘实现自动挂载。总的来说,Linux gnome/kde窗口环境下有移动存储的管理程序,可以实现自动挂载移动存储设备,但是在命令行下 通常需要用mount命令手动挂载USB存储设备。第二种方法有风险,第三种是设备管理服务udev添加规则实现自动mount,第四种方法则进一步封装mount添加日志功能。 Raspberry Pi中USB设备的自动挂载由基于LXDE的GUI / DE处理,具体来说,由文件管理器PCManFM控制。若要禁用此行为,请打开“文件管理器”,然后从“编辑”菜单中选择“首选项”。选择“卷管理”选项卡,取消选中第二个选项“挂载可移动介质...” ,可以禁用第三个选项“显示可用选项...”设置,以防止d出窗口提示可用程序。 系统开机时会主动读取/etc/fstab这个文件中的内容,根据文件里面的配置挂载磁盘。使用检查UUID: sudo blkid,显示关于可用块设备的信息, 查找您的设备(如 / dev / sda1 )并复制其UUID。此方法只限于开机时已经插入U盘了,开机后再插入就不发自动挂载,需要执行sudo mount -a命令。 在文件/ etc / fstab底部添加:UUID={YOUR-UID} {/path/to/mount/point} {file-system-type} defaults,errors=remount-ro 0 1 倒数第二是dump备份设置,当其值设置为1时,将允许dump备份程序备份;设置为0时,忽略备份 *** 作。倒数第一是fsck磁盘检查设置,其值是一个顺序,当其值为0时,永远不检查;而 / 根目录分区永远都为1,其它分区从2开始,数字越小越先检查。 修改后保存,关闭,重新启动设备以检查或键入: sudo mount -a 。mount -a 是自动挂载 /etc/fstab 里面的东西,会忽略所有已经完成的 *** 作。但是笔者认为在这里面添加太过于危险,不要轻易 *** 作这个文件,有可能造成系统无法开机。外部设备在插入时挂载,在未插入时忽略,不然无法进入系统,这需要添加 nofail 选项,但是 *** 作这个文件不太方便,有其他刚好的方法。 文件种有两种ACTION,add和remove。在U盘插入或者拔出时,自动激活mount和unmount,完成设备自动挂载。 KERNEL!="sd*", GOTO="media_by_label_auto_mount_end" SUBSYSTEM!="block",GOTO="media_by_label_auto_mount_end" IMPORT{program}="/sbin/blkid -o udev -p %N" ENV{ID_FS_TYPE}=="", GOTO="media_by_label_auto_mount_end" ENV{ID_FS_LABEL}!="", ENV{dir_name}="%E{ID_FS_LABEL}" ENV{ID_FS_LABEL}=="", ENV{dir_name}="Untitled-%k" ACTION=="add", ENV{mount_options}="relatime,sync" ACTION=="add", ENV{ID_FS_TYPE}=="vfat", ENV{mount_options}="iocharset=utf8,umask=000" ACTION=="add", ENV{ID_FS_TYPE}=="ntfs", ENV{mount_options}="iocharset=utf8,umask=000" ACTION=="add", RUN+="/bin/mkdir -p /media/%E{dir_name}", RUN+="/bin/mount -o $env{mount_options} /dev/%k /media/%E{dir_name}" ACTION=="remove", ENV{dir_name}!="", RUN+="/bin/umount -l /media/%E{dir_name}", RUN+="/bin/rmdir /media/%E{dir_name}" LABEL="media_by_label_auto_mount_end" 第三种方法中,mount或者unmount命令在实际运用中是无法记录日志的。在生产系统中就需要添加这个插入U盘和拔出U盘的动作,作为审核调查依据。将上面的mount -o或者unmount -l替换成usbhotplug.sh mount 和usbhotplug.sh unmount。 #!/usr/bin/bash time=`date "+%Y%m%d"` LOG_FILE="/home/pi/mount-usb-$time.log" date=`date` echo $date >> $LOG_FILE CMD=$1 case $CMD in 'mount') /bin/mkdir -p $4 echo "/bin/mkdir -p $4" >> $LOG_FILE sleep 2 /bin/mount -o $2 $3 $4 echo "/bin/mount -o $2 $3 $4" >> $LOG_FILE sync echo "----------" >> $LOG_FILE 'umount') sync /bin/umount -f $2 echo "/bin/umount $2" >> $LOG_FILE sleep 2 /bin/rmdir $2 echo "/bin/rmdir $2" >> $LOG_FILE echo "----------" >> $LOG_FILE esac欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)