分类 技术 下的文章

读者对象

理解 udev 背后的基本概念,学习如何写简单的规则。

要求

  • root 权限

难度

中等

约定

  • # - 要求给定的命令使用 root 权限或者直接以一个 root 用户或者使用 sudo 命令去运行。
  • $ - 要求给定的命令以一个普通的非特权用户运行。

介绍

在 GNU/Linux 系统中,虽然设备的底层支持是在内核层面处理的,但是,它们相关的事件管理是在用户空间中通过 udev 来管理的。确切地说是由 udevd 守护进程来完成的。学习如何去写规则,并应用到发生的这些事件上,将有助于我们修改系统的行为并使它适合我们的需要。

规则如何组织

udev 规则是定义在一个以 .rules 为扩展名的文件中。那些文件主要放在两个位置:/usr/lib/udev/rules.d,这个目录用于存放系统安装的规则;/etc/udev/rules.d/ 这个目录是保留给自定义规则的。

定义那些规则的文件的命名惯例是使用一个数字作为前缀(比如,50-udev-default.rules),并且以它们在目录中的词汇顺序进行处理的。在 /etc/udev/rules.d 中安装的文件,会覆盖安装在系统默认路径中的同名文件。

规则语法

如果你理解了 udev 规则的行为逻辑,它的语法并不复杂。一个规则由两个主要的节构成:match 部分,它使用一系列用逗号分隔的键定义了规则应用的条件,而 action 部分,是当条件满足时,我们执行一些动作。

测试案例

讲解可能的选项的最好方法莫过于配置一个真实的案例,因此,我们去定义一个规则作为演示,当鼠标被连接时禁用触摸板。显然,在该规则定义中提供的属性将反映我的硬件。

我们将在 /etc/udev/rules.d/99-togglemouse.rules 文件中用我们喜欢的文本编辑器来写我们的规则。一条规则定义允许跨多个行,但是,如果是这种情况,必须在一个换行字符之前使用一个反斜线(\)表示行的延续,就和 shell 脚本一样。这是我们的规则:

ACTION=="add" \
, ATTRS{idProduct}=="c52f" \
, ATTRS{idVendor}=="046d" \
, ENV{DISPLAY}=":0" \
, ENV{XAUTHORITY}="/run/user/1000/gdm/Xauthority" \
, RUN+="/usr/bin/xinput --disable 16"

我们来分析一下这个规则。

操作符

首先,对已经使用以及将要使用的操作符解释如下:

== 和 != 操作符

== 是相等操作符,而 != 是不等于操作符。通过使用它们,我们可以确认规则上应用的键是否匹配各自的值。

分配操作符 = 和 :=

= 是赋值操作符,是用于为一个键赋值。当我们想要赋值,并且想确保它不会被其它规则所覆盖,我们就需要使用 := 操作符来代替,使用这个操作符分配的值,它就不能被改变。

+= 和 -= 操作符

+=-= 操作符各自用于从一个指定的键定义的值列表中增加或者移除一个值。

我们使用的键

现在,来分析一下在这个规则中我们使用的键。首先,我们有一个 ACTION 键:通过使用它,当在一个设备上发生了特定的事件,我们将指定我们要应用的规则的具体内容。有效的值有 addremove 以及 change

然后,我们使用 ATTRS 关键字去指定一个属性去匹配。我们可以使用 udevadm info 命令去列出一个设备属性,提供它的名字或者 sysfs 路径即可:

