Sandra Henry-Stocker 发布的文章

这些最有用的命令可以让你了解安装在你的 Debian 类的 Linux 系统上的包的情况。

你有没有想过你的 Linux 系统上安装了几千个软件包? 是的,我说的是“千”。 即使是相当一般的 Linux 系统也可能安装了上千个软件包。 有很多方法可以获得这些包到底是什么包的详细信息。

首先,要在基于 Debian 的发行版(如 Ubuntu)上快速得到已安装的软件包数量,请使用 apt list --installed, 如下:

$ apt list --installed | wc -l
2067

这个数字实际上多了一个,因为输出中包含了 “Listing …” 作为它的第一行。 这个命令会更准确:

$ apt list --installed | grep -v "^Listing" | wc -l
2066

要获得所有这些包的详细信息,请按以下方式浏览列表:

$ apt list --installed | more
Listing...
a11y-profile-manager-indicator/xenial,now 0.1.10-0ubuntu3 amd64 [installed]
account-plugin-aim/xenial,now 3.12.11-0ubuntu3 amd64 [installed]
account-plugin-facebook/xenial,xenial,now 0.12+16.04.20160126-0ubuntu1 all [installed]
account-plugin-flickr/xenial,xenial,now 0.12+16.04.20160126-0ubuntu1 all [installed]
account-plugin-google/xenial,xenial,now 0.12+16.04.20160126-0ubuntu1 all [installed]
account-plugin-jabber/xenial,now 3.12.11-0ubuntu3 amd64 [installed]
account-plugin-salut/xenial,now 3.12.11-0ubuntu3 amd64 [installed]

这需要观察很多细节 —— 特别是让你的眼睛在所有 2000 多个文件中徘徊。 它包含包名称、版本等,以及更多但并不是以最易于我们人类解析的显示信息。 dpkg-query 使得描述更容易理解,但这些描述会塞满你的命令窗口,除非窗口非常宽。 因此,为了让此篇文章更容易阅读,下面的数据显示已经分成了左右两侧。

左侧:

$ dpkg-query -l | more
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                                                 Version                                      
+++-==============================================-=================================-
ii  a11y-profile-manager-indicator                 0.1.10-0ubuntu3                              
ii  account-plugin-aim                             3.12.11-0ubuntu3                             
ii  account-plugin-facebook                        0.12+16.04.20160126-0ubuntu1                 
ii  account-plugin-flickr                          0.12+16.04.20160126-0ubuntu1                 
ii  account-plugin-google                          0.12+16.04.20160126-0ubuntu1                 
ii  account-plugin-jabber                          3.12.11-0ubuntu3                             
ii  account-plugin-salut                           3.12.11-0ubuntu3                             
ii  account-plugin-twitter                         0.12+16.04.20160126-0ubuntu1                 
rc  account-plugin-windows-live                    0.11+14.04.20140409.1-0ubuntu2               

右侧:

Architecture Description
============-=====================================================================
amd64        Accessibility Profile Manager - Unity desktop indicator
amd64        Messaging account plugin for AIM
all          GNOME Control Center account plugin for single signon - facebook
all          GNOME Control Center account plugin for single signon - flickr
all          GNOME Control Center account plugin for single signon
amd64        Messaging account plugin for Jabber/XMPP
amd64        Messaging account plugin for Local XMPP (Salut)
all          GNOME Control Center account plugin for single signon - twitter
all          GNOME Control Center account plugin for single signon - windows live

每行开头的 iirc 名称(见上文“左侧”)是包状态指示符。 第一个字母表示包的预期状态:

  • u – 未知
  • i – 安装
  • r – 移除/反安装
  • p – 清除(也包括配置文件)
  • h – 保留

第二个代表包的当前状态:

  • n – 未安装
  • i – 已安装
  • c – 配置文件(只安装了配置文件)
  • U – 未打包
  • F – 半配置(出于某些原因配置失败)
  • h – 半安装(出于某些原因配置失败)
  • W – 等待触发(该包等待另外一个包的触发器)
  • t – 待定触发(该包被触发)

在通常的双字符字段末尾添加的 R 表示需要重新安装。 你可能永远不会碰到这些。

快速查看整体包状态的一种简单方法是计算在不同状态中包含的包的数量:

$ dpkg-query -l | tail -n +6 | awk '{print $1}' | sort | uniq -c
 2066 ii
 134 rc

我从上面的 dpkg-query 输出中排除了前五行,因为这些是标题行,会混淆输出。

这两行基本上告诉我们,在这个系统上,应该安装了 2066 个软件包,而 134 个其他的软件包已被删除,但留下了配置文件。 你始终可以使用以下命令删除程序包的剩余配置文件:

$ sudo dpkg --purge xfont-mathml

请注意,如果程序包二进制文件和配置文件都已经安装了,则上面的命令将两者都删除。


via: https://www.networkworld.com/article/3242808/linux/peeking-into-your-linux-packages.html

作者:Sandra Henry-Stocker 译者:Flowsnow 校对:wxy

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

在 Linux 系统上安装 Rust 编程语言可能是你近年来所做的最有价值的事情之一。

Rust 是一种相当年轻和现代的编程语言,具有许多使其非常灵活而及其安全的功能。数据显示它正在变得非常受欢迎,连续三年(201620172018)在 Stack Overflow 开发者调查中获得“最受喜爱的编程语言”的第一名。

