如何在 Linux 上为特定的用户或用户组启用或禁用 SSH？
由于你的公司标准规定，你可能只能允许部分人访问 Linux 系统。或者你可能只能够允许几个用户组中的用户访问 Linux 系统。那么如何实现这样的要求呢？最好的方法是什么呢？如何使用一个简单的方法去实现呢？是的，我们会有很多种方法去实现它。但是我们应该使用简单轻松的方法。为了简单轻松的完成目的，我们可以通过对 /etc/ssh/sshd_config 文件做必要的修改来实现。在这篇文章中我们将会向你展示实现要求的详细步骤。为什么我们要这样做呢？是出于安全的原因。你可以访问这个链接来获取更多关于 openSSH 的使用方法。什么是 SSH ？openssh 全称为 OpenBSD Secure Shell。Secure Shell（ssh）是一个自由开源的网络工具，它能让我们在一个不安全的网络中通过使用 Secure Shell（SSH）协议来安全访问远程主机。它采用了客户端-服务器架构（C/S），拥有用户身份认证、加密、在计算机和隧道之间传输文件等功能。我们也可以用 telnet 或 rcp 等传统工具来完成，但是这些工具都不安全，因为它们在执行任何动作时都会使用明文来传输密码。如何在 Linux 中允许用户使用 SSH？通过以下内容，我们可以为指定的用户或用户列表启用 ssh 访问。如果你想要允许多个用户，那么你可以在添加用户时在同一行中用空格来隔开他们。为了达到目的只需要将下面的值追加到 /etc/ssh/sshd_config 文件中去。 在这个例子中， 我们将会允许用户 user3 使用 ssh。# echo "AllowUsers user3" >> /etc/ssh/sshd_config你可以运行下列命令再次检查是否添加成功。# cat /etc/ssh/sshd_config | grep -i allowusers AllowUsers user3这样就行了， 现在只需要重启 ssh 服务和见证奇迹了。（下面这两条命令效果相同， 请根据你的服务管理方式选择一条执行即可）# systemctl restart sshd 或 # service restart sshd接下来很简单，只需打开一个新的终端或者会话尝试用不同的用户身份访问 Linux 系统。是的，这里 user2 用户是不被允许使用 SSH 登录的并且会得到如下所示的错误信息。# ssh user2@192.168.1.4 user2@192.168.1.4's password: Permission denied, please try again.输出:Mar 29 02:00:35 CentOS7 sshd[4900]: User user2 from 192.168.1.6 not allowed because not listed in AllowUsers Mar 29 02:00:35 CentOS7 sshd[4900]: input_userauth_request: invalid user user2 [preauth] Mar 29 02:00:40 CentOS7 unix_chkpwd[4902]: password check failed for user (user2) Mar 29 02:00:40 CentOS7 sshd[4900]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.1.6 user=user2 Mar 29 02:00:43 CentOS7 sshd[4900]: Failed password for invalid user user2 from 192.168.1.6 port 42568 ssh2与此同时用户 user3 被允许登入系统因为他在被允许的用户列表中。# ssh user3@192.168.1.4 user3@192.168.1.4's password: [user3@CentOS7 ~]$输出:Mar 29 02:01:13 CentOS7 sshd[4939]: Accepted password for user3 from 192.168.1.6 port 42590 ssh2 Mar 29 02:01:13 CentOS7 sshd[4939]: pam_unix(sshd:session): session opened for user user3 by (uid=0)如何在 Linux 中阻止用户使用 SSH ？通过以下内容，我们可以配置指定的用户或用户列表禁用 ssh。如果你想要禁用多个用户，那么你可以在添加用户时在同一行中用空格来隔开他们。为了达到目的只需要将以下值追加到 /etc/ssh/sshd_config 文件中去。 在这个例子中， 我们将禁用用户 user1 使用 ssh。# echo "DenyUsers user1" >> /etc/ssh/sshd_config你可以运行下列命令再次检查是否添加成功。# cat /etc/ssh/sshd_config | grep -i denyusers DenyUsers user1这样就行了， 现在只需要重启 ssh 服务和见证奇迹了。# systemctl restart sshd 活 # service restart sshd接下来很简单，只需打开一个新的终端或者会话，尝试使用被禁用的用户身份被访问 Linux 系统。是的，这里 user1 用户在禁用名单中。所以，当你尝试登录时，你将会得到如下所示的错误信息。# ssh user1@192.168.1.4 user1@192.168.1.4's password: Permission denied, please try again.输出:Mar 29 01:53:42 CentOS7 sshd[4753]: User user1 from 192.168.1.6 not allowed because listed in DenyUsers Mar 29 01:53:42 CentOS7 sshd[4753]: input_userauth_request: invalid user user1 [preauth] Mar 29 01:53:46 CentOS7 unix_chkpwd[4755]: password check failed for user (user1) Mar 29 01:53:46 CentOS7 sshd[4753]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.1.6 user=user1 Mar 29 01:53:48 CentOS7 sshd[4753]: Failed password for invalid user user1 from 192.168.1.6 port 42522 ssh2如何在 Linux 中允许用户组使用 SSH?通过以下内容，我们可以允许一个指定的组或多个组使用 ssh。如果你想要允许多个组使用 ssh 那么你在添加用户组时需要在同一行中使用空格来隔开他们。为了达到目的只需将以下值追加到 /etc/ssh/sshd_config 文件中去。在这个例子中，我们将允许 2g-admin 组使用 ssh。# echo "AllowGroups 2g-admin" >> /etc/ssh/sshd_config你可以运行下列命令再次检查是否添加成功。# cat /etc/ssh/sshd_config | grep -i allowgroups AllowGroups 2g-admin运行下列命令查看属于该用户组的用户有哪些。# getent group 2g-admin 2g-admin:x:1005:user1,user2,user3这样就行了， 现在只需要重启 ssh 服务和见证奇迹了。# systemctl restart sshd 或 # service restart sshd是的， user1 被允许登入系统因为用户 user1 属于 2g-admin 组。# ssh user1@192.168.1.4 user1@192.168.1.4's password: [user1@CentOS7 ~]$输出:Mar 29 02:10:21 CentOS7 sshd[5165]: Accepted password for user1 from 192.168.1.6 port 42640 ssh2 Mar 29 02:10:22 CentOS7 sshd[5165]: pam_unix(sshd:session): session opened for user user1 by (uid=0)是的， user2 被允许登入系统因为用户 user2 同样属于 2g-admin 组。# ssh user2@192.168.1.4 user2@192.168.1.4's password: [user2@CentOS7 ~]$输出:Mar 29 02:10:38 CentOS7 sshd[5225]: Accepted password for user2 from 192.168.1.6 port 42642 ssh2 Mar 29 02:10:38 CentOS7 sshd[5225]: pam_unix(sshd:session): session opened for user user2 by (uid=0)当你尝试使用其他不在被允许的组中的用户去登入系统时， 你将会得到如下所示的错误信息。# ssh ladmin@192.168.1.4 ladmin@192.168.1.4's password: Permission denied, please try again.输出:Mar 29 02:12:36 CentOS7 sshd[5306]: User ladmin from 192.168.1.6 not allowed because none of user's groups are listed in AllowGroups Mar 29 02:12:36 CentOS7 sshd[5306]: input_userauth_request: invalid user ladmin [preauth] Mar 29 02:12:56 CentOS7 unix_chkpwd[5310]: password check failed for user (ladmin) Mar 29 02:12:56 CentOS7 sshd[5306]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.1.6 user=ladmin Mar 29 02:12:58 CentOS7 sshd[5306]: Failed password for invalid user ladmin from 192.168.1.6 port 42674 ssh2如何在 Linux 中阻止用户组使用 SSH？通过以下内容，我们可以禁用指定的组或多个组使用 ssh。如果你想要禁用多个用户组使用 ssh，那么你需要在添加用户组时在同一行中使用空格来隔开他们。为了达到目的只需要将下面的值追加到 /etc/ssh/sshd_config 文件中去。# echo "DenyGroups 2g-admin" >> /etc/ssh/sshd_config你可以运行下列命令再次检查是否添加成功。# # cat /etc/ssh/sshd_config | grep -i denygroups DenyGroups 2g-admin # getent group 2g-admin 2g-admin:x:1005:user1,user2,user3这样就行了， 现在只需要重启 ssh 服务和见证奇迹了。# systemctl restart sshd 或 # service restart sshd是的 user1 不被允许登入系统，因为他是 2g-admin 用户组中的一员。他属于被禁用 ssh 的组中。# ssh user1@192.168.1.4 user1@192.168.1.4's password: Permission denied, please try again.输出:Mar 29 02:17:32 CentOS7 sshd[5400]: User user1 from 192.168.1.6 not allowed because a group is listed in DenyGroups Mar 29 02:17:32 CentOS7 sshd[5400]: input_userauth_request: invalid user user1 [preauth] Mar 29 02:17:38 CentOS7 unix_chkpwd[5402]: password check failed for user (user1) Mar 29 02:17:38 CentOS7 sshd[5400]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.1.6 user=user1 Mar 29 02:17:41 CentOS7 sshd[5400]: Failed password for invalid user user1 from 192.168.1.6 port 42710 ssh2除了 2g-admin 用户组之外的用户都可以使用 ssh 登入系统。 例如，ladmin 等用户就允许登入系统。# ssh ladmin@192.168.1.4 ladmin@192.168.1.4's password: [ladmin@CentOS7 ~]$输出:Mar 29 02:19:13 CentOS7 sshd[5432]: Accepted password for ladmin from 192.168.1.6 port 42716 ssh2 Mar 29 02:19:13 CentOS7 sshd[5432]: pam_unix(sshd:session): session opened for user ladmin by (uid=0)via: https://www.2daygeek.com/allow-deny-enable-disable-ssh-access-user-group-in-linux/作者：2daygeek 选题：lujun9972 译者：way-ww 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
Linux Mint 19.2 “Tina” 在 2019 年 8 月 2 日发布，它是一个基于 Ubuntu 18.04 LTS (Bionic Beaver) 的长期支持版本。它将被支持到 2023 年。它带来更新的软件和精细的改进和很多新的特色来使你的桌面使用地更舒适。Linux Mint 19.2 特色有 Cinnamon 4.2 、Linux 内核 4.15 和 Ubuntu 18.04 基础软件包。注意： 不要忘记备份你的重要数据。如果一些东西出错，在最新的安装后，你可以从备份中恢复数据。备份可以通过 rsnapshot 或 timeshift 完成。Linux Mint 19.2 “Tina” 发布日志可以在下面的链接中找到。Linux Mint 19.2 (Tina) 发布日志这里有三种方法，能让我们升级为 Linux Mint 19.2 “Tina”。使用本地方法升级 Linux Mint 19.2 (Tina)使用 Mintupgrade 实用程序方法升级 Linux Mint 19.2 (Tina)使用 GUI 升级 Linux Mint 19.2 (Tina)如何从 Linux Mint 19.1 (Tessa) 升级为 Linux Mint 19.2 (Tina)？升级 Linux Mint 系统是一项简单轻松的任务。有三种方法可以完成。方法-1：使用本地方法升级 Linux Mint 19.2 (Tina)这是执行升级 Linux Mint 系统的本地和标准的方法之一。为做到这点，遵循下面的程序步骤。确保你当前 Linux Mint 系统是最新的。使用下面的命令来更新你现在的软件为最新可用版本。步骤-1：通过运行下面的命令来刷新存储库索引。$ sudo apt update运行下面的命令来在系统上安装可用的更新。$ sudo apt upgrade运行下面的命令来在版本中执行可用的次要更新。$ sudo apt full-upgrade默认情况下，它将通过上面的命令来移除过时的软件包。但是，我建议你运行下面的命令。$ sudo apt autoremove $ sudo apt clean如果安装一个新的内核，你可能需要重启系统。如果是这样，运行下面的命令。$ sudo shutdown -r now最后检查当前安装的版本。$ lsb_release -a No LSB modules are available. Distributor ID: Linux Mint Description: Linux Mint 19.1 (Tessa) Release: 19.1 Codename: Tessa步骤-2：更新/修改 /etc/apt/sources.list 文件在重启后，修改 sources.list 文件，并从 Linux Mint 19.1 (Tessa) 指向 Linux Mint 19.2 (Tina)。首先，使用 cp 命令备份下面的配置文件。$ sudo cp /etc/apt/sources.list /root $ sudo cp -r /etc/apt/sources.list.d/ /root修改 sources.list 文件，并指向 Linux Mint 19.2 (Tina)。$ sudo sed -i 's/tessa/tina/g' /etc/apt/sources.list $ sudo sed -i 's/tessa/tina/g' /etc/apt/sources.list.d/*通过运行下面的命令来刷新存储库索引。$ sudo apt update运行下面的命令来在系统上安装可用的更新。在升级过程中，你可用需要确认服务重启和配置文件替换，因此，只需遵循屏幕上的指令。升级可能花费一些时间，具体依赖于更新的数量和你的网络速度。$ sudo apt upgrade运行下面的命令来执行一次完整的系统升级。$ sudo apt full-upgrade默认情况下，上面的命令将移除过时的软件包。但是，我建议你再次运行下面的命令。$ sudo apt autoremove $ sudo apt clean最后重启系统来启动 Linux Mint 19.2 (Tina)。$ sudo shutdown -r now升级后的 Linux Mint 版本可以通过运行下面的命令验证。$ lsb_release -a No LSB modules are available. Distributor ID: Linux Mint Description: Linux Mint 19.2 (Tina) Release: 19.2 Codename: Tina方法-2：使用 Mintupgrade 实用程序升级 Linux Mint 19.2 (Tina)这是 Mint 官方实用程序，它允许我们对 Linux Mint 系统执行平滑升级。使用下面的命令来安装 mintupgrade 软件包。$ sudo apt install mintupgrade确保你已经安装 mintupgrade 软件包的最新版本。$ apt version mintupgrade以一个普通用户来运行下面的命令以模拟一次升级，遵循屏幕上的指令。$ mintupgrade check使用下面的命令来下载需要的软件包来升级为 Linux Mint 19.2 (Tina) ，遵循屏幕上的指令。$ mintupgrade download运行下面的命令来运用升级，最新屏幕上的指令。$ mintupgrade upgrade在成功升级后，重启系统，并检查升级后的版本。$ lsb_release -a No LSB modules are available. Distributor ID: Linux Mint Description: Linux Mint 19.2 (Tina) Release: 19.2 Codename: Tina方法-3：使用 GUI 升级 Linux Mint 19.2 (Tina)或者，我们可以通过 GUI 执行升级。步骤-1：通过 Timeshift 创建一个系统快照。如果一些东西出错，你可以简单地恢复你的操作系统到它先前状态。步骤-2:打开更新管理器，单击刷新按钮来检查 mintupdate 和 mint-upgrade-info 的任何新版本。如果有这些软件包的更新，应用它们。通过单击 “编辑-> 升级到 Linux Mint 19.2 Tina”来启动系统升级。遵循屏幕上的指令。如果被询问是否保留或替换配置文件，选择替换它们。步骤-3:在升级完成后，重启你的电脑。via: https://www.2daygeek.com/upgrade-linux-mint-19-1-tessa-to-linux-mint-19-2-tina/作者：2daygeek 选题：lujun9972 译者：robsean 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
相信每个人都对 回收站 trashcan 很熟悉，因为无论是对 Linux 用户，还是 Windows 用户，或者 Mac 用户来说，它都很常见。当你删除一个文件或目录的时候，该文件或目录会被移动到回收站中。需要注意的是，当把文件移动到回收站以后，文件系统空间并没有被释放，除非把回收站清空。如果不想永久删除文件的话（清空回收站），可以利用回收站临时存储被删除了的文件，从而在必要的时候能够帮助我们恢复删除了的文件。但是，如果在命令行使用 rm 命令进行删除操作，那么你是不可能在回收站中找到任何被删除了的文件或目录的。所以，在执行 rm 命令前请一定要三思。如果你犯了错误（执行了 rm 命令），那么文件就被永久删除了，无法再恢复回来，因为存储在磁盘上的元数据已经不在了。根据 freedesktop.org 规范， 垃圾 trash 是由桌面管理器比如 GNOME、KDE 和 XFCE 等提供的一个特性。当通过文件管理器删除一个文件或目录的时候，该文件或目录将会成为 垃圾 trash ，然后被移动到回收站中，回收站对应的目录是 $HOME/.local/share/Trash 。回收站目录包含两个子目录：files 和 info 。files 目录存储实际被删除了的文件和目录，info 目录包含被删除了的文件和目录的信息，比如文件路径、删除日期和时间，每个文件单独存储。你可能会问，既然已经有了 图形用户界面 GUI 的回收站，为什么还需要命令行工具呢？因为对于大多数使用 *NIX 系统的家伙（包括我）来说，即使使用的是基于图形用户界面的系统，也更喜欢使用命令行而不是图形用户界面。所以，如果有人在寻找一个命令行回收站工具，那么这儿有一个不错的选择。Trash-Cli 是什么trash-cli 是一个命令行回收站工具，并且符合 FreeDesktop.org 的 垃圾 trash 规范。它能够存储每一个垃圾文件的名字、原始路径、删除日期和权限。如何在 Linux 上安装 Trash-Cli绝大多数的 Linux 发行版官方仓库都提供了 Trash-Cli 的安装包，所以你可以运行下面这些命令来安装。对于 Debian/Ubuntu 用户，使用 apt-get 或 apt 命令来安装 Trash-Cli：$ sudo apt install trash-cli对于 RHEL/CentOS 用户，使用 yum 命令来安装 Trash-Cli：$ sudo yum install trash-cli对于 Fedora 用户，使用 dnf 命令来安装 Trash-Cli：$ sudo dnf install trash-cli对于 Arch Linux 用户，使用 pacman 命令来安装 Trash-Cli：$ sudo pacman -S trash-cli对于 openSUSE 用户，使用 zypper 命令来安装 Trash-Cli：$ sudo zypper in trash-cli如果你的发行版中没有提供 Trash-Cli 的安装包，那么你也可以使用 pip 来安装。为了能够安装 python 包，你的系统中应该会有 pip 包管理器。$ sudo pip install trash-cli Collecting trash-cli Downloading trash-cli-0.17.1.14.tar.gz Installing collected packages: trash-cli Running setup.py bdist_wheel for trash-cli ... done Successfully installed trash-cli-0.17.1.14如何使用 Trash-CliTrash-Cli 的使用不难，因为它提供了一个很简单的语法。Trash-Cli 提供了下面这些命令：trash-put： 删除文件和目录（仅放入回收站中）trash-list ：列出被删除了的文件和目录trash-restore：从回收站中恢复文件或目录 trash.trash-rm：删除回收站中的文件trash-empty：清空回收站下面，让我们通过一些例子来试验一下。1) 删除文件和目录：在这个例子中，我们通过运行下面这个命令，将 2g.txt 这一文件和 magi 这一文件夹移动到回收站中。$ trash-put 2g.txt magi和你在文件管理器中看到的一样。2) 列出被删除了的文件和目录：为了查看被删除了的文件和目录，你需要运行下面这个命令。之后，你可以在输出中看到被删除文件和目录的详细信息，比如名字、删除日期和时间，以及文件路径。$ trash-list 2017-10-01 01:40:50 /home/magi/magi/2g.txt 2017-10-01 01:40:50 /home/magi/magi/magi3) 从回收站中恢复文件或目录：任何时候，你都可以通过运行下面这个命令来恢复文件和目录。它将会询问你来选择你想要恢复的文件或目录。在这个例子中，我打算恢复 2g.txt 文件，所以我的选择是 0 。$ trash-restore 0 2017-10-01 01:40:50 /home/magi/magi/2g.txt 1 2017-10-01 01:40:50 /home/magi/magi/magi What file to restore [0..1]: 04) 从回收站中删除文件：如果你想删除回收站中的特定文件，那么可以运行下面这个命令。在这个例子中，我将删除 magi 目录。$ trash-rm magi5)清空回收站：如果你想删除回收站中的所有文件和目录，可以运行下面这个命令。$ trash-empty6)删除超过 X 天的垃圾文件：或者，你可以通过运行下面这个命令来删除回收站中超过 X 天的文件。在这个例子中，我将删除回收站中超过 10 天的项目。$ trash-empty 10Trash-Cli 可以工作的很好，但是如果你想尝试它的一些替代品，那么你也可以试一试 gvfs-trash 和 autotrash 。via: https://www.2daygeek.com/trash-cli-command-line-trashcan-linux-system/作者：2daygeek 译者：ucasFL 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
最近 Linux 容器很火，我们中的大多数人甚至已经在使用它，同时一些人也开始学习它。我们已经介绍了有名的 GUI（用户图形界面） 工具如 Portainer 和 Rancher 。这将会有助于我们通过 GUI 管理容器。这篇指南将会通过 cTop 命令帮助我们理解和监控 Linux 容器。它是一个类似 top 命令的命令行工具。什么是 cTopctop 为多个容器提供了一个简洁凝练的实时指标概览。它是一个类 top 的针对容器指标的界面。它展示了容器指标比如 CPU 利用率、内存利用率、磁盘 I/O 读写、进程 ID（PID）和网络发送（TX - 从此服务器发送）以及接受（RX - 此服务器接受）。ctop 带有对 Docker 和 runc 的内建支持；对其他容器和集群系统的连接计划在未来版本中推出。它不需要任何参数并且默认使用 Docker 主机变量。建议阅读：Portainer – 一个简单的 Docker 图形管理界面Rancher – 一个完整的生产环境容器管理平台如何安装 cTop开发者提供了一个简单的 shell 脚本来帮助我们直接使用 ctop。我们要做的，只是在 /bin 目录下下载 ctop shell 文件来保证全局访问。最后给予 ctop 脚本文件执行权限。在 /usr/local/bin 目录下下载 ctop shell 脚本。$ sudo wget https://github.com/bcicen/ctop/releases/download/v0.7/ctop-0.7-linux-amd64 -O /usr/local/bin/ctop 对 ctop shell 脚本设置执行权限。$ sudo chmod +x /usr/local/bin/ctop 另外你可以通过 docker 来安装和运行 ctop。在此之前先确保你已经安装过 docker。为了安装 docker，参考以下链接。建议阅读：如何在 Linux 上安装 Docker如何在 Linux 上玩转 Docker 镜像如何在 Linux 上玩转 Docker 容器如何在 Docker 容器中安装，运行应用$ docker run --rm -ti \ --name=ctop \ -v /var/run/docker.sock:/var/run/docker.sock \ quay.io/vektorlab/ctop:latest 如何使用 cTop直接启动 ctop 程序而不用任何参数。默认它绑定的 a 键用来展示所有容器（运行的和没运行的）。ctop 头部显示你的系统时间和容器的总数。$ ctop 你可能得到以下类似输出。如何管理容器你可以使用 ctop 来管理容器。选择一个你想要管理的容器然后按下回车键，选择所需选项如 start、stop、remove 等。如何给容器排序默认 ctop 使用 state 字段来给容器排序。按下 s 键来按不同的方面给容器排序。如何查看容器指标如何你想要查看关于容器的更多细节和指标，只用选择你想要查看的相应容器然后按 o 键。如何查看容器日志选择你想要查看日志的相应容器然后按 l 键。仅显示活动容器使用 -a 选项运行 ctop 命令来仅显示活动容器打开帮助对话框运行 ctop，只需按 h 键来打开帮助部分。via: https://www.2daygeek.com/ctop-a-command-line-tool-for-container-monitoring-and-management-in-linux/作者：2DAYGEEK 译者：kimii 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
人类犯错误是因为我们不是一个可编程设备，所以，在使用 rm 命令时要额外注意，不要在任何时候使用 rm -rf *。当你使用 rm 命令时，它会永久删除文件，不会像文件管理器那样将这些文件移动到 “垃圾箱”。有时我们会将不应该删除的文件删除掉，所以当错误地删除了文件时该怎么办？ 你必须看看恢复工具（Linux 中有很多数据恢复工具），但我们不知道是否能将它百分之百恢复，所以要如何解决这个问题？我们最近发表了一篇关于 Trash-Cli 的文章，在评论部分，我们从用户 Eemil Lgz 那里获得了一个关于 saferm.sh 脚本的更新，它可以帮助我们将文件移动到“垃圾箱”而不是永久删除它们。将文件移动到“垃圾桶”是一个好主意，当你无意中运行 rm 命令时，可以拯救你；但是很少有人会说这是一个坏习惯，如果你不注意“垃圾桶”，它可能会在一定的时间内被文件和文件夹堆积起来。在这种情况下，我建议你按照你的意愿去做一个定时任务。这适用于服务器和桌面两种环境。 如果脚本检测到 GNOME 、KDE、Unity 或 LXDE 桌面环境（DE），则它将文件或文件夹安全地移动到默认垃圾箱 $HOME/.local/share/Trash/files，否则会在您的主目录中创建垃圾箱文件夹 $HOME/Trash。saferm.sh 脚本托管在 Github 中，可以从仓库中克隆，也可以创建一个名为 saferm.sh 的文件并复制其上的代码。$ git clone https://github.com/lagerspetz/linux-stuff $ sudo mv linux-stuff/scripts/saferm.sh /bin $ rm -Rf linux-stuff 在 .bashrc 文件中设置别名，alias rm=saferm.sh 执行下面的命令使其生效，$ source ~/.bashrc 一切就绪，现在你可以执行 rm 命令，自动将文件移动到”垃圾桶”，而不是永久删除它们。测试一下，我们将删除一个名为 magi.txt 的文件，命令行明确的提醒了 Moving magi.txt to $HOME/.local/share/Trash/file。$ rm -rf magi.txt Moving magi.txt to /home/magi/.local/share/Trash/files 也可以通过 ls 命令或 trash-cli 进行验证。$ ls -lh /home/magi/.local/share/Trash/files Permissions Size User Date Modified Name .rw-r--r-- 32 magi 11 Oct 16:24 magi.txt 或者我们可以通过文件管理器界面中查看相同的内容。![](/data/attachment/album/201803/09/174228rxpmllt2pxc9h6hh.png)（LCTT 译注：原文此处混淆了部分 trash-cli 的内容，考虑到文章衔接和逻辑，此处略。）要了解 saferm.sh 的其他选项，请查看帮助。$ saferm.sh -h This is saferm.sh 1.16. LXDE and Gnome3 detection. Will ask to unsafe-delete instead of cross-fs move. Allows unsafe (regular rm) delete (ignores trashinfo). Creates trash and trashinfo directories if they do not exist. Handles symbolic link deletion. Does not complain about different user any more. Usage: /path/to/saferm.sh [OPTIONS] [--] files and dirs to safely remove OPTIONS: -r allows recursively removing directories. -f Allow deleting special files (devices, ...). -u Unsafe mode, bypass trash and delete files permanently. -v Verbose, prints more messages. Default in this version. -q Quiet mode. Opposite of verbose. via: https://www.2daygeek.com/rm-command-to-move-files-to-trash-can-rm-alias/作者：2DAYGEEK 译者：amwps290 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
你是否厌倦了 Linux 桌面背景，想要设置好看的壁纸，但是不知道在哪里可以找到？别担心，我们在这里会帮助你。我们都知道必应搜索引擎，但是由于一些原因很少有人使用它，每个人都喜欢必应网站的背景壁纸，它是非常漂亮和惊人的高分辨率图像。如果你想使用这些图片作为你的桌面壁纸，你可以手动下载它，但是很难去每天下载一个新的图片，然后把它设置为壁纸。这就是自动壁纸改变的地方。必应桌面墙纸更换器会自动下载并将桌面壁纸更改为当天的必应照片。所有的壁纸都储存在 /home/[user]/Pictures/BingWallpapers/。方法 1: 使用 Utkarsh Gupta Shell 脚本这个小型 Python 脚本会自动下载并将桌面壁纸更改为当天的必应照片。该脚本在机器启动时自动运行，并工作于 GNU/Linux 上的 Gnome 或 Cinnamon 环境。它不需要手动工作，安装程序会为你做所有事情。从 2.0+ 版本开始，该脚本的安装程序就可以像普通的 Linux 二进制命令一样工作，它会为某些任务请求 sudo 权限。只需克隆仓库并切换到项目目录，然后运行 shell 脚本即可安装必应桌面墙纸更换器。$ curl https://github.com/UtkarshGpta/bing-desktop-wallpaper-changer/archive/master.zip $ unzip master $ cd bing-desktop-wallpaper-changer-master 运行 installer.sh 使用 --install 选项来安装必应桌面墙纸更换器。它会下载并设置必应照片为你的 Linux 桌面。$ ./installer.sh --install Bing-Desktop-Wallpaper-Changer BDWC Installer v3_beta2 GitHub: Contributors: . . [sudo] password for daygeek: ****** . Where do you want to install Bing-Desktop-Wallpaper-Changer? Entering 'opt' or leaving input blank will install in /opt/bing-desktop-wallpaper-changer Entering 'home' will install in /home/daygeek/bing-desktop-wallpaper-changer Install Bing-Desktop-Wallpaper-Changer in (opt/home)? :Press Enter Should we create bing-desktop-wallpaper-changer symlink to /usr/bin/bingwallpaper so you could easily execute it? Create symlink for easy execution, e.g. in Terminal (y/n)? : y Should bing-desktop-wallpaper-changer needs to autostart when you log in? (Add in Startup Application) Add in Startup Application (y/n)? : y . . Executing bing-desktop-wallpaper-changer... Finished!! 要卸载该脚本：$ ./installer.sh --uninstall 使用帮助页面了解更多关于此脚本的选项。$ ./installer.sh --help 方法 2: 使用 GNOME Shell 扩展这个轻量级 GNOME shell 扩展，可将你的壁纸每天更改为微软必应的壁纸。它还会显示一个包含图像标题和解释的通知。该扩展大部分基于 Elinvention 的 NASA APOD 扩展，受到了 Utkarsh Gupta 的 Bing Desktop WallpaperChanger 启发。特点获取当天的必应壁纸并设置为锁屏和桌面墙纸（这两者都是用户可选的）可强制选择某个特定区域（即地区）为多个显示器自动选择最高分辨率（和最合适的墙纸）可以选择在 1 到 7 天之后清理墙纸目录（删除最旧的）只有当它们被更新时，才会尝试下载壁纸不会持续进行更新 - 每天只进行一次，启动时也要进行一次（更新是在必应更新时进行的）如何安装访问 extenisons.gnome.org 网站并将切换按钮拖到 “ON”，然后点击 “Install” 按钮安装必应壁纸 GNOME 扩展。（LCTT 译注：页面上并没有发现 ON 按钮，但是有 Download 按钮）安装必应壁纸 GNOME 扩展后，它会自动下载并为你的 Linux 桌面设置当天的必应照片，并显示关于壁纸的通知。托盘指示器将帮助你执行少量操作，也可以打开设置。根据你的要求自定义设置。via: https://www.2daygeek.com/bing-desktop-wallpaper-changer-linux-bing-photo-of-the-day/作者：2daygeek 译者：MjSeven 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
到目前为止，我们已经介绍了大部分获取 Linux 系统硬件信息和配置的工具，不过也有许多命令可用于相同目的。而且，一些工具会显示所有硬件组件的详细信息，或只显示特定设备的信息。在这个系列中, 今天我们讨论一下关于 python-hwinfo， 它是一个展示硬件信息概况的工具之一，并且其配置简洁。什么是 python-hwinfo这是一个通过解析系统工具（例如 lspci 和 dmidecode）的输出，来检查硬件和设备的 Python 库。它提供了一个简单的命令行工具，可以用来检查本地、远程的主机和记录的信息。用 sudo 运行该命令以获得最大的信息。另外，你可以提供服务器 IP 或者主机名、用户名和密码，在远程的服务器上执行它。当然你也可以使用这个工具查看其它工具捕获的输出（例如 demidecode 输出的 dmidecode.out，/proc/cpuinfo 输出的 cpuinfo，lspci -nnm 输出的 lspci-nnm.out）。建议阅读：Inxi：一个功能强大的获取 Linux 系统信息的命令行工具Dmidecode：获取 Linux 系统硬件信息的简易方式LSHW (Hardware Lister)： 一个在 Linux 上获取硬件信息的漂亮工具hwinfo (Hardware Info)：一个在 Linux 上检测系统硬件信息的漂亮工具如何使用 lspci、lsscsi、lsusb 和 lsblk 获取 Linux 系统设备信息Linux 上如何安装 python-hwinfo在绝大多数 Linux 发行版，都可以通过 pip 包安装。为了安装 python-hwinfo， 确保你的系统已经有 Python 和python-pip 包作为先决条件。pip 是 Python 附带的一个包管理工具，在 Linux 上安装 Python 包的推荐工具之一。在 Debian/Ubuntu 平台，使用 APT-GET 命令 或者 APT 命令 安装 pip。$ sudo apt install python-pip 在 RHEL/CentOS 平台，使用 YUM 命令安装 pip。$ sudo yum install python-pip python-devel 在 Fedora 平台，使用 DNF 命令安装 pip。$ sudo dnf install python-pip 在 Arch Linux 平台，使用 Pacman 命令安装 pip。$ sudo pacman -S python-pip 在 openSUSE 平台，使用 Zypper 命令安装 pip。$ sudo zypper python-pip 最后，执行下面的 pip 命令安装 python-hwinfo。$ sudo pip install python-hwinfo 怎么在本地机器使用 python-hwinfo执行下面的命令，检查本地机器现有的硬件。输出很清楚和整洁，这是我在其他命令中没有看到的。它的输出分为了五类：Bios Info（BIOS 信息）： BIOS 供应商名称、系统产品名称、系统序列号、系统唯一标识符、系统制造商、BIOS 发布日期和BIOS 版本。CPU Info（CPU 信息）：处理器编号、供应商 ID，CPU 系列代号、型号、步进编号、型号名称、CPU 主频。Ethernet Controller Info（网卡信息）： 供应商名称、供应商 ID、设备名称、设备 ID、子供应商名称、子供应商 ID，子设备名称、子设备 ID。Storage Controller Info（存储设备信息）： 供应商名称、供应商 ID、设备名称、设备 ID、子供应商名称，子供应商 ID、子设备名称、子设备 ID。GPU Info（GPU 信息）： 供应商名称、供应商 ID、设备名称、设备 ID、子供应商名称、子供应商 ID、子设备名称、子设备 ID。$ sudo hwinfo Bios Info: +----------------------+--------------------------------------+ | Key | Value | +----------------------+--------------------------------------+ | bios_vendor_name | IBM | | system_product_name | System x3550 M3: -[6102AF1]- | | system_serial_number | RS2IY21 | | chassis_type | Rack Mount Chassis | | system_uuid | 4C4C4544-0051-3210-8052-B2C04F323132 | | system_manufacturer | IBM | | socket_count | 2 | | bios_release_date | 10/21/2014 | | bios_version | -[VLS211TSU-2.51]- | | socket_designation | Socket 1, Socket 2 | +----------------------+--------------------------------------+ CPU Info: +-----------+--------------+------------+-------+----------+------------------------------------------+----------+ | processor | vendor_id | cpu_family | model | stepping | model_name | cpu_mhz | +-----------+--------------+------------+-------+----------+------------------------------------------+----------+ | 0 | GenuineIntel | 6 | 45 | 7 | Intel(R) Xeon(R) CPU E5-1607 0 @ 3.00GHz | 1200.000 | | 1 | GenuineIntel | 6 | 45 | 7 | Intel(R) Xeon(R) CPU E5-1607 0 @ 3.00GHz | 1200.000 | | 2 | GenuineIntel | 6 | 45 | 7 | Intel(R) Xeon(R) CPU E5-1607 0 @ 3.00GHz | 1200.000 | | 3 | GenuineIntel | 6 | 45 | 7 | Intel(R) Xeon(R) CPU E5-1607 0 @ 3.00GHz | 1200.000 | | 4 | GenuineIntel | 6 | 45 | 7 | Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz | 1200.000 | +-----------+--------------+------------+-------+----------+------------------------------------------+----------+ Ethernet Controller Info: +-------------------+-----------+---------------------------------+-----------+-------------------+--------------+---------------------------------+--------------+ | vendor_name | vendor_id | device_name | device_id | subvendor_name | subvendor_id | subdevice_name | subdevice_id | +-------------------+-----------+---------------------------------+-----------+-------------------+--------------+---------------------------------+--------------+ | Intel Corporation | 8086 | I350 Gigabit Network Connection | 1521 | Intel Corporation | 8086 | I350 Gigabit Network Connection | 1521 | +-------------------+-----------+---------------------------------+-----------+-------------------+--------------+---------------------------------+--------------+ Storage Controller Info: +-------------------+-----------+----------------------------------------------+-----------+----------------+--------------+----------------+--------------+ | vendor_name | vendor_id | device_name | device_id | subvendor_name | subvendor_id | subdevice_name | subdevice_id | +-------------------+-----------+----------------------------------------------+-----------+----------------+--------------+----------------+--------------+ | Intel Corporation | 8086 | C600/X79 series chipset IDE-r Controller | 1d3c | Dell | 1028 | [Device 05d2] | 05d2 | | Intel Corporation | 8086 | C600/X79 series chipset SATA RAID Controller | 2826 | Dell | 1028 | [Device 05d2] | 05d2 | +-------------------+-----------+----------------------------------------------+-----------+----------------+--------------+----------------+--------------+ GPU Info: +--------------------+-----------+-----------------------+-----------+--------------------+--------------+----------------+--------------+ | vendor_name | vendor_id | device_name | device_id | subvendor_name | subvendor_id | subdevice_name | subdevice_id | +--------------------+-----------+-----------------------+-----------+--------------------+--------------+----------------+--------------+ | NVIDIA Corporation | 10de | GK107GL [Quadro K600] | 0ffa | NVIDIA Corporation | 10de | [Device 094b] | 094b | +--------------------+-----------+-----------------------+-----------+--------------------+--------------+----------------+--------------+ 怎么在远处机器上使用 python-hwinfo执行下面的命令检查远程机器现有的硬件，需要远程机器 IP，用户名和密码：$ hwinfo -m x.x.x.x -u root -p password 如何使用 python-hwinfo 读取记录的输出执行下面的命令，检查本地机器现有的硬件。输出很清楚和整洁，这是我在其他命令中没有看到的。$ hwinfo -f [Path to file] via: https://www.2daygeek.com/python-hwinfo-check-display-system-hardware-configuration-information-linux/作者：2DAYGEEK 译者：Torival 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
我们都对 history 命令很熟悉。它将终端上 bash 执行过的所有命令存储到 .bash_history 文件中，来帮助我们复查用户之前执行过的命令。默认情况下 history 命令直接显示用户执行的命令而不会输出运行命令时的日期和时间，即使 history 命令记录了这个时间。运行 history 命令时，它会检查一个叫做 HISTTIMEFORMAT 的环境变量，这个环境变量指明了如何格式化输出 history 命令中记录的这个时间。若该值为 null 或者根本没有设置，则它跟大多数系统默认显示的一样，不会显示日期和时间。HISTTIMEFORMAT 使用 strftime 来格式化显示时间（strftime - 将日期和时间转换为字符串）。history 命令输出日期和时间能够帮你更容易地追踪问题。%T： 替换为时间（%H:%M:%S）。%F： 等同于 %Y-%m-%d （ISO 8601:2000 标准日期格式）。下面是 history 命令默认的输出。# history 1 yum install -y mysql-server mysql-client 2 service mysqld start 3 sysdig proc.name=sshd 4 sysdig -c topprocs_net 5 sysdig proc.name=sshd 6 sysdig proc.name=sshd | more 7 sysdig fd.name=/var/log/auth.log | more 8 sysdig fd.name=/var/log/mysqld.log 9 sysdig -cl 10 sysdig -i httplog 11 sysdig -i proc_exec_time 12 sysdig -i topprocs_cpu 13 sysdig -c topprocs_cpu 14 sysdig -c tracers_2_statsd 15 sysdig -c topfiles_bytes 16 sysdig -c topprocs_cpu 17 sysdig -c topprocs_cpu "fd.name contains sshd" 18 sysdig -c topprocs_cpu "proc.name contains sshd" 19 csysdig 20 sysdig -c topprocs_cpu 21 rpm --import https://s3.amazonaws.com/download.draios.com/DRAIOS-GPG-KEY.public 22 curl -s -o /etc/yum.repos.d/draios.repo http://download.draios.com/stable/rpm/draios.repo 23 yum install -y epel-release 24 yum update 25 yum makecache 26 yum -y install kernel-devel-$(uname -r) 27 yum -y install sysdig 28 sysdig 29 yum install httpd mysql 30 service httpd start 根据需求，有三种不同的设置环境变量的方法。临时设置当前用户的环境变量永久设置当前/其他用户的环境变量永久设置所有用户的环境变量注意： 不要忘了在最后那个单引号前加上空格，否则输出会很混乱的。方法 1：运行下面命令为为当前用户临时设置 HISTTIMEFORMAT 变量。这会一直生效到下次重启。# export HISTTIMEFORMAT='%F %T ' 方法 2：将 HISTTIMEFORMAT 变量加到 .bashrc 或 .bash_profile 文件中，让它永久生效。# echo 'HISTTIMEFORMAT="%F %T "' >> ~/.bashrc 或 # echo 'HISTTIMEFORMAT="%F %T "' >> ~/.bash_profile 运行下面命令来让文件中的修改生效。# source ~/.bashrc 或 # source ~/.bash_profile 方法 3：将 HISTTIMEFORMAT 变量加入 /etc/profile 文件中，让它对所有用户永久生效。# echo 'HISTTIMEFORMAT="%F %T "' >> /etc/profile 运行下面命令来让文件中的修改生效。# source /etc/profile 输出结果为：# history 1 2017-08-16 15:30:15 yum install -y mysql-server mysql-client 2 2017-08-16 15:30:15 service mysqld start 3 2017-08-16 15:30:15 sysdig proc.name=sshd 4 2017-08-16 15:30:15 sysdig -c topprocs_net 5 2017-08-16 15:30:15 sysdig proc.name=sshd 6 2017-08-16 15:30:15 sysdig proc.name=sshd | more 7 2017-08-16 15:30:15 sysdig fd.name=/var/log/auth.log | more 8 2017-08-16 15:30:15 sysdig fd.name=/var/log/mysqld.log 9 2017-08-16 15:30:15 sysdig -cl 10 2017-08-16 15:30:15 sysdig -i httplog 11 2017-08-16 15:30:15 sysdig -i proc_exec_time 12 2017-08-16 15:30:15 sysdig -i topprocs_cpu 13 2017-08-16 15:30:15 sysdig -c topprocs_cpu 14 2017-08-16 15:30:15 sysdig -c tracers_2_statsd 15 2017-08-16 15:30:15 sysdig -c topfiles_bytes 16 2017-08-16 15:30:15 sysdig -c topprocs_cpu 17 2017-08-16 15:30:15 sysdig -c topprocs_cpu "fd.name contains sshd" 18 2017-08-16 15:30:15 sysdig -c topprocs_cpu "proc.name contains sshd" 19 2017-08-16 15:30:15 csysdig 20 2017-08-16 15:30:15 sysdig -c topprocs_cpu 21 2017-08-16 15:30:15 rpm --import https://s3.amazonaws.com/download.draios.com/DRAIOS-GPG-KEY.public 22 2017-08-16 15:30:15 curl -s -o /etc/yum.repos.d/draios.repo http://download.draios.com/stable/rpm/draios.repo 23 2017-08-16 15:30:15 yum install -y epel-release 24 2017-08-16 15:30:15 yum update 25 2017-08-16 15:30:15 yum makecache 26 2017-08-16 15:30:15 yum -y install kernel-devel-$(uname -r) 27 2017-08-16 15:30:15 yum -y install sysdig 28 2017-08-16 15:30:15 sysdig 29 2017-08-16 15:30:15 yum install httpd mysql 30 2017-08-16 15:30:15 service httpd start via: https://www.2daygeek.com/display-date-time-linux-bash-history-command/作者：2daygeek 译者：lujun9972 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
在 RHEL/CentOS 系统上使用 YUM history 命令回滚升级操作
为服务器打补丁是 Linux 系统管理员的一项重要任务，为的是让系统更加稳定，性能更加优化。厂商经常会发布一些安全/高危的补丁包，相关软件需要升级以防范潜在的安全风险。Yum （Yellowdog Update Modified） 是 CentOS 和 RedHat 系统上用的 RPM 包管理工具，yum history 命令允许系统管理员将系统回滚到上一个状态，但由于某些限制，回滚不是在所有情况下都能成功，有时 yum 命令可能什么都不做，有时可能会删掉一些其他的包。我建议你在升级之前还是要做一个完整的系统备份，而 yum history 并不能用来替代系统备份的。系统备份能让你将系统还原到任意时候的节点状态。推荐阅读：在 RHEL/CentOS 系统上使用 YUM 命令管理软件包在 Fedora 系统上使用 DNF （YUM 的一个分支）命令管理软件包如何让 history 命令显示日期和时间某些情况下，安装的应用程序在升级了补丁之后不能正常工作或者出现一些错误（可能是由于库不兼容或者软件包升级导致的），那该怎么办呢？与应用开发团队沟通，并找出导致库和软件包的问题所在，然后使用 yum history 命令进行回滚。注意：它不支持回滚 selinux，selinux-policy-*，kernel，glibc （以及依赖 glibc 的包，比如 gcc）。不建议将系统降级到更低的版本（比如 CentOS 6.9 降到 CentOS 6.8），这会导致系统处于不稳定的状态让我们先来看看系统上有哪些包可以升级，然后挑选出一些包来做实验。# yum update Loaded plugins: fastestmirror, security Setting up Update Process Loading mirror speeds from cached hostfile epel/metalink | 12 kB 00:00 * epel: mirror.csclub.uwaterloo.ca base | 3.7 kB 00:00 dockerrepo | 2.9 kB 00:00 draios | 2.9 kB 00:00 draios/primary_db | 13 kB 00:00 epel | 4.3 kB 00:00 epel/primary_db | 5.9 MB 00:00 extras | 3.4 kB 00:00 updates | 3.4 kB 00:00 updates/primary_db | 2.5 MB 00:00 Resolving Dependencies --> Running transaction check ---> Package git.x86_64 0:1.7.1-8.el6 will be updated ---> Package git.x86_64 0:1.7.1-9.el6_9 will be an update ---> Package httpd.x86_64 0:2.2.15-60.el6.centos.4 will be updated ---> Package httpd.x86_64 0:2.2.15-60.el6.centos.5 will be an update ---> Package httpd-tools.x86_64 0:2.2.15-60.el6.centos.4 will be updated ---> Package httpd-tools.x86_64 0:2.2.15-60.el6.centos.5 will be an update ---> Package perl-Git.noarch 0:1.7.1-8.el6 will be updated ---> Package perl-Git.noarch 0:1.7.1-9.el6_9 will be an update --> Finished Dependency Resolution Dependencies Resolved ================================================================================================= Package Arch Version Repository Size ================================================================================================= Updating: git x86_64 1.7.1-9.el6_9 updates 4.6 M httpd x86_64 2.2.15-60.el6.centos.5 updates 836 k httpd-tools x86_64 2.2.15-60.el6.centos.5 updates 80 k perl-Git noarch 1.7.1-9.el6_9 updates 29 k Transaction Summary ================================================================================================= Upgrade 4 Package(s) Total download size: 5.5 M Is this ok [y/N]: n 你会发现 git 包可以被升级，那我们就用它来实验吧。运行下面命令获得软件包的版本信息（当前安装的版本和可以升级的版本）。# yum list git Loaded plugins: fastestmirror, security Setting up Update Process Loading mirror speeds from cached hostfile * epel: mirror.csclub.uwaterloo.ca Installed Packages git.x86_64 1.7.1-8.el6 @base Available Packages git.x86_64 1.7.1-9.el6_9 updates 运行下面命令来将 git 从 1.7.1-8 升级到 1.7.1-9。# yum update git Loaded plugins: fastestmirror, presto Setting up Update Process Loading mirror speeds from cached hostfile * base: repos.lax.quadranet.com * epel: fedora.mirrors.pair.com * extras: mirrors.seas.harvard.edu * updates: mirror.sesp.northwestern.edu Resolving Dependencies --> Running transaction check ---> Package git.x86_64 0:1.7.1-8.el6 will be updated --> Processing Dependency: git = 1.7.1-8.el6 for package: perl-Git-1.7.1-8.el6.noarch ---> Package git.x86_64 0:1.7.1-9.el6_9 will be an update --> Running transaction check ---> Package perl-Git.noarch 0:1.7.1-8.el6 will be updated ---> Package perl-Git.noarch 0:1.7.1-9.el6_9 will be an update --> Finished Dependency Resolution Dependencies Resolved ================================================================================================= Package Arch Version Repository Size ================================================================================================= Updating: git x86_64 1.7.1-9.el6_9 updates 4.6 M Updating for dependencies: perl-Git noarch 1.7.1-9.el6_9 updates 29 k Transaction Summary ================================================================================================= Upgrade 2 Package(s) Total download size: 4.6 M Is this ok [y/N]: y Downloading Packages: Setting up and reading Presto delta metadata Processing delta metadata Package(s) data still to download: 4.6 M (1/2): git-1.7.1-9.el6_9.x86_64.rpm | 4.6 MB 00:00 (2/2): perl-Git-1.7.1-9.el6_9.noarch.rpm | 29 kB 00:00 ------------------------------------------------------------------------------------------------- Total 5.8 MB/s | 4.6 MB 00:00 Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Updating : perl-Git-1.7.1-9.el6_9.noarch 1/4 Updating : git-1.7.1-9.el6_9.x86_64 2/4 Cleanup : perl-Git-1.7.1-8.el6.noarch 3/4 Cleanup : git-1.7.1-8.el6.x86_64 4/4 Verifying : git-1.7.1-9.el6_9.x86_64 1/4 Verifying : perl-Git-1.7.1-9.el6_9.noarch 2/4 Verifying : git-1.7.1-8.el6.x86_64 3/4 Verifying : perl-Git-1.7.1-8.el6.noarch 4/4 Updated: git.x86_64 0:1.7.1-9.el6_9 Dependency Updated: perl-Git.noarch 0:1.7.1-9.el6_9 Complete! 验证升级后的 git 版本.# yum list git Installed Packages git.x86_64 1.7.1-9.el6_9 @updates 或 # rpm -q git git-1.7.1-9.el6_9.x86_64 现在我们成功升级这个软件包，可以对它进行回滚了。步骤如下。使用 YUM history 命令回滚升级操作首先，使用下面命令获取 yum 操作的 id。下面的输出很清晰地列出了所有需要的信息，例如操作 id、谁做的这个操作（用户名）、操作日期和时间、操作的动作（安装还是升级）、操作影响的包数量。# yum history 或 # yum history list all Loaded plugins: fastestmirror, presto ID | Login user | Date and time | Action(s) | Altered ------------------------------------------------------------------------------- 13 | root | 2017-08-18 13:30 | Update | 2 12 | root | 2017-08-10 07:46 | Install | 1 11 | root | 2017-07-28 17:10 | E, I, U | 28 EE 10 | root | 2017-04-21 09:16 | E, I, U | 162 EE 9 | root | 2017-02-09 17:09 | E, I, U | 20 EE 8 | root | 2017-02-02 10:45 | Install | 1 7 | root | 2016-12-15 06:48 | Update | 1 6 | root | 2016-12-15 06:43 | Install | 1 5 | root | 2016-12-02 10:28 | E, I, U | 23 EE 4 | root | 2016-10-28 05:37 | E, I, U | 13 EE 3 | root | 2016-10-18 12:53 | Install | 1 2 | root | 2016-09-30 10:28 | E, I, U | 31 EE 1 | root | 2016-07-26 11:40 | E, I, U | 160 EE 上面命令显示有两个包受到了影响，因为 git 还升级了它的依赖包 perl-Git。 运行下面命令来查看关于操作的详细信息。# yum history info 13 Loaded plugins: fastestmirror, presto Transaction ID : 13 Begin time : Fri Aug 18 13:30:52 2017 Begin rpmdb : 420:f5c5f9184f44cf317de64d3a35199e894ad71188 End time : 13:30:54 2017 (2 seconds) End rpmdb : 420:d04a95c25d4526ef87598f0dcaec66d3f99b98d4 User : root Return-Code : Success Command Line : update git Transaction performed with: Installed rpm-4.8.0-55.el6.x86_64 @base Installed yum-3.2.29-81.el6.centos.noarch @base Installed yum-plugin-fastestmirror-1.1.30-40.el6.noarch @base Installed yum-presto-0.6.2-1.el6.noarch @anaconda-CentOS-201207061011.x86_64/6.3 Packages Altered: Updated git-1.7.1-8.el6.x86_64 @base Update 1.7.1-9.el6_9.x86_64 @updates Updated perl-Git-1.7.1-8.el6.noarch @base Update 1.7.1-9.el6_9.noarch @updates history info 运行下面命令来回滚 git 包到上一个版本。# yum history undo 13 Loaded plugins: fastestmirror, presto Undoing transaction 53, from Fri Aug 18 13:30:52 2017 Updated git-1.7.1-8.el6.x86_64 @base Update 1.7.1-9.el6_9.x86_64 @updates Updated perl-Git-1.7.1-8.el6.noarch @base Update 1.7.1-9.el6_9.noarch @updates Loading mirror speeds from cached hostfile * base: repos.lax.quadranet.com * epel: fedora.mirrors.pair.com * extras: repo1.dal.innoscale.net * updates: mirror.vtti.vt.edu Resolving Dependencies --> Running transaction check ---> Package git.x86_64 0:1.7.1-8.el6 will be a downgrade ---> Package git.x86_64 0:1.7.1-9.el6_9 will be erased ---> Package perl-Git.noarch 0:1.7.1-8.el6 will be a downgrade ---> Package perl-Git.noarch 0:1.7.1-9.el6_9 will be erased --> Finished Dependency Resolution Dependencies Resolved ================================================================================================= Package Arch Version Repository Size ================================================================================================= Downgrading: git x86_64 1.7.1-8.el6 base 4.6 M perl-Git noarch 1.7.1-8.el6 base 29 k Transaction Summary ================================================================================================= Downgrade 2 Package(s) Total download size: 4.6 M Is this ok [y/N]: y Downloading Packages: Setting up and reading Presto delta metadata Processing delta metadata Package(s) data still to download: 4.6 M (1/2): git-1.7.1-8.el6.x86_64.rpm | 4.6 MB 00:00 (2/2): perl-Git-1.7.1-8.el6.noarch.rpm | 29 kB 00:00 ------------------------------------------------------------------------------------------------- Total 3.4 MB/s | 4.6 MB 00:01 Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Installing : perl-Git-1.7.1-8.el6.noarch 1/4 Installing : git-1.7.1-8.el6.x86_64 2/4 Cleanup : perl-Git-1.7.1-9.el6_9.noarch 3/4 Cleanup : git-1.7.1-9.el6_9.x86_64 4/4 Verifying : git-1.7.1-8.el6.x86_64 1/4 Verifying : perl-Git-1.7.1-8.el6.noarch 2/4 Verifying : git-1.7.1-9.el6_9.x86_64 3/4 Verifying : perl-Git-1.7.1-9.el6_9.noarch 4/4 Removed: git.x86_64 0:1.7.1-9.el6_9 perl-Git.noarch 0:1.7.1-9.el6_9 Installed: git.x86_64 0:1.7.1-8.el6 perl-Git.noarch 0:1.7.1-8.el6 Complete! 回滚后，使用下面命令来检查降级包的版本。# yum list git 或 # rpm -q git git-1.7.1-8.el6.x86_64 使用YUM downgrade 命令回滚升级此外，我们也可以使用 YUM downgrade 命令回滚升级。# yum downgrade git-1.7.1-8.el6 perl-Git-1.7.1-8.el6 Loaded plugins: search-disabled-repos, security, ulninfo Setting up Downgrade Process Resolving Dependencies --> Running transaction check ---> Package git.x86_64 0:1.7.1-8.el6 will be a downgrade ---> Package git.x86_64 0:1.7.1-9.el6_9 will be erased ---> Package perl-Git.noarch 0:1.7.1-8.el6 will be a downgrade ---> Package perl-Git.noarch 0:1.7.1-9.el6_9 will be erased --> Finished Dependency Resolution Dependencies Resolved ================================================================================================= Package Arch Version Repository Size ================================================================================================= Downgrading: git x86_64 1.7.1-8.el6 base 4.6 M perl-Git noarch 1.7.1-8.el6 base 29 k Transaction Summary ================================================================================================= Downgrade 2 Package(s) Total download size: 4.6 M Is this ok [y/N]: y Downloading Packages: (1/2): git-1.7.1-8.el6.x86_64.rpm | 4.6 MB 00:00 (2/2): perl-Git-1.7.1-8.el6.noarch.rpm | 28 kB 00:00 ------------------------------------------------------------------------------------------------- Total 3.7 MB/s | 4.6 MB 00:01 Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Installing : perl-Git-1.7.1-8.el6.noarch 1/4 Installing : git-1.7.1-8.el6.x86_64 2/4 Cleanup : perl-Git-1.7.1-9.el6_9.noarch 3/4 Cleanup : git-1.7.1-9.el6_9.x86_64 4/4 Verifying : git-1.7.1-8.el6.x86_64 1/4 Verifying : perl-Git-1.7.1-8.el6.noarch 2/4 Verifying : git-1.7.1-9.el6_9.x86_64 3/4 Verifying : perl-Git-1.7.1-9.el6_9.noarch 4/4 Removed: git.x86_64 0:1.7.1-9.el6_9 perl-Git.noarch 0:1.7.1-9.el6_9 Installed: git.x86_64 0:1.7.1-8.el6 perl-Git.noarch 0:1.7.1-8.el6 Complete! 注意： 你也需要降级依赖包，否则它会删掉当前版本的依赖包而不是对依赖包做降级，因为 downgrade 命令无法处理依赖关系。至于 Fedora 用户命令是一样的，只需要将包管理器名称从 yum 改成 dnf 就行了。# dnf list git # dnf history # dnf history info # dnf history undo # dnf list git # dnf downgrade git-1.7.1-8.el6 perl-Git-1.7.1-8.el6 via: https://www.2daygeek.com/rollback-fallback-updates-downgrade-packages-centos-rhel-fedora/作者：2daygeek 译者：lujun9972 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
LKU：一套在 Ubuntu/LinuxMint 上编译、安装和更新最新内核的 Shell 脚本
以手动方式安装和升级最新的 Linux 内核对于每个人来说都不是一件小事，甚至包括一些有经验的人也是如此。它需要对 Linux 内核有深入的了解。过去我们已经介绍了 UKUU（Ubuntu Kernel Upgrade Utility），它可以从 kernel.ubuntu.com 网站上自动检测最新的主线内核，并弹出一个不错的窗口界面进行安装。Linux Kernel Utilities （LKU）提供一组 shell 脚本（三个 Shell 脚本），可以帮助用户从 kernel.org 获取并编译和安装最新的 Linux 内核，也可以从 kernel.ubuntu.com 获取安装最新的预编译的 Ubuntu 内核。甚至可以根据需要选择所需的内核（手动内核选择）。该脚本还将根据 PGP 签名文件检查下载的归档文件，并且可以选择通用和低延迟版内核。建议阅读：ukuu：一种在基于 Ubuntu 的系统上轻松安装升级 Linux 内核的方式它可以删除或清除所有非活动的内核，并且不会为了安全目的留下备份的内核。强烈建议在执行此脚本之前重新启动一次。compile_linux_kernel.sh ：用户可以从 kernel.org 编译和安装所需的或最新的内核update_ubuntu_kernel.sh ：用户可以从 kernel.ubuntu.com 安装并更新所需或最新的预编译 Ubuntu 内核remove_old_kernels.sh ：这将删除或清除所有非活动内核，并且只保留当前加载的版本kernel.org 有固定的发布周期（每三个月一次），发布的内核包括了新的功能，改进了硬件和系统性能。由于它具有标准的发布周期，除了滚动发布的版本（如 Arch Linux，openSUSE Tumbleweed 等），大多数发行版都不提供最新的内核。如何安装 Linux Kernel Utilities (LKU)正如我们在文章的开头所说的，它的 shell 脚本集只是克隆开发人员的 github 仓库并运行相应的 shell 文件来执行这个过程。$ git clone https://github.com/mtompkins/linux-kernel-utilities.git && cd linux-kernel-utilities 安装指定版本内核为了测试的目的，我们将安装 Linux v4.4.10-xenial 内核。在安装新内核之前，我们需要通过 uanme -a 命令检查当前安装的内核版本，以便我们可以检查新内核是否可以安装。$ uname -a Linux magi-VirtualBox 4.4.0-21-generic #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux 根据上面的输出，我们的系统使用的是 4.4.0-21 通用内核。只需运行 update_ubuntu_kernel.sh shell 脚本。第一次运行脚本时会检查是否满足所有的依赖关系，然后自动安装缺少的依赖项。它会检测系统使用的发行版，并检索 kernel.ubuntu.com 中可用的预编译内核。现在，从列表中选择你需要的内核并输入序号，然后按回车键，它将下载内核映像（linux-headers-4.4.10，linux-headers-4.4.10-xxx-generic 和 linux-image-4.4.10-xxx-generic）。一旦内核镜像被下载，它将要求输入 sudo 密码来启动新内核的安装。$ ./update_ubuntu_kernel.sh [+] Checking Distro \_ Distro identified as LinuxMint. [+] Checking Dependencies curl Found dkms Found git Found sudo Found wget Found whiptail Found lynx Not Found -- Installing Dependencies -- [!] The first time this script is run missing dependencies will be installed. For compiling a kernel this may take a bit of time. Feedback will be provided. [+] Dependencies \_Elevating permissions as necessary . . . [%] Elevated [+] Testing for previous held packages and trying to correct any found. \_Passed [+] Updating package cache . . . \_Complete [+] Installing dependencies . . . \_Complete curl Found dkms Found git Found sudo Found wget Found whiptail Found lynx Found [+] Changing to temporary directory to work in . . . \_ Temporary directory access granted: /tmp/tmp.97eHDsmg2K [+] Removing any conflicting remnants . . . \_ Done [+] Retrieving available kernel choices . . . \_ Precompiled kernels available from kernel.ubuntu.com: 1) Linux v4.11 2) Linux v4.11.3 3) Linux v4.11.2 4) Linux v4.11.1 5) Linux v4.10 6) Linux v4.10.17 7) Linux v4.10.16 8) Linux v4.10.15 9) Linux v4.10.14 10) Linux v4.10.13 11) Linux v4.10.12 [ 节略 ……] 249) Linux v4.0.3-wily 250) Linux v4.0.2-wily 251) Linux v4.0.1-wily 252) Linux v4.0-vivid Select your desired kernel: 158 Do you want the lowlatency kernel? (y/[n]): [+] Processing selection \_ Determining CPU type: amd64 \_ Locating source of v4.4.10-xenial generic kernel packages. \_ Done [+] Checking AntiVirus flag and disabling if necessary [+] Installing kernel . . . [sudo] password for magi: Selecting previously unselected package linux-headers-4.4.10-040410. (Reading database ... 230647 files and directories currently installed.) Preparing to unpack linux-headers-4.4.10-040410_4.4.10-040410.201605110631_all.deb ... Unpacking linux-headers-4.4.10-040410 (4.4.10-040410.201605110631) ... Selecting previously unselected package linux-headers-4.4.10-040410-generic. Preparing to unpack linux-headers-4.4.10-040410-generic_4.4.10-040410.201605110631_amd64.deb ... Unpacking linux-headers-4.4.10-040410-generic (4.4.10-040410.201605110631) ... Selecting previously unselected package linux-image-4.4.10-040410-generic. Preparing to unpack linux-image-4.4.10-040410-generic_4.4.10-040410.201605110631_amd64.deb ... Done. Unpacking linux-image-4.4.10-040410-generic (4.4.10-040410.201605110631) ... Setting up linux-headers-4.4.10-040410 (4.4.10-040410.201605110631) ... Setting up linux-headers-4.4.10-040410-generic (4.4.10-040410.201605110631) ... Examining /etc/kernel/header_postinst.d. run-parts: executing /etc/kernel/header_postinst.d/dkms 4.4.10-040410-generic /boot/vmlinuz-4.4.10-040410-generic Setting up linux-image-4.4.10-040410-generic (4.4.10-040410.201605110631) ... Running depmod. update-initramfs: deferring update (hook will be called later) Examining /etc/kernel/postinst.d. run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 4.4.10-040410-generic /boot/vmlinuz-4.4.10-040410-generic run-parts: executing /etc/kernel/postinst.d/dkms 4.4.10-040410-generic /boot/vmlinuz-4.4.10-040410-generic run-parts: executing /etc/kernel/postinst.d/initramfs-tools 4.4.10-040410-generic /boot/vmlinuz-4.4.10-040410-generic update-initramfs: Generating /boot/initrd.img-4.4.10-040410-generic Warning: No support for locale: en_IN run-parts: executing /etc/kernel/postinst.d/pm-utils 4.4.10-040410-generic /boot/vmlinuz-4.4.10-040410-generic run-parts: executing /etc/kernel/postinst.d/unattended-upgrades 4.4.10-040410-generic /boot/vmlinuz-4.4.10-040410-generic run-parts: executing /etc/kernel/postinst.d/zz-update-grub 4.4.10-040410-generic /boot/vmlinuz-4.4.10-040410-generic Generating grub configuration file ... Warning: Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is no longer supported. Found linux image: /boot/vmlinuz-4.4.10-040410-generic Found initrd image: /boot/initrd.img-4.4.10-040410-generic Found linux image: /boot/vmlinuz-4.4.9-040409-lowlatency Found initrd image: /boot/initrd.img-4.4.9-040409-lowlatency Found linux image: /boot/vmlinuz-4.4.0-21-generic Found initrd image: /boot/initrd.img-4.4.0-21-generic Found memtest86+ image: /boot/memtest86+.elf Found memtest86+ image: /boot/memtest86+.bin done \_ Done 安装后需要重新启动以使用新安装的内核。$ sudo reboot now 现在，你正在使用的就是新安装的 4.4.10-040410-generic 版本内核。$ uname -a Linux magi-VirtualBox 4.4.10-040410-generic #201605110631 SMP Wed May 11 10:33:23 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux 安装最新版本内核过程与上述相同，它将自动安装最新版本的内核。$ ./update_ubuntu_kernel.sh --latest [+] Checking Distro \_ Distro identified as LinuxMint. [+] Checking Dependencies curl Found dkms Found git Found sudo Found wget Found whiptail Found lynx Found [+] Changing to temporary directory to work in . . . \_ Temporary directory access granted: /tmp/tmp.pLPYmCze6S [+] Removing any conflicting remnants . . . \_ Done [+] Retrieving available kernel choices . . . \_ Precompiled kernels available from kernel.ubuntu.com: . . . . Warning: Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is no longer supported. Found linux image: /boot/vmlinuz-4.11.3-041103-generic Found initrd image: /boot/initrd.img-4.11.3-041103-generic Found linux image: /boot/vmlinuz-4.4.10-040410-generic Found initrd image: /boot/initrd.img-4.4.10-040410-generic Found linux image: /boot/vmlinuz-4.4.9-040409-lowlatency Found initrd image: /boot/initrd.img-4.4.9-040409-lowlatency Found linux image: /boot/vmlinuz-4.4.0-21-generic Found initrd image: /boot/initrd.img-4.4.0-21-generic Found memtest86+ image: /boot/memtest86+.elf Found memtest86+ image: /boot/memtest86+.bin done \_ Done 安装后需要重新启动以使用新安装的内核。$ sudo reboot now 现在，你正在使用的就是最新版本 4.11.3-041103-generic 的内核。$ uname -a Linux magi-VirtualBox 4.11.3-041103-generic #201705251233 SMP Thu May 25 16:34:52 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux 删除或清除旧内核只需要运行 remove_old_kernels.sh shell 脚本即可删除或清除所有非活动状态的内核。$ ./remove_old_kernels.sh ++++++++++++++++++++++++++++++++ +++ W A R N I N G +++ ++++++++++++++++++++++++++++++++ A reboot is recommended before running this script to ensure the current kernel tagged as the boot kernel is indeed registered and old kernels properly marked for removal. If you have just installed or modified your existing kernel and do not reboot before running this script it may render you system INOPERABLE and that would indeed suck. You have been warned. ~the Mgmt [?]Continue to automagically remove ALL old kernels? (y/N)y \_ Removing ALL old kernels . . . [sudo] password for magi: Reading package lists... Done Building dependency tree Reading state information... Done The following packages will be REMOVED: linux-headers-4.4.0-21* linux-headers-4.4.0-21-generic* linux-headers-4.4.10-040410* linux-headers-4.4.10-040410-generic* linux-headers-4.4.9-040409* linux-headers-4.4.9-040409-lowlatency* linux-image-4.4.0-21-generic* linux-image-4.4.10-040410-generic* linux-image-4.4.9-040409-lowlatency* linux-image-extra-4.4.0-21-generic* linux-kernel-generic* 0 upgraded, 0 newly installed, 11 to remove and 547 not upgraded. After this operation, 864 MB disk space will be freed. (Reading database ... 296860 files and directories currently installed.) Removing linux-kernel-generic (4.4.0-21) ... Removing linux-headers-4.4.0-21-generic (4.4.0-21.37) ... Removing linux-headers-4.4.0-21 (4.4.0-21.37) ... Removing linux-headers-4.4.10-040410-generic (4.4.10-040410.201605110631) ... Removing linux-headers-4.4.10-040410 (4.4.10-040410.201605110631) ... Removing linux-headers-4.4.9-040409-lowlatency (4.4.9-040409.201605041832) ... Removing linux-headers-4.4.9-040409 (4.4.9-040409.201605041832) ... Removing linux-image-extra-4.4.0-21-generic (4.4.0-21.37) ... . . . done Purging configuration files for linux-image-4.4.9-040409-lowlatency (4.4.9-040409.201605041832) ... Examining /etc/kernel/postrm.d . run-parts: executing /etc/kernel/postrm.d/initramfs-tools 4.4.9-040409-lowlatency /boot/vmlinuz-4.4.9-040409-lowlatency run-parts: executing /etc/kernel/postrm.d/zz-update-grub 4.4.9-040409-lowlatency /boot/vmlinuz-4.4.9-040409-lowlatency via: http://www.2daygeek.com/lku-linux-kernel-utilities-compile-install-update-latest-kernel-in-linux-mint-ubuntu/作者：2DAYGEEK 译者：firmianay 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出