udevadm info -ap /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1/0003:046D:C52F.0010/input/input39

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1/0003:046D:C52F.0010/input/input39':
    KERNEL=="input39"
    SUBSYSTEM=="input"
    DRIVER==""
    ATTR{name}=="Logitech USB Receiver"
    ATTR{phys}=="usb-0000:00:1d.0-1.2/input1"
    ATTR{properties}=="0"
    ATTR{uniq}==""

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1/0003:046D:C52F.0010':
    KERNELS=="0003:046D:C52F.0010"
    SUBSYSTEMS=="hid"
    DRIVERS=="hid-generic"
    ATTRS{country}=="00"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1':
    KERNELS=="2-1.2:1.1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usbhid"
    ATTRS{authorized}=="1"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceClass}=="03"
    ATTRS{bInterfaceNumber}=="01"
    ATTRS{bInterfaceProtocol}=="00"
    ATTRS{bInterfaceSubClass}=="00"
    ATTRS{bNumEndpoints}=="01"
    ATTRS{supports_autosuspend}=="1"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2':
    KERNELS=="2-1.2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPacketSize0}=="8"
    ATTRS{bMaxPower}=="98mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 2"
    ATTRS{bcdDevice}=="3000"
    ATTRS{bmAttributes}=="a0"
    ATTRS{busnum}=="2"
    ATTRS{configuration}=="RQR30.00_B0009"
    ATTRS{devnum}=="12"
    ATTRS{devpath}=="1.2"
    ATTRS{idProduct}=="c52f"
    ATTRS{idVendor}=="046d"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="Logitech"
    ATTRS{maxchild}=="0"
    ATTRS{product}=="USB Receiver"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="removable"
    ATTRS{speed}=="12"
    ATTRS{urbnum}=="1401"
    ATTRS{version}==" 2.00"

    [...]

上面截取了运行这个命令之后的输出的一部分。正如你从它的输出中看到的那样,udevadm 从我们提供的指定路径开始,并且提供了所有父级设备的信息。注意设备的属性都是以单数的形式报告的(比如,KERNEL),而它的父级是以复数形式出现的(比如,KERNELS)。父级信息可以做为规则的一部分,但是同一时间只能有一个父级可以被引用:不同父级设备的属性混合在一起是不能工作的。在上面我们定义的规则中,我们使用了一个父级设备属性:idProductidVendor

在我们的规则中接下来做的事情是,去使用 ENV 关键字:它既可以用于设置也可以用于去匹配环境变量。我们给 DISPLAYXAUTHORITY 分配值。当我们使用 X 服务器程序进行交互去设置一些需要的信息时,这些变量是非常必要的:使用 DISPLAY 变量,我们指定服务器运行在哪个机器上,用的是哪个显示和屏幕;使用 XAUTHORITY 提供了一个文件路径,其包含了 Xorg 认证和授权信息。这个文件一般位于用户的家目录中。

最后,我们使用了 RUN 字:它用于运行外部程序。非常重要:这里没有立即运行,但是一旦所有的规则被解析,将运行各种动作。在这个案例中,我们使用 xinput 实用程序去改变触摸板的状态。我不想解释这里的 xinput 的语法,它超出了本文的范围,只需要注意这个触摸板的 ID 是 16

规则设置完成之后,我们可以通过使用 udevadm test 命令去调试它。这个命令对调试非常有用,它并不真实去运行 RUN 指定的命令:

$ udevadm test --action="add" /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1/0003:046D:C52F.0010/input/input39

我们提供给命令的是使用 --action 选项,以及设备的 sysfs 路径的模拟动作。如果没有报告错误,说明我们的规则运行的很好。要在真实的环境中去使用它,我们需要重新加载规则:

# udevadm control --reload

这个命令将重新加载规则文件,但是,它只对重新加载之后发生的事件有效果。

我们通过创建一个 udev 规则了解了基本的概念和逻辑,这只是 udev 规则中众多的选项和可能的设置中的一小部分。udev 手册页提供了一个详尽的列表,如果你想深入了解,请参考它。


via: https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux

作者:Egidio Docile 译者:qhwdw 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

作为一个狂热的互联网人,你在生活中一定遇到过 网络爬虫 Web Crawler 这个词。那么什么是网络爬虫,谁使用网络爬虫?它是如何工作的?让我们在本文中讨论这些。

什么是网络爬虫?

web crawler source code sync

网络爬虫 Web Crawler 也被称为 网络蜘蛛 web-spider 是一个在互联网中访问不同网站的各个页面的互联网软件或者机器人。网络爬虫从这些网页中检索各种信息并将其存储在其记录中。这些抓取工具主要用于从网站收集内容以改善搜索引擎的搜索。

谁使用网络爬虫?

大多数搜索引擎使用爬虫来收集来自公共网站的越来越多的内容,以便它们可以向用户提供更多相关内容。

search engines use web crawlers

许多商业机构使用网络爬虫专门搜索人们的电子邮件地址和电话号码,以便他们可以向你发送促销优惠和其他方案。这基本上是垃圾邮件,但这是大多数公司创建邮件列表的方式。

黑客使用网络爬虫来查找网站文件夹中的所有文件,主要是 HTML 和 Javascript。然后他们尝试通过使用 XSS 来攻击网站。