Rust 也是开源语言的一种,它具有一系列特殊的功能,使得它可以适应许多不同的编程项目。 它最初源于 2006 年 Mozilla 员工的个人项目,几年后(2009 年)被 Mozilla 选为特别项目,然后在 2010 年宣布供公众使用。

Rust 程序运行速度极快,可防止段错误,并能保证线程安全。这些属性使该语言极大地吸引了专注于应用程序安全性的开发人员。Rust 也是一种非常易读的语言,可用于从简单程序到非常大而复杂的项目。

Rust 优点:

  • 内存安全 —— Rust 不会受到悬空指针、缓冲区溢出或其他与内存相关的错误的影响。它提供内存安全,无回收垃圾。
  • 通用 —— Rust 是适用于任何类型编程的语言
  • 快速 —— Rust 在性能上与 C / C++ 相当,但具有更好的安全功能。
  • 高效 —— Rust 是为了便于并发编程而构建的。
  • 面向项目 —— Rust 具有内置的依赖关系和构建管理系统 Cargo。
  • 得到很好的支持 —— Rust 有一个令人印象深刻的支持社区

Rust 还强制执行 RAII( 资源获取初始化 Resource Acquisition Is Initialization )。这意味着当一个对象超出范围时,将调用其析构函数并释放其资源,从而提供防止资源泄漏的屏蔽。它提供了功能抽象和一个很棒的类型系统,并具有速度和数学健全性。

简而言之,Rust 是一种令人印象深刻的系统编程语言,具有其它大多数语言所缺乏的功能,使其成为 C、C++ 和 Objective-C 等多年来一直被使用的语言的有力竞争者。

安装 Rust

安装 Rust 是一个相当简单的过程。

$ curl https://sh.rustup.rs -sSf | sh

安装 Rust 后,使用 rustc --versionwhich 命令显示版本信息。

$ which rustc
rustc 1.27.2 (58cc626de 2018-07-18)
$ rustc --version
rustc 1.27.2 (58cc626de 2018-07-18)

Rust 入门

Rust 即使是最简单的代码也与你之前使用过的语言输入的完全不同。

$ cat hello.rs
fn main() {
    // Print a greeting
    println!("Hello, world!");
}

在这些行中,我们正在设置一个函数(main),添加一个描述该函数的注释,并使用 println 语句来创建输出。您可以使用下面显示的命令编译然后运行程序。

$ rustc hello.rs
$ ./hello
Hello, world!

另外,你也可以创建一个“项目”(通常仅用于比这个更复杂的程序!)来保持代码的有序性。

$ mkdir ~/projects
$ cd ~/projects
$ mkdir hello_world
$ cd hello_world

请注意,即使是简单的程序,一旦编译,就会变成相当大的可执行文件。

$ ./hello
Hello, world!
$ ls -l hello*
-rwxrwxr-x 1 shs shs 5486784 Sep 23 19:02 hello     <== executable
-rw-rw-r-- 1 shs shs 68 Sep 23 15:25 hello.rs

当然,这只是一个开始且传统的“Hello, world!” 程序。 Rust 语言具有一系列可帮助你快速进入高级编程技能的功能。

学习 Rust

No Starch Press

Steve Klabnik 和 Carol Nichols 的《Rust 编程语言》 (2018)一书提供了学习 Rust 的最佳方法之一。 这本书由核心开发团队的两名成员撰写,可从 No Starch Press 出版社获得纸制书或者从 rust-lang.org 获得电子书。它已经成为 Rust 开发者社区中的参考书。

在所涉及的众多主题中,你将了解这些高级主题:

  • 所有权和 borrowing
  • 安全保障
  • 测试和错误处理
  • 智能指针和多线程
  • 高级模式匹配
  • 使用 Cargo(内置包管理器)
  • 使用 Rust 的高级编译器

目录

  • 前言(Nicholas Matsakis 和 Aaron Turon 编写)
  • 致谢
  • 介绍
  • 第 1 章:新手入门
  • 第 2 章:猜谜游戏
  • 第 3 章:通用编程概念
  • 第 4 章:了解所有权
  • 第 5 章:结构
  • 第 6 章:枚举和模式匹配
  • 第 7 章:模块
  • 第 8 章:常见集合
  • 第 9 章:错误处理
  • 第 10 章:通用类型、特征和生命周期
  • 第 11 章:测试
  • 第 12 章:输入/输出项目
  • 第 13 章:迭代器和闭包
  • 第 14 章:关于货物和 Crates.io 的更多信息
  • 第 15 章:智能指针
  • 第 16 章:并发
  • 第 17 章:Rust 是面向对象的吗?
  • 第 18 章:模式
  • 第 19 章:关于生命周期的更多信息
  • 第 20 章:高级类型系统功能
  • 附录 A:关键字
  • 附录 B:运算符和符号
  • 附录 C:可衍生的特征
  • 附录 D:宏
  • 索引

Rust 编程语言》 将你从基本安装和语言语法带到复杂的主题,例如模块、错误处理、crates(与其他语言中的 “library” 或“package”同义),模块(允许你将你的代码分配到 crate 本身),生命周期等。

可能最重要的是,本书可以让您从基本的编程技巧转向构建和编译复杂、安全且非常有用的程序。