网络爬虫如何工作?

网络爬虫是一个自动化脚本,它所有行为都是预定义的。爬虫首先从要访问的 URL 的初始列表开始,这些 URL 称为种子。然后它从初始的种子页面确定所有其他页面的超链接。网络爬虫然后将这些网页以 HTML 文档的形式保存,这些 HTML 文档稍后由搜索引擎处理并创建一个索引。

网络爬虫和 SEO

网络爬虫对 SEO,也就是 搜索引擎优化 Search Engine Optimization 有很大的影响。由于许多用户使用 Google,让 Google 爬虫为你的大部分网站建立索引非常重要。这可以通过许多方式来完成,包括不使用重复的内容,并在其他网站上具有尽可能多的反向链接。许多网站被认为是滥用这些技巧,最终被引擎列入黑名单。

robots.txt

robots.txt 是爬虫在抓取你的网站时寻找的一种非常特殊的文件。该文件通常包含有关如何抓取你的网站的信息。一些网站管理员故意不希望他们的网站被索引也可以通过使用 robots.txt 文件阻止爬虫。

总结

爬虫是一个小的软件机器人,可以用来浏览很多网站,并帮助搜索引擎从网上获得最相关的数据。


via: http://www.theitstuff.com/web-crawler-web-crawlers-work

作者:Rishabh Kandari 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Linux 小白,若对系统管理有兴趣,或想成为资深用户,就需要对命令行有扎实的功底。你需要知道很多命令,其中一个就是 uptime。文本我们会通过一些容易理解的案例来讲解一下这个命令的基本用法。

再开始前有必要说一下,文中的所有案例都在 Ubuntu 16.04 上测试过了。

Linux uptime 命令

望名生义,uptime 命令告诉你系统 启动 up 了(运行了)多长时间。这是语法:

uptime [options]

这个工具的 man 页是这么说的:

uptime会在一行中显示下列信息:当前时间、系统运行了多久时间、当前登录的用户有多少,以及前 1、5 和 15 分钟系统的平均负载。

下面这些问答形式的案例应该会让你对 uptime 命令有更好的了解。

Q1、如何使用 uptime 命令

uptime 的基础用法很简单 —— 只需要输入命令名称然后按下回车就行。

uptime

这是输出:

How to use the uptime command

这里,第一项是当前时间,up 表示系统正在运行,5:53 是系统启动的总时间,最后是系统的 负载 load 信息。若你想深入了解,这里是 uptime man 页中关于最后一项信息的说明:

系统负载是处于 可运行 runnable 不可中断 uninterruptable 状态的进程的平均数。可运行状态的进程要么正在使用 CPU 要么在等待使用 CPU。 不可中断状态的进程则正在等待某些 I/O 访问,例如等待磁盘 IO。

有三个时间间隔的平均值。负载均值的意义根据系统中 CPU 的数量不同而不同,负载为 1 对于一个只有单 CPU 的系统来说意味着负载满了,而对于一个拥有 4 CPU 的系统来说则意味着 75% 的时间里都是空闲的。

Q2、如何以更人性化的格式现实时间

若你只想知道系统运行了多长时间,而且希望以更人性化的格式来显示,那么可以使用 -p 项。

uptime -p

这是输出:

make the tool show up time in pretty format

Q3、如何让 uptime 显示系统启动的日期/时间

你也可以指定 uptme 显示系统开始运行的时间和日期。方法是使用 -s 命令项。

uptime -s

这是输出:

make uptime display date/time since when system is up

Q4、如何获取版本信息和帮助信息

-V 获取版本信息,-h 获取帮助信息。

uptime -V

uptime -h

How to get version information and help

结论

你可以看到,uptime 命令很容易理解也很容易使用。它没有提供很多的功能(命令选项也很少)。这里已经覆盖了它的所有功能了。因此只需要练习一下这些选项你就能在日常工作中使用它了。如果需要的话,你也可以查看它的 man 页


via: https://www.howtoforge.com/linux-uptime-command/

作者:Himanshu Arora 译者:lujun9972 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Bunco:一个使你的“快艇”游戏看起来更复杂的掷骰子游戏。