结束

如果你已经准备好用一种非常值得花时间和精力学习并且越来越受欢迎的语言进行一些严肃的编程,那么 Rust 是一个不错的选择!

加入 FacebookLinkedIn 上的 Network World 社区,评论最重要的话题。


via: https://www.networkworld.com/article/3308162/linux/why-you-should-try-rust.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:way-ww 校对:wxy

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

也许你的 Linux 用户并不是愤怒的公牛,但是当涉及管理他们的账户的时候,能让他们一直满意也是一种挑战。你需要监控他们的访问权限,跟进他们遇到问题时的解决方案,并且把他们在使用系统时出现的重要变动记录下来。这里有一些方法和工具可以让这个工作轻松一点。

配置账户

添加和删除账户是管理用户中比较简单的一项,但是这里面仍然有很多需要考虑的方面。无论你是用桌面工具或是命令行选项,这都是一个非常自动化的过程。你可以使用 adduser jdoe 命令添加一个新用户,同时会触发一系列的反应。在创建 John 这个账户时会自动使用下一个可用的 UID,并有很多自动生成的文件来完成这个工作。当你运行 adduser 后跟一个参数时(要创建的用户名),它会提示一些额外的信息,同时解释这是在干什么。

$ sudo adduser jdoe
Adding user 'jdoe' ...
Adding new group `jdoe' (1001) ...
Adding new user `jdoe' (1001) with group `jdoe' ...
Creating home directory `/home/jdoe' ...
Copying files from `/etc/skel' …
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for jdoe
Enter the new value, or press ENTER for the default
    Full Name []: John Doe
    Room Number []:
    Work Phone []:
    Home Phone []:
    Other []:
Is the information correct? [Y/n] Y

如你所见,adduser 会添加用户的信息(到 /etc/passwd/etc/shadow 文件中),创建新的 家目录 home directory ,并用 /etc/skel 里设置的文件填充家目录,提示你分配初始密码和认证信息,然后确认这些信息都是正确的,如果你在最后的提示 “Is the information correct?” 处的回答是 “n”,它会回溯你之前所有的回答,允许修改任何你想要修改的地方。

创建好一个用户后,你可能会想要确认一下它是否是你期望的样子,更好的方法是确保在添加第一个帐户之前,“自动”选择与你想要查看的内容是否匹配。默认有默认的好处,它对于你想知道他们定义在哪里很有用,以便你想做出一些变动 —— 例如,你不想让用户的家目录在 /home 里,你不想让用户 UID 从 1000 开始,或是你不想让家目录下的文件被系统中的每个人都可读。

adduser 的一些配置细节设置在 /etc/adduser.conf 文件里。这个文件包含的一些配置项决定了一个新的账户如何配置,以及它之后的样子。注意,注释和空白行将会在输出中被忽略,因此我们更关注配置项。

$ cat /etc/adduser.conf | grep -v "^#" | grep -v "^$"
DSHELL=/bin/bash
DHOME=/home
GROUPHOMES=no
LETTERHOMES=no
SKEL=/etc/skel
FIRST_SYSTEM_UID=100
LAST_SYSTEM_UID=999
FIRST_SYSTEM_GID=100
LAST_SYSTEM_GID=999
FIRST_UID=1000
LAST_UID=29999
FIRST_GID=1000
LAST_GID=29999
USERGROUPS=yes
USERS_GID=100
DIR_MODE=0755
SETGID_HOME=no
QUOTAUSER=""
SKEL_IGNORE_REGEX="dpkg-(old|new|dist|save)"

可以看到,我们有了一个默认的 shell(DSHELL),UID(FIRST_UID)的起始值,家目录(DHOME)的位置,以及启动文件(SKEL)的来源位置。这个文件也会指定分配给家目录(DIR_HOME)的权限。

其中 DIR_HOME 是最重要的设置,它决定了每个家目录被使用的权限。这个设置分配给用户创建的目录权限是 755,家目录的权限将会设置为 rwxr-xr-x。用户可以读其他用户的文件,但是不能修改和移除它们。如果你想要更多的限制,你可以更改这个设置为 750(用户组外的任何人都不可访问)甚至是 700(除用户自己外的人都不可访问)。

任何用户账号在创建之前都可以进行手动修改。例如,你可以编辑 /etc/passwd 或者修改家目录的权限,开始在新服务器上添加用户之前配置 /etc/adduser.conf 可以确保一定的一致性,从长远来看可以节省时间和避免一些麻烦。

/etc/adduser.conf 的修改将会在之后创建的用户上生效。如果你想以不同的方式设置某个特定账户,除了用户名之外,你还可以选择使用 adduser 命令提供账户配置选项。或许你想为某些账户分配不同的 shell,分配特殊的 UID,或完全禁用该账户登录。adduser 的帮助页将会为你显示一些配置个人账户的选择。

adduser [options] [--home DIR] [--shell SHELL] [--no-create-home]
[--uid ID] [--firstuid ID] [--lastuid ID] [--ingroup GROUP | --gid ID]
[--disabled-password] [--disabled-login] [--gecos GECOS]
[--add_extra_groups] [--encrypt-home] user