我已经有段时间没有编写游戏了,所以我觉得现在正是做一些这方面事情的时候。起初,我想“用脚本编一个 Halo游戏?”(LCTT 译注:Halo,光晕系列游戏),但我后来意识到这不太可能。来编一个叫 Bunco 的简单骰子游戏吧。你也许没有听说过,不过你母亲绝对知道 —— 当一群年轻女孩聚在当地的酒吧或者小酒馆的时候,这是个很受欢迎的游戏。

游戏一共六轮,有三个骰子,规则很简单。每次投三个骰子,投出的点数要和当前的轮数数字一致。如果三个骰子都和当前的轮数一致,(比如,在第三轮三个骰子都是 3),你这一轮的分数就是 21。 如果三个骰子点数都相同但和轮数数字不同,你会得到最低的 Bunco 分数,只有 5 分。如果你投出的点数两者都不是,每一个和当前轮数相同的骰子得 1 分。

要想玩这个游戏,它还涉及到团队合作,每一队(包括赢的那队),每人付 5 美元现金,或赢家得到其他类似现金奖励,并规定什么样的情况下才是赢家,例如“最多 Buncos” 或“最大点数”的情况下胜利。在这里我会跳过这些,而只关注投骰子这一部分。

关于数学逻辑部分

在专注于编程这方面的事之前,我先简单说说游戏背后的数学逻辑。要是有一个适当重量的骰子投骰子会变得很容易,任意一个值出现概率都是 1/6。

完全随机小提示:不确定你的骰子是否每个面都是一样重量? 把它们扔进盐水里然后掷一下。YouTube 上有一些有趣的 D&D 世界的视频向你展示了怎么来做这个测试。

所以三个骰子点数一样的几率有多大? 第一个骰子 100% 会有一个值 (这儿没什么可说的),所以很简单。第二个则有 16.66% 的概率和第一个骰子的值一样,接下来第三个骰子也是一样。 但当然,总概率是三个概率相乘的结果,所以最后,三个骰子值相等的概率是 2.7%。

接下来,每个骰子和当前轮数数字相同的概率都是 16.66%。从数学角度来说:0.166 * 0.166 * 0.166 = 0.00462 。

换句话说,你有 0.46% 的可能性投出 Bunco,比 200 次中出现一次的可能性还小一点。

实际上还可以更难。如果你有 5 个骰子,投出 Mini Bunco (也可以叫做 Yahtzee “快艇”) 的概率为 0.077%,如果你想所有的骰子的值都相同,假设都是 6,那概率就是 0.00012%,那就基本上没什么可能了。

开始编程吧

和所有游戏一样,最难的部分是有一个能生成真正的随机数的随机数发生器。这一部分在 shell 脚本中还是很难实现的,所以我需要先回避这个问题,并假设 shell 内置的随机数发生器就够用了。

不过好在内置的随机数发生器很好用。用 $RANDOM 就能得到一个 0MAXINT(32767) 之间的随机值:

$ echo $RANDOM $RANDOM $RANDOM
10252 22142 14863

为了确保产生的值一定是 1 - 6 之中的某个值,使用取余函数:

$ echo $(( $RANDOM % 6 ))
3
$ echo $(( $RANDOM % 6 ))
0

哦!我忘了要加 1,下面是另一次尝试:

$ echo $(( ( $RANDOM % 6 ) + 1 ))
6

下面要实现投骰子这一功能。这个函数中你可以声明一个局部变量来存储生成的随机值:

rolldie()
{
   local result=$1
   rolled=$(( ( $RANDOM % 6 ) + 1 ))
   eval $result=$rolled
}

使用 eval 确保生成的随机数被实际存储在变量中。这一部分也很容易:

rolldie die1

这会为第一个骰子生成一个 1 - 6 之间的随机值存储到 die1 中。要掷 3 个骰子,很简单:

rolldie die1 ; rolldie die2 ; rolldie die3

现在判断下生成的值。首先,判断是不是 Bunco(3 个骰子值相同),然后是不是和当前轮数值也相同:

if [ $die1 -eq $die2 ] && [ $die2 -eq $die3 ] ; then
  if [ $die1 -eq $round ] ; then
    echo "BUNCO!"
    score=25
  else
    echo "Mini Bunco!"
    score=5
  fi

这可能是所有判断语句中最难的部分了,注意第一个条件语句中这种不常用的写法 : [ cond1 ] && [ cond2 ]。如果你想写成 cond1 -a cond2 ,这样也可以。在 shell 编程中,解决问题的方法往往不止一种。