每个 Linux 系统现在都会默认把每个用户放入对应的组中。作为一个管理员,你可能会选择以不同的方式。你也许会发现把用户放在一个共享组中更适合你的站点,你就可以选择使用 adduser--gid 选项指定一个特定的组。当然,用户总是许多组的成员,因此也有一些选项来管理主要和次要的组。

处理用户密码

一直以来,知道其他人的密码都不是一件好事,在设置账户时,管理员通常使用一个临时密码,然后在用户第一次登录时运行一条命令强制他修改密码。这里是一个例子:

$ sudo chage -d 0 jdoe

当用户第一次登录时,会看到类似下面的提示:

WARNING: Your password has expired.
You must change your password now and login again!
Changing password for jdoe.
(current) UNIX password:

添加用户到副组

添加用户到副组中,你可能会用如下所示的 usermod 命令添加用户到组中并确认已经做出变动。

$ sudo usermod -a -G sudo jdoe
$ sudo grep sudo /etc/group
sudo:x:27:shs,jdoe

记住在一些组意味着特别的权限,如 sudo 或者 wheel 组,一定要特别注意这一点。

移除用户,添加组等

Linux 系统也提供了移除账户,添加新的组,移除组等一些命令。例如,deluser 命令,将会从 /etc/passwd/etc/shadow 中移除用户记录,但是会完整保留其家目录,除非你添加了 --remove-home 或者 --remove-all-files 选项。addgroup 命令会添加一个组,默认按目前组的次序分配下一个 id(在用户组范围内),除非你使用 --gid 选项指定 id。