代码剩下的部分很直白,你只需要判断每个骰子的值是不是和本轮数字相同:

if [ $die1 -eq $round ] ; then
  score=1
fi
if [ $die2 -eq $round ] ; then
  score=$(( $score + 1 ))
fi
if [ $die3 -eq $round ] ; then
  score=$(( $score + 1 ))
fi

唯一要注意的是当出现 Bunco/Mini Bunco 就不需要再统计本轮分数了。所以整个第二部分的判断语句都要写在第一个条件语句的 else 中(为了判断 3 个骰子值是否都相同)。

把所有的综合起来,然后在命令行中输入轮数,下面是现在的脚本执行后的结果:

$ sh bunco.sh 5
You rolled: 1 1 5
score = 1
$ sh bunco.sh 2
You rolled: 6 4 3
score = 0
$ sh bunco.sh 1
You rolled: 1 1 1
BUNCO!
score = 25

竟然这么快就出现 Bunco 了? 好吧,就像我说的,shell 内置的随机数发生器在随机数产生这方面可能有些问题。

你可以再写个脚本测试一下,去运行上述脚本几百次,然后看看 Bunco/Mini Bunco 出现次数所占的百分比。但是我想把这部分作为练习,留给亲爱的读者你们。不过,也许我下次会抽时间完成剩下的部分。

让我们完成这一脚本吧,还有分数统计和一次性执行 6 次投骰子(这次不用再在命令行中手动输入当前轮数了)这两个功能。这也很容易,因为只是将上面的内容整个嵌套在里面,换句话说,就是将一个复杂的条件嵌套结构全部写在了一个函数中:

BuncoRound()
{
   # roll, display, and score a round of bunco!
   # round is specified when invoked, score added to totalscore

   local score=0 ; local round=$1 ; local hidescore=0

   rolldie die1 ; rolldie die2 ; rolldie die3
   echo Round $round. You rolled: $die1 $die2 $die3

   if [ $die1 -eq $die2 ] && [ $die2 -eq $die3 ] ; then
     if [ $die1 -eq $round ] ; then
       echo "  BUNCO!"
       score=25
       hidescore=1
     else
       echo "  Mini Bunco!"
       score=5
       hidescore=1
     fi
   else
     if [ $die1 -eq $round ] ; then
       score=1
     fi
     if [ $die2 -eq $round ] ; then
       score=$(( $score + 1 ))
     fi
     if [ $die3 -eq $round ] ; then
       score=$(( $score + 1 ))
     fi
   fi

   if [ $hidescore -eq 0 ] ; then
     echo "  score this round: $score"
   fi

   totalscore=$(( $totalscore + $score ))
}

我承认,我忍不住自己做了一点改进,包括判断当前是 Bunco、Mini Bunco 还是其他需要计算分数的情况这一部分 (这就是 $hidescore 这一变量的作用)。

实现这个简直是小菜一碟,只要一个循环就好了:

for round in {1..6} ; do
  BuncoRound $round
done

这就是现在所写的整个程序。让我们执行一下看看结果:


$ sh bunco.sh 1
Round 1\. You rolled: 2 3 3
  score this round: 0
Round 2\. You rolled: 2 6 6
  score this round: 1
Round 3\. You rolled: 1 2 4
  score this round: 0
Round 4\. You rolled: 2 1 4
  score this round: 1
Round 5\. You rolled: 5 5 6
  score this round: 2
Round 6\. You rolled: 2 1 3
  score this round: 0
Game over. Your total score was 4

嗯。并不是很令人满意,可能是因为它只是游戏的一次完整执行。不过,你可以将脚本执行几百几千次,记下“Game over”出现的位置,然后用一些快速分析工具来看看你在每 6 轮中有几次得分超过 3 分。(要让 3 个骰子值相同,这个概率大概在 50% 左右)。

无论怎么说,这都不是一个复杂的游戏,但是它是一个很有意思的小程序项目。现在,如果有一个 20 面的骰子,每一轮游戏有好几十轮,每轮都掷同一个骰子,情况又会发生什么变化呢?


via: http://www.linuxjournal.com/content/shell-scripting-bunco-game

作者:Dave Taylor 译者:wenwensnow 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

如今,大多数人都认为文件加密是必要的,甚至在 Linux 系统上也是如此。 如果你和我一样, 最初被 Ubuntu 所吸引是因为 Linux 系统强化的安全性,恐怕我有个坏消息要告诉你:Linux 已经成为它自身“成功”的受害者。 近年来,用户数量的大幅度增加导致了这类系统的攻击和盗窃活动呈指数级增长。

曾经有一个非常简单的解决方案来在像 Ubuntu 这样的 Linux 系统上加密文件:它叫做 Truecrypt。 直到 2015 年,它提供了不同程度的军事级别的加密,并且在大多数 Linux 系统中运行良好。不幸的是, 它已经停止开发了, 因此变得相当不安全。

替代品

幸运的是,除了 Truecrypt,还有一些选择。 Truecrypt 的直接继承者是 Veracrypt ,它由一群开发者从 Truecrypt 获取源代码并保持更新的。

该项目已经发展成为令人印象深刻的独立系统,但现在渐已老迈。旧系统,尤其是那些处理安全问题的系统,只能更新多次而才不会引入漏洞。

出于这个原因,在其他许多方面,应该寻找一个更外围一些的加密软件。我选择的是 Tomb。

为什么是 Tomb

在某些方面,Tomb 与其他加密软件非常相似。它将加密文件存储在专用的“Tomb 文件夹”中,可以让你快速查看您已加密的文件。

它还使用与 Veracrypt 类似的 AES-256 加密标准。这个标准适用于 NSA 、微软和 Apple,并被认为是最安全的加密算法之一。如果你不熟悉加密技术,则应该阅读一点技术背景知识,但如果你只想快速、安全地加密,请不要担心, Tomb 将不负所望。

Tomb 也有一些很大的不同之处。首先,它是专门为 GNU/Linux 系统开发的,可以解决一些更广泛的加密软件的兼容性问题。

第二,尽管 Tomb 是开源的,但它使用的是静态链接库,以至于其源代码难以审计。 这意味着一些操作系统发行版开发者并不认为它是自由的,但是当涉及到安全软件时,这实际上是一件好事:这意味着与完全“自由”软件相比, Tomb 被黑客攻击的可能性更小。

最后,它有几个先进的功能,如 隐写术 steganography ,这使你可以将你的关键文件隐藏在其他文件中。 尽管 Tomb 主要是一个命令行工具,它也带有 GUI 界面—— gtomb,它允许初学者用图形化的方式使用它。

这是推销么? 好吧,在我告诉你如何使用 Tomb 之前,值得注意的是,没有一个加密软件能提供完全的保护。 Tomb 不会让你的计算机隐藏于你 ISP,也不会保护存储在云中的文件。如果你想对云存储进行完全加密,您需要使用 Tor 浏览器和零日志 VPN 登录到你喜欢的存储服务中。 这里有很多选项,但是 Trust Zone 是一个很好的浏览器,而 Tinc 是一个很好的 VPN 工具。

说了这么多,如果你正在寻找 Ubuntu 16.04 上的快速、简单、安全的加密,Tomb 无疑是一条可行的路。让我们开始吧。

在 Ubuntu 16.04 上安装 Tomb

因为 Tomb 是专门为 Linux 设计的, 所以安装非常简单。

几年前,SparkyLinux (它本身就是一个非常好的 Debian 衍生产品)的开发者们将 “Tomb” 添加到他们的官方存储库中。 你可以通过在 Ubuntu 系统上添加这些存储库来安装它。

要做到这一点, 打开一个终端并添加一个存储库文件:

sudo vi /etc/apt/sources.list.d/sparky-repo.list

然后在文件中添加以下行:

deb https://sparkylinux.org/repo stable main
deb-src https://sparkylinux.org/repo stable main
deb https://sparkylinux.org/repo testing main
deb-src https://sparkylinux.org/repo testing main

保存并关闭该文件。

你现在需要安装 Sparky 公钥,使用下列步骤:

sudo apt-get install sparky-keyring

或者:

wget -O - https://sparkylinux.org/repo/sparkylinux.gpg.key | sudo apt-key add -

然后你需要使用标准的命令来更新你的存储库:

sudo apt-get update

然后简单地使用 apt 安装 Tomb:

sudo apt-get install tomb

如果你想要带有 GUI 的 Tomb,安装同样简单。只需使用 apt 来安装 gtomb:

sudo apt-get install gtomb