$ sudo addgroup testgroup --gid=131
Adding group `testgroup' (GID 131) ...
Done.

管理特权账户

一些 Linux 系统中有一个 wheel 组,它给组中成员赋予了像 root 一样运行命令的权限。在这种情况下,/etc/sudoers 将会引用该组。在 Debian 系统中,这个组被叫做 sudo,但是原理是相同的,你在 /etc/sudoers 中可以看到像这样的信息:

%sudo   ALL=(ALL:ALL) ALL

这行基本的配置意味着任何在 wheel 或者 sudo 组中的成员只要在他们运行的命令之前添加 sudo,就可以以 root 的权限去运行命令。

你可以向 sudoers 文件中添加更多有限的权限 —— 也许给特定用户几个能以 root 运行的命令。如果你是这样做的,你应该定期查看 /etc/sudoers 文件以评估用户拥有的权限,以及仍然需要提供的权限。

在下面显示的命令中,我们过滤了 /etc/sudoers 中有效的配置行。其中最有意思的是,它包含了能使用 sudo 运行命令的路径设置,以及两个允许通过 sudo 运行命令的组。像刚才提到的那样,单个用户可以通过包含在 sudoers 文件中来获得权限,但是更有实际意义的方法是通过组成员来定义各自的权限。

# cat /etc/sudoers | grep -v "^#" | grep -v "^$"
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
root    ALL=(ALL:ALL) ALL
%admin  ALL=(ALL) ALL       <== admin group
%sudo   ALL=(ALL:ALL) ALL   <== sudo group

登录检查

你可以通过以下命令查看用户的上一次登录:

# last jdoe
jdoe pts/18 192.168.0.11 Thu Sep 14 08:44 - 11:48 (00:04)
jdoe pts/18 192.168.0.11 Thu Sep 14 13:43 - 18:44 (00:00)
jdoe pts/18 192.168.0.11 Thu Sep 14 19:42 - 19:43 (00:00)

如果你想查看每一个用户上一次的登录情况,你可以通过一个像这样的循环来运行 last 命令:

$ for user in `ls /home`; do last $user | head -1; done

jdoe pts/18 192.168.0.11 Thu Sep 14 19:42 - 19:43 (00:03)

rocket pts/18 192.168.0.11 Thu Sep 14 13:02 - 13:02 (00:00)
shs pts/17 192.168.0.11 Thu Sep 14 12:45 still logged in

此命令仅显示自当前 wtmp 文件登录过的用户。空白行表示用户自那以后从未登录过,但没有将他们显示出来。一个更好的命令可以明确地显示这期间从未登录过的用户:

$ for user in `ls /home`; do echo -n "$user"; last $user | head -1 | awk '{print substr($0,40)}'; done
dhayes
jdoe pts/18 192.168.0.11 Thu Sep 14 19:42 - 19:43
peanut pts/19 192.168.0.29 Mon Sep 11 09:15 - 17:11
rocket pts/18 192.168.0.11 Thu Sep 14 13:02 - 13:02
shs pts/17 192.168.0.11 Thu Sep 14 12:45 still logged
tsmith

这个命令要打很多字,但是可以通过一个脚本使它更加清晰易用。

#!/bin/bash

for user in `ls /home`
do
    echo -n "$user ";last $user | head -1 | awk '{print substr($0,40)}'
done

有时这些信息可以提醒你用户角色的变动,表明他们可能不再需要相关帐户了。

与用户沟通

Linux 提供了许多和用户沟通的方法。你可以向 /etc/motd 文件中添加信息,当用户从终端登录到服务器时,将会显示这些信息。你也可以通过例如 write(通知单个用户)或者 wall(write 给所有已登录的用户)命令发送通知。

$ wall System will go down in one hour

Broadcast message from shs@stinkbug (pts/17) (Thu Sep 14 14:04:16 2017):

System will go down in one hour

重要的通知应该通过多个渠道传达,因为很难预测用户实际会注意到什么。mesage-of-the-day(motd),wall 和 email 通知可以吸引用户大部分的注意力。

注意日志文件

多注意日志文件也可以帮你理解用户的活动情况。尤其 /var/log/auth.log 文件将会显示用户的登录和注销活动,组的创建记录等。/var/log/message 或者 /var/log/syslog 文件将会告诉你更多有关系统活动的日志。

追踪问题和需求

无论你是否在 Linux 系统上安装了事件跟踪系统,跟踪用户遇到的问题以及他们提出的需求都非常重要。如果需求的一部分久久不见回应,用户必然不会高兴。即使是记录在纸上也是有用的,或者最好有个电子表格,这可以让你注意到哪些问题仍然悬而未决,以及问题的根本原因是什么。确认问题和需求非常重要,记录还可以帮助你记住你必须采取的措施来解决几个月甚至几年后重新出现的问题。

总结

在繁忙的服务器上管理用户帐号,部分取决于配置良好的默认值,部分取决于监控用户活动和遇到的问题。如果用户觉得你对他们的顾虑有所回应并且知道在需要系统升级时会发生什么,他们可能会很高兴。


via: https://www.networkworld.com/article/3225109/linux/managing-users-on-linux-systems.html

作者:Sandra Henry-Stocker 译者:dianbanjiu 校对:wxypityonline

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

想要在 Linux 命令行工作中提高效率,你需要使用一些技巧。

巧妙的 Linux 命令行技巧能让你节省时间、避免出错,还能让你记住和复用各种复杂的命令,专注在需要做的事情本身,而不是你要怎么做。以下介绍一些好用的命令行技巧。

命令编辑

如果要对一个已输入的命令进行修改,可以使用 ^actrl + a)或 ^ectrl + e)将光标快速移动到命令的开头或命令的末尾。

还可以使用 ^ 字符实现对上一个命令的文本替换并重新执行命令,例如 ^before^after^ 相当于把上一个命令中的 before 替换为 after 然后重新执行一次。

$ eho hello world  <== 错误的命令

Command 'eho' not found, did you mean:

 command 'echo' from deb coreutils
 command 'who' from deb coreutils

Try: sudo apt install <deb name>

$ ^e^ec^        <== 替换
echo hello world
hello world

使用远程机器的名称登录到机器上

如果使用命令行登录其它机器上,可以考虑添加别名。在别名中,可以填入需要登录的用户名(与本地系统上的用户名可能相同,也可能不同)以及远程机器的登录信息。例如使用 server_name ='ssh -v -l username IP-address' 这样的别名命令:

$ alias butterfly=”ssh -v -l jdoe 192.168.0.11”

也可以通过在 /etc/hosts 文件中添加记录或者在 DNS 服务器中加入解析记录来把 IP 地址替换成易记的机器名称。

执行 alias 命令可以列出机器上已有的别名。

$ alias
alias butterfly='ssh -v -l jdoe 192.168.0.11'
alias c='clear'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias list_repos='grep ^[^#] /etc/apt/sources.list /etc/apt/sources.list.d/*'
alias ll='ls -alF'
alias ls='ls --color=auto'
alias show_dimensions='xdpyinfo | grep '\''dimensions:'\'''

只要将新的别名添加到 ~/.bashrc 或类似的文件中,就可以让别名在每次登录后都能立即生效。

冻结、解冻终端界面

^sctrl + s)将通过执行流量控制命令 XOFF 来停止终端输出内容,这会对 PuTTY 会话和桌面终端窗口产生影响。如果误输入了这个命令,可以使用 ^qctrl + q)让终端重新响应。所以只需要记住 ^q 这个组合键就可以了,毕竟这种情况并不多见。

复用命令

Linux 提供了很多让用户复用命令的方法,其核心是通过历史缓冲区收集执行过的命令。复用命令的最简单方法是输入 ! 然后接最近使用过的命令的开头字母;当然也可以按键盘上的向上箭头,直到看到要复用的命令,然后按回车键。还可以先使用 history 显示命令历史,然后输入 ! 后面再接命令历史记录中需要复用的命令旁边的数字。

!! <== 复用上一条命令
!ec <== 复用上一条以 “ec” 开头的命令
!76 <== 复用命令历史中的 76 号命令

查看日志文件并动态显示更新内容

使用形如 tail -f /var/log/syslog 的命令可以查看指定的日志文件,并动态显示文件中增加的内容,需要监控向日志文件中追加内容的的事件时相当有用。这个命令会输出文件内容的末尾部分,并逐渐显示新增的内容。

$ tail -f /var/log/auth.log
Sep 17 09:41:01 fly CRON[8071]: pam_unix(cron:session): session closed for user smmsp
Sep 17 09:45:01 fly CRON[8115]: pam_unix(cron:session): session opened for user root
Sep 17 09:45:01 fly CRON[8115]: pam_unix(cron:session): session closed for user root
Sep 17 09:47:00 fly sshd[8124]: Accepted password for shs from 192.168.0.22 port 47792
Sep 17 09:47:00 fly sshd[8124]: pam_unix(sshd:session): session opened for user shs by
Sep 17 09:47:00 fly systemd-logind[776]: New session 215 of user shs.
Sep 17 09:55:01 fly CRON[8208]: pam_unix(cron:session): session opened for user root
Sep 17 09:55:01 fly CRON[8208]: pam_unix(cron:session): session closed for user root
        <== 等待显示追加的内容

寻求帮助

对于大多数 Linux 命令,都可以通过在输入命令后加上选项 --help 来获得这个命令的作用、用法以及它的一些相关信息。除了 man 命令之外, --help 选项可以让你在不使用所有扩展选项的情况下获取到所需要的内容。

$ mkdir --help
Usage: mkdir [OPTION]... DIRECTORY...
Create the DIRECTORY(ies), if they do not already exist.

Mandatory arguments to long options are mandatory for short options too.
 -m, --mode=MODE set file mode (as in chmod), not a=rwx - umask
 -p, --parents no error if existing, make parent directories as needed
 -v, --verbose print a message for each created directory
 -Z set SELinux security context of each created directory
 to the default type
 --context[=CTX] like -Z, or if CTX is specified then set the SELinux
 or SMACK security context to CTX
 --help display this help and exit
 --version output version information and exit

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
Full documentation at: <http://www.gnu.org/software/coreutils/mkdir>
or available locally via: info '(coreutils) mkdir invocation'

谨慎删除文件

如果要谨慎使用 rm 命令,可以为它设置一个别名,在删除文件之前需要进行确认才能删除。有些系统管理员会默认使用这个别名,对于这种情况,你可能需要看看下一个技巧。

$ rm -i    <== 请求确认

关闭别名

你可以使用 unalias 命令以交互方式禁用别名。它不会更改别名的配置,而仅仅是暂时禁用,直到下次登录或重新设置了这一个别名才会重新生效。

$ unalias rm

如果已经将 rm -i 默认设置为 rm 的别名,但你希望在删除文件之前不必进行确认,则可以将 unalias 命令放在一个启动文件(例如 ~/.bashrc)中。

使用 sudo

如果你经常在只有 root 用户才能执行的命令前忘记使用 sudo,这里有两个方法可以解决。一是利用命令历史记录,可以使用 sudo !!(使用 !! 来运行最近的命令,并在前面添加 sudo)来重复执行,二是设置一些附加了所需 sudo 的命令别名。

$ alias update=’sudo apt update’

更复杂的技巧

有时命令行技巧并不仅仅是一个别名。毕竟,别名能帮你做的只有替换命令以及增加一些命令参数,节省了输入的时间。但如果需要比别名更复杂功能,可以通过编写脚本、向 .bashrc 或其他启动文件添加函数来实现。例如,下面这个函数会在创建一个目录后进入到这个目录下。在设置完毕后,执行 source .bashrc,就可以使用 md temp 这样的命令来创建目录立即进入这个目录下。

md () { mkdir -p "$@" && cd "$1"; }

总结

使用 Linux 命令行是在 Linux 系统上工作最有效也最有趣的方法,但配合命令行技巧和巧妙的别名可以让你获得更好的体验。


via: https://www.networkworld.com/article/3305811/linux/linux-tricks-that-even-you-can-love.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:HankChow 校对:wxy

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

L1 终端错误(L1TF)影响英特尔处理器和 Linux 操作系统。让我们了解一下这个漏洞是什么,以及 Linux 用户需要为它做点什么。

昨天(LCTT 译注:本文发表于 2018/8/15)在英特尔、微软和红帽的安全建议中宣布,一个新发现的漏洞英特尔处理器(还有 Linux)的漏洞称为 L1TF 或 “ L1 终端错误 L1 Terminal Fault ”,引起了 Linux 用户和管理员的注意。究竟什么是这个漏洞,谁应该担心它?

L1TF、 L1 Terminal Fault 和 Foreshadow

处理器漏洞被称作 L1TF、L1 Terminal Fault 和 Foreshadow。研究人员在 1 月份发现了这个问题并向英特尔报告称其为 “Foreshadow”。它类似于过去发现的漏洞(例如 Spectre)。

此漏洞是特定于英特尔的。其他处理器不受影响。与其他一些漏洞一样,它之所以存在,是因为设计时为了优化内核处理速度,但允许其他进程访问数据。

另请阅读:[22 个必要的 Linux 安全命令]

已为此问题分配了三个 CVE:

  • CVE-2018-3615:英特尔 软件保护扩展 Software Guard Extension (英特尔 SGX)
  • CVE-2018-3620:操作系统和 系统管理模式 ystem Management Mode (SMM)
  • CVE-2018-3646:虚拟化的影响

英特尔发言人就此问题发表了这一声明:

“L1 Terminal Fault 通过今年早些时候发布的微代码更新得到解决,再加上从今天开始提供的操作系统和虚拟机管理程序软件的相应更新。我们在网上提供了更多信息,并继续鼓励每个人更新操作系统,因为这是得到保护的最佳方式之一。我们要感谢 imec-DistriNet、KU Leuven、以色列理工学院,密歇根大学,阿德莱德大学和 Data61 的研究人员以及我们的行业合作伙伴,他们帮助我们识别和解决了这个问题。“

L1TF 会影响你的 Linux 系统吗?

简短的回答是“可能不会”。如果你因为在今年 1 月爆出的 Spectre 和 Meltdown 漏洞修补过系统,那你应该是安全的。与 Spectre 和 Meltdown 一样,英特尔声称真实世界中还没有系统受到影响的报告或者检测到。他们还表示,这些变化不太可能在单个系统上产生明显的性能影响,但它们可能对使用虚拟化操作系统的数据中心产生大的影响。

即使如此,仍然推荐频繁地打补丁。要检查你当前的内核版本,使用 uname -r 命令:

$ uname -r
4.18.0-041800-generic

更多资源

请查看如下资源以了解 L1TF 的更多细节,以及为什么会出现这个漏洞:


via: https://www.networkworld.com/article/3298157/linux/linux-and-l1tf.html

作者:Sandra Henry-Stocker
选题:lujun9972
译者:geekpi
校对:wxy

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

许多 Linux 命令现在都有使其输出更易于理解的选项。让我们了解一些可以让我们心爱的操作系统更友好的东西。

不是每个人都以二进制方式思考,他们不想在大脑中给大数字插入逗号来了解文件的大小。因此,Linux 命令在过去的几十年里不断发展,以更人性化的方式向用户显示信息,这一点也不奇怪。在今天的文章中,我们将看一看各种命令所提供的一些选项,它们使得数据变得更容易理解。

为什么默认显示不更友好一些?

如果你想知道为什么默认不显示得更人性化,毕竟,我们人类才是计算机的默认用户啊。你可能会问自己:“为什么我们不竭尽全力输出对每个人都有意义的命令的响应?”主要的答案是:改变命令的默认输出可能会干扰许多其它进程,这些进程是在期望默认响应之上构建的。其它的工具,以及过去几十年开发的脚本,如果突然以一种完全不同的格式输出,而不是它们过去所期望的那样,可能会被一种非常丑陋的方式破坏。

说真的,也许我们中的一些人可能更愿意看文件大小中的所有数字,即 1338277310 而不是 1.3G。在任何情况下,切换默认习惯都可能造成破坏,但是为更加人性化的响应提供一些简单的选项只需要让我们学习一些命令选项而已。

可以显示人性化数据的命令

有哪些简单的选项可以使 Unix 命令的输出更容易解析呢?让我们来看一些命令。

top

你可能没有注意到这个命令,但是在 top 命令中,你可以通过输入 E(大写字母 E)来更改显示全部内存使用的方式。连续按下将数字显示从 KiB 到 MiB,再到 GiB,接着是 TiB、PiB、EiB,最后回到 KiB。

认识这些单位吧?这里有一组定义:

2`10 = 1,024 = 1 KiB (kibibyte)
2`20 = 1,048,576 = 1 MiB (mebibyte)
2`30 = 1,073,741,824 = 1 GiB (gibibyte)
2`40 = 1,099,511,627,776 = 1 TiB (tebibyte)
2`50 = 1,125,899,906,842,624 = PiB (pebibyte)
2`60 = 1,152,921,504,606,846,976 = EiB (exbibyte)
2`70 = 1,180,591,620,717,411,303,424 = 1 ZiB (zebibyte)
2`80 = 1,208,925,819,614,629,174,706,176 = 1 YiB (yobibyte)

这些单位与千字节(KB)、兆字节(MB)和千兆字节(GB)密切相关。虽然它们很接近,但是它们之间仍有很大的区别:一组是基于 10 的幂,另一组是基于 2 的幂。例如,比较千字节和千兆字节,我们可以看看它们不同点:

KB = 1000 = 10`3
KiB = 1024 = 2`10

以下是 top 命令输出示例,使用 KiB 为单位默认显示:

top - 10:49:06 up 5 days, 35 min,  1 user,  load average: 0.05, 0.04, 0.01
Tasks: 158 total,   1 running, 118 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  6102680 total,  4634980 free,   392244 used,  1075456 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  5407432 avail Mem

在按下 E 之后,单位变成了 MiB:

top - 10:49:31 up 5 days, 36 min,  1 user,  load average: 0.03, 0.04, 0.01
Tasks: 158 total,   2 running, 118 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.6 sy,  0.0 ni, 99.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem : 5959.648 total, 4526.348 free,  383.055 used, 1050.246 buff/cache
MiB Swap: 2047.996 total, 2047.996 free,    0.000 used. 5280.684 avail Mem

再次按下 E,单位变为 GiB:

top - 10:49:49 up 5 days, 36 min,  1 user,  load average: 0.02, 0.03, 0.01
Tasks: 158 total,   1 running, 118 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
GiB Mem :    5.820 total,    4.420 free,    0.374 used,    1.026 buff/cache
GiB Swap:    2.000 total,    2.000 free,    0.000 used.    5.157 avail Mem

你还可以通过按字母 e 来更改为显示每个进程使用内存的数字单位。它将从默认的 KiB 到 MiB,再到 GiB、TiB,接着到 PiB(估计你能看到小数点后的很多 0),然后返回 KiB。下面是按了一下 e 之后的 top 输出:

top - 08:45:28 up 4 days, 22:32,  1 user,  load average: 0.02, 0.03, 0.00
Tasks: 167 total,   1 running, 118 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.2 us,  0.0 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  6102680 total,  4641836 free,   393348 used,  1067496 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  5406396 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
  784 root      20   0  543.2m  26.8m  16.1m S   0.9  0.5   0:22.20 snapd
  733 root      20   0  107.8m   2.0m   1.8m S   0.4  0.0   0:18.49 irqbalance
22574 shs       20   0  107.5m   5.5m   4.6m S   0.4  0.1   0:00.09 sshd
    1 root      20   0  156.4m   9.3m   6.7m S   0.0  0.2   0:05.59 systemd

du

du 命令显示磁盘空间文件或目录使用了多少,如果使用 -h 选项,则将输出大小调整为最合适的单位。默认情况下,它以千字节(KB)为单位。

$ du camper*
360     camper_10.jpg
5684    camper.jpg
240     camper_small.jpg
$ du -h camper*
360K    camper_10.jpg
5.6M    camper.jpg
240K    camper_small.jpg

df

df 命令也提供了一个 -h 选项。请注意在下面的示例中是如何以千兆字节(GB)和兆字节(MB)输出的:

$ df -h | grep -v loop
Filesystem      Size  Used Avail Use% Mounted on
udev            2.9G     0  2.9G   0% /dev
tmpfs           596M  1.7M  595M   1% /run
/dev/sda1       110G  9.0G   95G   9% /
tmpfs           3.0G     0  3.0G   0% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           3.0G     0  3.0G   0% /sys/fs/cgroup
tmpfs           596M   16K  596M   1% /run/user/121
/dev/sdb2       457G   73M  434G   1% /apps
tmpfs           596M     0  596M   0% /run/user/1000

下面的命令使用了 -h 选项,同时使用 -T 选项来显示我们正在查看的文件系统的类型。

$ df -hT /mnt2
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/sdb2      ext4  457G   73M  434G   1% /apps

ls

即使是 ls,它也为我们提供了调整大小显示的选项,保证是最合理的单位。

$ ls -l camper*
-rw-rw-r-- 1 shs shs  365091 Jul 14 19:42 camper_10.jpg
-rw-rw-r-- 1 shs shs 5818597 Jul 14 19:41 camper.jpg
-rw-rw-r-- 1 shs shs  241844 Jul 14 19:45 camper_small.jpg
$ ls -lh camper*
-rw-rw-r-- 1 shs shs 357K Jul 14 19:42 camper_10.jpg
-rw-rw-r-- 1 shs shs 5.6M Jul 14 19:41 camper.jpg
-rw-rw-r-- 1 shs shs 237K Jul 14 19:45 camper_small.jpg

free

free 命令允许你以字节(B),千字节(KB),兆字节(MB)和千兆字节(GB)为单位查看内存使用情况。

$ free -b
              total        used        free      shared  buff/cache   available
Mem:     6249144320   393076736  4851625984     1654784  1004441600  5561253888
Swap:    2147479552           0  2147479552
$ free -k
              total        used        free      shared  buff/cache   available
Mem:        6102680      383836     4737924        1616      980920     5430932
Swap:       2097148           0     2097148
$ free -m
              total        used        free      shared  buff/cache   available
Mem:           5959         374        4627           1         957        5303
Swap:          2047           0        2047
$ free -g
              total        used        free      shared  buff/cache   available
Mem:              5           0           4           0           0           5
Swap:             1           0           1

tree

虽然 tree 命令与文件或内存计算无关,但它也提供了非常人性化的文件视图,它分层显示文件以说明文件是如何组织的。当你试图了解如何安排目录内容时,这种显示方式非常有用。(LCTT 译注:也可以看看 pstree,它以树状结构显示进程树。)

$ tree
.g to 
├── 123
├── appended.png 
├── appts
├── arrow.jpg
├── arrow.png
├── bin
│   ├── append
│   ├── cpuhog1
│   ├── cpuhog2
│   ├── loop
│   ├── mkhome
│   ├── runme

stat

stat 命令是另一个以非常人性化的格式显示信息的命令。它提供了更多关于文件的元数据,包括文件大小(以字节和块为单位)、文件类型、设备和 inode(索引节点)、文件所有者和组(名称和数字 ID)、以数字和 rwx 格式显示的文件权限以及文件的最后访问和修改日期。在某些情况下,它也可能显示最初创建文件的时间。

$ stat camper*
  File: camper_10.jpg
  Size: 365091          Blocks: 720        IO Block: 4096   regular file
Device: 801h/2049d      Inode: 796059      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/     shs)   Gid: ( 1000/     shs)
Access: 2018-07-19 18:56:31.841013385 -0400
Modify: 2018-07-14 19:42:25.230519509 -0400
Change: 2018-07-14 19:42:25.230519509 -0400
 Birth: -
  File: camper.jpg
  Size: 5818597         Blocks: 11368      IO Block: 4096   regular file
Device: 801h/2049d      Inode: 796058      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/     shs)   Gid: ( 1000/     shs)
Access: 2018-07-19 18:56:31.845013872 -0400
Modify: 2018-07-14 19:41:46.882024039 -0400
Change: 2018-07-14 19:41:46.882024039 -0400
 Birth: -

总结

Linux 命令提供了许多选项,可以让用户更容易理解或比较它们的输出。对于许多命令,-h 选项会显示更友好的输出格式。对于其它的,你可能必须通过使用某些特定选项或者按下某个键来查看你希望的输出。我希望这其中一些选项会让你的 Linux 系统看起来更友好一点。


via: https://www.networkworld.com/article/3296631/linux/displaying-data-in-a-human-friendly-way-on-linux.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:MjSeven 校对:wxy

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