就是这样,你现在应该安装好了一个可以工作的 Tomb。 让我们看看如何使用它。

使用 Tomb

通过命令行使用 Tomb

Tomb 主要是一个命令行工具,所以我将首先介绍这个用法。 如果你不喜欢使用终端,你可以跳过这节并查看下一部分。

实际上,不用说了。 如果你以前从来没有使用过命令行,那么 Tomb 是一个很好的开始,因为它使用简单的命令,只要你小心,那么你很少有机会把事情搞砸。

Tomb 实际上使用了一组以墓地为主题的非常有趣的命令集。 每个加密文件夹都被称为“tomb”(墓碑) ,而且(我很快就会讲到) ,它们可以使用类似的哥特式命令。

首先,让我们创造(挖)一个新的 tomb。你可以指定你的新 tomb 的名称和大小,所以让我们使用 “Tomb1”这个名称并指定大小为 100 MB。

你需要 root 权限,所以打开终端并键入(或复制) :

sudo tomb dig -s 100 Tomb1.tomb

你应该会得到类似这样的输出:

tomb . Commanded to dig tomb Tomb1.tomb
tomb (*) Creating a new tomb in Tomb1.tomb
tomb . Generating Tomb1.tomb of 100MiB
100 blocks (100Mb) written.
100+0 records in
100+0 records out
-rw------- 1 Tomb1 Tomb1 100M Jul 4 18:53 Tomb1.tomb
tomb (*) Done digging  Tomb1
tomb . Your tomb is not yet ready, you need to forge a key and lock it:
tomb . tomb forge Tomb1.tomb.key
tomb . tomb lock Tomb1.tomb -k Tomb1.tomb.key

正如输出的帮助说明,你现在需要创建(打造)一个密钥文件来锁定你的 tomb:

sudo tomb forge Tomb1.tomb.key

如果在此时出现提及“活动交换分区”的错误,则需要停用所有活动交换分区:

sudo swapoff -a

然后再运行上面的 keyfile 命令。

生成密钥文件可能需要几分钟时间,这具体取决于系统的速度。然而,在完成后系统会要求你输入新密码以确保密钥的安全:

输入两次,然后你的新密钥文件就会被制作出来。

你现在需要用你的新密钥来锁定你的 tomb。你可以这样做:

sudo tomb lock Tomb1.tomb -k Tomb1.tomb.key

你将被要求输入你的密码。 这样做, 你应该会得到如下的输出:

tomb . Commanded to lock tomb Tomb1.tomb

[sudo] Enter password for user Tomb1 to gain superuser privileges

tomb . Checking if the tomb is empty (we never step on somebody else's bones).
tomb . Fine, this tomb seems empty.
tomb . Key is valid.
tomb . Locking using cipher: aes-xts-plain64:sha256
tomb . A password is required to use key Tomb1.tomb.key
tomb . Password OK.
tomb (*) Locking Tomb1.tomb with Tomb1.tomb.key
tomb . Formatting Luks mapped device.
tomb . Formatting your Tomb with Ext3/Ext4 filesystem.
tomb . Done locking Tomb1 using Luks dm-crypt aes-xts-plain64:sha256
tomb (*) Your tomb is ready in Tomb1.tomb and secured with key Tomb1.tomb.key

现在一切都安排好了,你可以开始使用你的新 tomb 了。

这里有一个注意事项:因为我只是在告诉你该怎么做,所以我把我的密钥文件和 tomb 存放在同一个目录中(在这里是 $HOME)。 你不应该这样做——把你的密钥存放在别的地方,最好是在除了你之外没有人能找到的地方。

然而,你需要记住你把它放在哪里,因为你需要用它来打开你的 tomb。 要做到这一点, 请输入:

sudo tomb open Tomb1.tomb -k path/to/your/Tomb1.tomb.key

输入你的密码,然后你就可以进去了。 tomb 会输出一些类似以下的内容:

tomb (*) Success unlocking tomb Tomb1
tomb . Checking filesystem via /dev/loop0
fsck from util-linux 2.27.1
Tomb1: clean, 11/25168 files, 8831/100352 blocks
tomb (*) Success opening Tomb1.tomb on /media/Tomb1

然后你应该看到你的新 tomb 挂载在了 finder 窗口。

你现在可以从 tomb 中保存和打开文件,但是请注意,你需要 root权限才能这样做。

在你使用完之后需要用以下方法卸载你的 tomb:

sudo tomb close

或者,如果你想强制关闭所有的打开的 tomb, 你可以使用:

sudo tomb slam all

使用带 GUI 的 Tomb

如果你不喜欢使用命令行,或者只是想要一个图形界面,你可以使用 gtomb。与许多图形用户界面包装器不同, gtomb 使用起来很容易。

让我们来看看如何使用 gtomb 建立一个新的 tomb。 首先,从菜单中启动 gtomb。 它可能会是这 样的:

所有的事情都是一目了然的,但为了完整起见,我将详细介绍如何建立你的第一个 tomb。

首先,点击第一个选项“dig”。 点击确定,然后选择一个位置。

接下来,输入你的 tomb 的大小:

你现在有了一个新的 tomb,但是你需要在使用它之前做一把钥匙。 要做到这一点, 请在主菜单中 单击“forge”:

Tomb 会要求你输入两次密码,那就这样做。

然后通过点击来使用密钥锁定你的 tomb,你已经猜到了,“lock”。 要打开它, 请单击“open”并再次输入您的密码。

从上面的截图中你可以看到,使用 gtomb 是非常容易的,你不应该遇到任何问题。 大多数常见的任务都可以通过点击来完成,对于任何更复杂的事情,你可以使用命令行。

最后的想法

就是这样!你现在应该准备好你的第一个 tomb 了,并存储任何你想在 tomb 中保密和安全的信息,这些信息会更加安全。

你可以同时使用多个 tomb,并将它们中的文件绑定到你的 $HOME 目录,这样你的程序就不会感到困惑。

我希望这本指南能帮助你开始。 就像使用一个标准的文件夹一样使用你的 Tomb,但是对于更复杂的命令,你总是可以查看 Tomb 官方指南


via: https://www.howtoforge.com/tutorial/how-to-install-and-use-tomb-file-encryption-on-ubuntu-1604/

作者: Dan Fries 选题: lujun9972 译者: Auk7F7 校对: wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在 Linux 命令行上删除文件和目录,我们已经讨论过 rm 命令 的使用。然而,这里有另一个相关的命令行工具,专门针对目录的删除。这是所指的工具就是 rmdir,本教程中,我们将根据一些简单的实例来讨论它。

Linux rmdir 命令

见名知意,rmdir(remove directory) 命令专门针对删除目录,不过通常目录内空空如也。如下是它的语法:

rmdir [OPTION]... DIRECTORY...

下面是 man 文档的说明:

如目录为空,则删除之。

在理解此程序如何工作,下面的 Q&A 风格的案例可能会给您带来更好的灵感。

Q1. rmdir 命令如何工作?

这非常直接,只需将目录名作为输入参数传递给它。

比如:

rmdir test-dir

rmdir 命令如何工作

Q2. 如何让 rmdir 忽略非空目录?

通常情况下,rmdir 命令会在您删除非空目录时抛出一个错误。然而,如果需要的话,您可以使用 --ignore-fail-on-non-empty 选项,忽略它。

比如说:

如何让 rmdir 忽视非空目录

Q3. 如何让 rmdir 命令移除父目录?

mkdir 一样,您可以通过要求 rmdir 命令在其父目录执行操作。这意味着,您可以一次性删除目录和目录的上级目录。这个功能可以通过 -p 命令选项实现。

比如,下面的命令将会删除 “test” 和 “test-dir” 目录。

rmdir -p test/test-dir/

注意: 欲此操作生效,所有被删除的父目录都不应该包含要被删除的空目录之外的任何目录。

Q4. rmdir 和 rm -r 有何区别?

如果还有印象,您还可以通过提供 -r 选项的 rm 命令删除目录。那 rmdirrm -r 区别何在?rmdir 仅对空目录生效 —— 您没有办法使用 rmdir 删除非空目录。

因此,rmdir 在删除需要检测目录是否为空的情况下,是一个有效的工具。

总结

相信您会认同,rmdir 并不是一个难以理解和使用的复杂命令。除此之外,它仅提供少量命令行选项。在此,我们几乎讨论了所有的选项,如果您想掌握的更好,练习在本教程提到的案例即可。关于 rmdir这里另有 man 文档,备您不时之需。


via: https://www.howtoforge.com/linux-rmdir-command/

作者:Himanshu Arora 译者:CYLeft 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出