2023年8月

时隔 15 年,几名学生再次黑进波士顿地铁

在 2008 年的 DefCon 上,几名 MIT 学生准备演讲他们如何找到方法免费搭乘波士顿的地铁,但该演讲被波士顿地铁管理部门申请了禁令而取消。不过,演讲稿已经在与会者之间传开,并发布到了网上。2021 年,两名高中生在搭乘波士顿地铁时谈论了此事,他们好奇是否能重复当年的做法,实现免费搭乘地铁。他们一开始认为不可能,波士顿地铁应该早就修复了该问题。但他们发现,该问题并没有被修复。他们对原有方案进行了扩展,以适应新的 RFID 智能卡。他们将在今年举行的 DefCon 上谈论他们的研究结果,但这一次波士顿地铁没有起诉他们,而是邀请他们前往其总部,并礼貌的请求他们隐藏部分技术细节,以增加其他黑客复制的难度。

消息来源:Wired
老王点评:这一次,波士顿地铁部门最大的问题是没有升级系统,而最大的进步是没有起诉这几位未来的“黑客”。顺便说一句,这件事不要随便尝试,除非你在波士顿。

ChatGPT 回答代码问题的正确率还不如抛硬币

普渡大学团队分析了 ChatGPT 对 517 个 Stack Overflow 问题的回答,分析表明,52% 的 ChatGPT 答案是错误的,77% 的答案是冗长的。但有趣是,“由于其全面性和清晰的语言风格,ChatGPT 答案在 39.34% 的情况下仍然会被测试者选择。”而这些被选择的答案中有 77% 是错误的。其主要原因之一是 ChatGPT 的答案非常详细。在很多情况下,如果参与者能够从冗长而详细的答案中获得有用的信息,他们并不介意长度。研究发现,只有当 ChatGPT 答案中的错误很明显时,用户才能识别出错误。当错误不易验证或需要 IDE 或文档时,用户通常无法识别错误或低估答案中的错误程度。

消息来源:The Register
老王点评:ChatGPT 看来不合适在数学、编程等严谨的场合工作,感觉更适合文科生的工作。另外一方面,对于 Stack Overflow 这样流量逐月下降的技术问答网站来说,这可能是个好消息,程序员们在发现 ChatGPT 不靠谱后还会回来的。

《雷神之锤 2》游戏代码开源

《雷神之锤 2》是 id Software 于 1997 年发布的一款第一人称射击游戏作品,成为了当时 FPS 游戏的划时代之作,其整体游戏画面、玩法都超越了前作。id Software 日前推出了《雷神之锤 2》增强版游戏,与此同时,官方开源了这款游戏,代码包含了《雷神之锤 2》2023 年重新发行的游戏代码和原版代码,供希望修改游戏的用户使用。

消息来源:GitHub
老王点评:经典之作!雷神 2 的开源想必会对 Linux 上的游戏开发有帮助。

我经常写关于我发现难以学习的技术的文章。不久前,我的朋友 Sumana 向我提出了一个有趣的问题 - 为什么这些东西学起来那么难?为什么它们看起来如此神秘?

以 DNS 为例。我们从 80 年代 开始使用 DNS(已经超过 35 年了!)。它在互联网上的每个网站中都使用。而且它相当稳定 - 在很多方面,它的工作方式与 30 年前完全相同。

但是我花了好几年的时间才弄清楚如何自信地调试 DNS 问题,我也见过很多其他程序员在调试 DNS 问题上苦苦挣扎。那么到底发生了什么呢?

以下是关于为什么学习排除 DNS 问题很困难的几点思考。

(我不会在这篇文章中详细解释 DNS,更多关于 DNS 如何工作的信息,请参阅 《用一个周末实现一个 DNS》 或 我的 DNS 方面的博文

并不是因为 DNS 非常难

当我最终学会如何排除 DNS 问题时,我的反应是“什么,就这样吗???这并不难!”我感觉有点被骗了!我可以在 几个小时 内向你解释关于 DNS 令我感到困惑的一切事情。

那么 - 如果 DNS 并不是那么复杂,为什么我花了这么多年的时间才弄清楚如何排除相当基本的 DNS 问题(比如“即使我已经正确设置了,我的域名仍无法解析”或者“dig 命令和我的浏览器的 DNS 结果不一致,为什么?”)?

而且,在发现 DNS 学习困难方面,我并不孤单!我与许多经验丰富的程序员朋友讨论过多年来的 DNS 问题,其中很多人要么:

  • 不敢轻易对其网站进行简单的 DNS 更改
  • 或对 DNS 工作原理的基本事实感到困惑(比如记录是 拉取的而非推送的
  • 或对 DNS 基础知识了解得很好,但却和我一样存在一些知识盲点(负缓存和 dig 命令及浏览器如何以不同方式进行 DNS 查询的细节)

因此,如果我们都面临着 DNS 的相同困扰,到底发生了什么?为什么对许多人来说学习 DNS 如此困难?

以下是我的一些看法。

很多系统是隐藏的

当你在计算机上发起 DNS 请求时,基本的过程如下:

  1. 你的计算机向一个名为“解析器”的服务器发起请求。
  2. 解析器检查其缓存,并向一些称为“权威名称服务器”的其它服务器发起请求。

以下是你看不到的一些内容:

  • 解析器的缓存。里面有什么内容?
  • 在你的计算机上进行 DNS 请求的库代码是哪个(是否是 libc 的 getaddrinfo 函数?如果是,它是来自 glibc、musl 还是苹果?是你的浏览器的 DNS 代码吗?还是其他自定义的 DNS 实现?)所有这些选项的行为略有不同,并且有不同的配置、缓存方法、可用功能等等。例如,musl DNS 直到 2023 年初 才支持 TCP。
  • 解析器与权威名称服务器之间的对话。如果你能够神奇地获得一个准确记录你的请求期间向下游查询的每个权威名称服务器以及它们的响应的追踪,我认为很多 DNS 问题将变得非常简单。(比如,如果你能运行 dig +debug google.com 并获得一些额外的调试信息会怎么样?)

如何和隐藏系统打交道

以下是几个处理隐藏系统的方法:

  • 向人们传授隐藏系统的知识会产生重大影响。很长一段时间里,我不知道我的计算机有多个不同的 DNS 库,它们在不同情况下使用,我对此感到困惑了好几年。这是我的重要排错方法。
  • 通过 Mess With DNS,我们尝试了一种“鱼缸”的方法,展示了通常隐藏的系统(与解析器和权威名称服务器的对话)的一些部分。
  • 我觉得将 DNS 扩展以包括一个“调试信息”部分会非常酷。(注:似乎这已经有了!它被称为“扩展 DNS 错误”,即 EDE,各种工具正在逐渐添加对它的支持。)

扩展 DNS 错误看起来不错

扩展 DNS 错误是 DNS 服务器提供额外调试信息的一种新方式。以下是一个示例:

$ dig @8.8.8.8 xjwudh.com
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 39830
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
; EDE: 12 (NSEC Missing): (Invalid denial of existence of xjwudh.com/a)
;; QUESTION SECTION:
;xjwudh.com.            IN    A

;; AUTHORITY SECTION:
com.            900    IN    SOA    a.gtld-servers.net. nstld.verisign-grs.com. 1690634120 1800 900 604800 86400

;; Query time: 92 msec
;; SERVER: 8.8.8.8#53(8.8.8.8) (UDP)
;; WHEN: Sat Jul 29 08:35:45 EDT 2023
;; MSG SIZE  rcvd: 161

这里我请求了一个不存在的域名,并收到了扩展错误信息 EDE: 12 (NSEC Missing): (Invalid denial of existence of xjwudh.com/a)。我不太确定这是什么意思(它与 DNSSEC 有关),但能看到这样额外的调试信息真的很酷。

为了能看到上述内容,我确实需要安装更新版本的 dig

令人困惑的工具

尽管很多 DNS 的细节被隐藏起来,但你可以通过使用 dig 工具来找出发生了什么事情。

例如,你可以使用 dig +norecurse 来确定给定的 DNS 解析器是否在其缓存中具有特定的记录。如果响应没有被缓存,8.8.8.8 看起来会返回 SERVFAIL 响应。

以下是对 google.com 进行该操作的示例:

$ dig +norecurse  @8.8.8.8 google.com
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11653
;; flags: qr ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;google.com.            IN  A

;; ANSWER SECTION:
google.com.     21  IN  A   172.217.4.206

;; Query time: 57 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri Jul 28 10:50:45 EDT 2023
;; MSG SIZE  rcvd: 55

这是对 homestarrunner.com 的示例:

$ dig +norecurse  @8.8.8.8 homestarrunner.com
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 55777
;; flags: qr ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;homestarrunner.com.        IN    A

;; Query time: 52 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri Jul 28 10:51:01 EDT 2023
;; MSG SIZE  rcvd: 47

在这里,你可以看到我们对于 google.com 得到了一个正常的 NOERROR 响应(8.8.8.8 的缓存中有该记录),但对于 homestarrunner.com 得到了 SERVFAIL 响应(没有缓存)。这并不意味着 homestarrunner.com 没有 DNS 记录(实际上有!),它只是没有被缓存。

但如果你不熟悉这样的输出,它确实很难阅读!以下是我认为其中一些奇怪的地方:

  1. 标题很奇怪(有 ->>HEADER<<-flags:OPT PSEUDOSECTION:QUESTION SECTION:ANSWER SECTION:)。
  2. 空格排版很奇怪(OPT PSEUDOSECTIONQUESTION SECTION 之间为什么没有换行符?)。
  3. MSG SIZE rcvd: 47 很奇怪(MSG SIZE 中是否还有其他字段,而不仅仅是 rcvd?它们是什么?)。
  4. 它说有 1 个记录在 ADDITIONAL 部分,但没有显示它,你必须以某种方式神奇地知道OPT PSEUDOSECTION 记录实际上在 ADDITIONAL 部分。

总的来说,dig 的输出给人的感觉是一个以临时方式编写并随着时间的推移逐渐发展起来的脚本,而不是经过有意设计的东西。

处理令人困惑的工具的一些想法:

  • 解释输出结果。例如,我写了一篇 如何使用 dig 的文章,解释了 dig 的输出结果以及如何配置它以默认给出更简短的输出。
  • 创建新的、更友好的工具。例如,在 DNS 方面,有 dogdoggo我的 DNS 查询工具。我认为这些工具非常酷,但我个人不使用它们,因为有时我想做一些稍微高级一点的操作(比如使用 +norecurse),据我所知,无论是 dog 还是 doggo 都不支持 +norecurse。我更愿意使用一个工具来完成所有任务,所以我坚持使用 dig。要替换 dig,其功能广度是一项庞大的工作。
  • 使 dig 的输出更加友好。如果我在 C 编程方面更好一些,我可能会尝试编写一个 dig 的拉取请求,添加一个 +human 标志以以更结构化和易读的方式格式化长格式的输出,可能类似于以下形式:
$ dig +human +norecurse  @8.8.8.8 google.com 
HEADER:
  opcode: QUERY
  status: NOERROR
  id: 11653
  flags: qr ra
  records: QUESTION: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

QUESTION SECTION:
  google.com.            IN    A

ANSWER SECTION:
  google.com.        21    IN    A    172.217.4.206
  
ADDITIONAL SECTION:
  EDNS: version: 0, flags:; udp: 512

EXTRA INFO:
  Time: Fri Jul 28 10:51:01 EDT 2023
  Elapsed: 52 msec
  Server: 8.8.8.8:53
  Protocol: UDP
  Response size: 47 bytes

这样可以更清晰地呈现 DNS 响应的结构-包括标题、问题、答案和附加部分。

而且它并不是“简化”了什么!它是完全相同的信息,只是以更结构化的方式进行了格式化。我对替代的 DNS 工具最大的不满是它们经常为了清晰起见而删除信息。虽然这些工具肯定有其用武之地,但我想要看到所有的信息!我只是希望它能够以清晰明了的方式呈现。

在过去的 40 年中,我们已经学到了很多关于如何设计更用户友好的命令行工具的知识,我认为将其中一些知识应用到我们那些有些陈旧的工具中将会很棒。

dig +yaml

关于 dig 的一个简单备注:较新版本的 dig 支持 +yaml 输出格式,对我来说更加清晰,但有些冗长(一个相当简单的 DNS 响应都无法在屏幕上完整显示)。

一些奇怪的陷阱

DNS 存在一些相对常见但很难通过自学了解到的奇怪问题。以下是一些例子(有更多可在 导致 DNS 中断的一些方式 中找到):

  • 负缓存:我在 这篇演讲 中提到过,我大约花了 5 年时间才意识到不应该访问没有 DNS 记录的域名,因为该记录的 不存在 信息将被缓存,并且该缓存在几个小时内不会被更新,这真的很烦人。
  • getaddrinfo 实现的差异:直到 2023 年初musl 不支持 TCP DNS。
  • 忽略 TTL 的解析器:如果你在 DNS 记录上设置了 TTL(比如“5 分钟”),一些解析器完全会忽略这些 TTL 设置,并将记录缓存更长时间,比如可能是 24 小时。
  • 如果你错误地配置了 Nginx(像这样),它将永久缓存 DNS 记录。
  • ndots 如何导致 Kubernetes DNS 缓慢。

如何应对奇怪的陷阱

对此,我没有像我希望的那样完美的答案。对奇怪陷阱的了解非常难以获得(再次强调,我花了多年的时间才弄清楚负缓存!),对我而言,人们不得不一次又一次地自己重新发现它们感觉很愚蠢。

以下是一些想法:

  • 当有人在解释一个主题时提到了一些棘手的问题,这是非常有帮助的。例如(离开 DNS 一下),Josh Comeau 的 Flexbox 入门解释了这个 最小尺寸的陷阱,在找到解释之前,我多年来遇到过很多次这个问题。
  • 我希望看到更多的社区整理的常见陷阱。比如说,对于 Bash,shellcheck 是一个非常不错的常见陷阱集合。

关于记录 DNS 陷阱的一个棘手问题是,不同的人会遇到不同的陷阱。如果你只是每三年为个人域名配置一次 DNS,你可能会遇到不同的问题,而那些管理高流量域名的人则可能会遇到其他问题。

还有一些更简单的原因:

不经常接触

很多人非常少接触 DNS。如果你只在每三年才处理一次 DNS,学习起来就会更加困难!

我认为备忘单(比如“这是更改你的名称服务器的步骤”)可以在这方面起到很大的帮助。

难以进行实验

DNS 在进行实验时可能会让人感到害怕,因为你不想搞砸自己的域名。我们建立了 Mess With DNS 来使这个过程变得更容易一些。

目前就这些

我很想听听其他关于什么让 DNS(或你最喜欢的神秘技术)难以学习的想法。

(题图:MJ/96c5d8fb-f4a5-4710-8f91-c71617120675)


via: https://jvns.ca/blog/2023/07/28/why-is-dns-still-hard-to-learn/

作者:Julia Evans 选题:lujun9972 译者:ChatGPT 校对:wxy

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

Gherkin 语法可以帮助你思考技术事务的过程,然后帮助你将其转化为程序员逻辑的形式写下来。

与软件开发人员沟通通常是一项繁重的任务,尤其是当人们缺乏技术知识和技术词汇时。这就是为什么项目经理经常使用 用户故事 和多功能系统隐喻。

你可以利用旨在促进项目利益相关者和开发人员之间讨论的技术,进一步协助沟通。

Cucumber 框架

Cucumber 是一个开源框架,可以使用易于编写的通用语言创建自动化软件测试。它基于 行为驱动开发(BDD) 的概念,该概念规定创建软件应定义用户希望应用在特定条件成立时如何表现。

(LCTT 译注:Gherkin 和 Cucumber 都是黄瓜,其中 Gherkin 一种用来腌制的小黄瓜。顺便说一句,黄瓜原名胡瓜,因其由汉朝张骞出使西域时带回,后因石勒禁称“胡”字,更名为黄瓜。)

Cucumber 框架并不是现代意义上的“技术”。它不是位和字节的集合。相反,它是一种用自然语言(在本文中为英语,但到目前为止 Gherkin 已被翻译成 70 多种语言)的写作方式。使用 Cucumber 框架时,你不需要知道如何读取或编写代码。你只需要能够写下你对工作方式的想法即可。你还应该使用一组特定术语和指南来记录你希望技术如何为你服务。

Gherkin 语言是什么?

Cucumber 使用 Gherkin 作为定义用例的方法。它主要用于生成明确的项目需求。换句话说,其目的是允许用户准确地描述他们需要软件做什么,不留任何解释或例外的空间。它帮助你思考技术事务的过程,然后帮助你以可转化为程序员逻辑的形式将其写下来。

这是一个例子:

功能:活期账户持有人取款
场景:有关账户并不缺少资金
    假如账户余额为 200 英镑
    借记卡有效
    取款机里有足够的钱
    当活期账户持有人申请 50 英镑时
    则取款机支付 50 英镑
    账户余额为 150 英镑
    借记卡被退回

正如你所看到的,这是一个非常具体的场景,其中假设用户请求 50 英镑,取款机提供 50 英镑并相应地调整用户的帐户余额。此场景只是取款机用途的一部分,它仅代表人与取款机交互的特定组成部分。当程序员被赋予对机器进行编程以响应用户请求的任务时,这清楚地表明了涉及哪些因素。

Gherkin 关键字是什么?

Gherkin 语法使用五个不可或缺的语句来描述执行任务所需的操作:

  • 功能 Feature :表示任何给定软件功能的高层次描述
  • 场景 Scenario :描述具体\_示例\_
  • 假如 Given :解释系统的初始上下文
  • When :指定事件或操作
  • Then :描述预期输出或结果
  • 而且 And (或者 但是 But ):增加文本流畅性

(LCTT 译注:这些关键字可以使用任何语言,请参照:https://cucumber.io/docs/gherkin/languages/

通过使用这些简单的关键字,客户、分析师、测试人员和软件程序员能够使用所有人都能识别的术语来交换想法。

可执行的需求和自动化测试

更好的是,Gherkin 要求也是可执行的。这是通过将每个关键字映射到其预期(且明确说明)的功能来完成的。因此,为了与上面的示例保持一致,任何已经实现的内容都可以自动显示为绿色:

    当活期账户持有人申请 50 英镑时
    则取款机支付 50 英镑
    账户余额为 150 英镑
    借记卡被退回

通过扩展,Gherkin 使开发人员能够将需求转换为可测试的代码。在实践中,你可以使用特定的短语来检查你的软件方案!如果你当前的代码无法正常工作,或者新的更改意外导致软件错误(或两个或三个),那么你可以轻松查明问题,然后再继续修复它们。

结论

得益于 Gherkin 语法,你的客户将不再陷入困境。你可以弥合企业和开发人员之间的鸿沟,并比以往更有信心地交付出色的产品。

通过访问 Cucumber 网站 或其 Git 仓库 了解有关 Gherkin 的更多信息。

(题图:MJ/b717cd4f-0a6b-4b28-a895-b9688b289551)


via: https://opensource.com/article/23/2/gherkin-language-developers

作者:David Blackwood 选题:lkxed 译者:geekpi 校对:wxy

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

Chrome 将支持抗量子计算机攻击加密

从 8 月 15 日发布的 Chrome 116 开始,Chrome 浏览器将支持一种混合加密算法,其采用的密钥封装机制去年获得了 NIST 的后量子加密技术认证。谷歌正在 Chrome 浏览器中部署该加密算法,有助于谷歌以及 Cloudflare 等网络提供商可以测试抗量子算法,同时保持现有的保护措施。量子计算机可能至少还需要 15 年,甚至更久。但量子计算机的到来不会是一个具体的、迫在眉睫的日期,而是会毫无征兆的到来。现在用抗量子算法加密的数据,有助于防止“现在捕获,以后解密”的破解。

消息来源:The Register
老王点评:似乎全世界都在默默等着美国的抗量子加密的进展和标准,不过,就算美国提出来了,其它国家真敢用吗?

Linus Torvalds 亲自审查 Bcachefs 文件系统代码

开发已久的 Bcachefs 文件系统的代码已提交给 Linux 6.5,但由于各种技术问题和开发人员内斗,该驱动程序在这个开发周期内未能合并。为了解决纷争,Linus Torvalds 亲自审查了 Bcachefs 的代码。在审查完成后,他表达了对部分锁定代码的担忧,并认为 Bcachefs 的部分先决代码应通过各自的子系统/维护者分支,而不是一个大的整个拉动请求来实现。总体来说,他并不反对 Bcachefs 对外部先决代码的改动,而它内部的一些东西,比如六个锁,其实也不影响外部,也没什么问题。但是他也困扰于现有开发者们的意见相悖,希望能平息这些纷争。

消息来源:Phoronix
老王点评:不同的开发理念,就会形成不同的立场。在加上或多或少的私人感受,开发者社区其实也是江湖,想做个仁慈独裁者,其实也不容易。

Firefox 将成为唯一支持开放扩展的安卓浏览器

在过去的几年里,安卓版的 Firefox 只正式支持了一小部分扩展。Mozilla 宣布将在年底前推出对安卓版浏览器的开放扩展生态系统的支持。Firfox 将成为唯一一个支持开放扩展系统的主流安卓浏览器。最近,安卓版的 Firefox 的夜间构建版引入了多进程支持,这意味着扩展不再与 Firefox 的用户界面一样托管在主进程中,这有助于安全隔离和避免扩展等资源密集型进程被安卓系统关闭。

消息来源:Mozilla
老王点评:这是一个正确的选择,一方面现在移动浏览器越来越重要,另外一方面,Firefox 应该有其独特的地方才能有自己的基本盘。最初我喜欢用 Firefox,纯粹是因为 Firebug 给 Firefox 带来了独有的调试面板。

熟悉在 Linux 命令行中复制文件和目录的 cp 命令。

cp 命令是 Linux 中一个重要的命令,你可能经常会用到它。

正如名称所示,cp 代表 复制 copy ,它被用于 在 Linux 命令行中复制文件和目录

这是一个相对简单的命令,只有几个选项,但你仍有必要深入了解它。

在展示 cp 命令的实际示例之前,我更建议你先熟悉绝对路径和相对路径的概念,将文件从一个位置复制到另一个位置时,你需要用到它们。

Linux 中的绝对路径和相对路径的不同之处

复制单个文件

cp 命令最简单和最常见的用途是复制文件,只需指定源文件和要“粘贴”文件的目标目录即可。

cp 源文件 目标目录

将单个文件从源目录复制到目标目录。

在复制文件的同时重命名它

你将文件复制到另一个位置时可以同时进行 重命名。这有点类似于文本编辑器中的“另存为”选项。

为此,你必须在路径中给出新的文件名。

cp 源文件 目标目录/新文件名

在复制文件的同时重命名

复制多个文件

你还可以将多个文件复制到另一个位置。

cp 文件1 文件2 文件3 目标目录

复制多个文件时,将目标目录放在最后

在这种情况下,你无法重命名文件。

你还可以使用通配符扩展,将特定后缀的文件复制到另一个位置:

cp *.txt 目标目录

使用通配符扩展复制多个文件,比如所有 .txt 后缀的文件

复制文件时避免覆盖现有文件

如果你将 file1.txt 复制到一个已经存在名为 file1.txt 文件的目录中,它会将原有的文件覆盖掉。

如果你不希望这样,cp 命令还提供了几个选项来处理文件覆盖的情况。

首先是使用选项 -i 的交互模式。在交互模式下,它会询问是否确认或放弃覆盖目标文件。

cp -i 源文件 目标目录
cp:覆盖 '目标目录/源文件' ?

Y 覆盖文件,按 N 跳过复制该文件。

覆盖,但以交互方式询问(内容将被覆盖)

覆盖,但以交互方式询问(内容不会被覆盖)

选项 -n 代表完全取消覆盖。使用此选项时目标文件不会被覆盖。

cp -n 源文件 目标目录

取消覆盖(目录内文件的内容未更改)

还有一个选项 -b,在目标目录的文件将被覆盖时自动为其创建备份。我猜这里 b 代表 备份 backup

cp -b 源文件 目标目录

覆盖文件,但在备份文件后附加了“~”。

最后,还有一个“ 更新 update ”选项 -u,如果目标文件比源文件旧,或者目标文件不存在,就会被覆盖掉。

cp -u 源文件 目标目录

新文件会覆盖旧文件

复制目录(文件夹)

cp 命令也用来在 Linux 命令行中复制目录

在复制目录时,你需要使用递归选项 -r

cp -r 源目录 目标目录

在 Linux 中使用 cp 命令复制整个目录

你还可以将多个目录复制到另一个位置:

cp -r 目录1 目录2 目录3 目标目录

使用 cp 命令复制多个目录

在复制时保留属性

当你将文件复制到另一个位置时,它的 时间戳文件权限 甚至所有权都会发生变化。

这是正常的行为。但在某些情况下,你可能希望在复制文件时保留其原始属性。

要保留属性,请使用选项 -p

cp -p 源文件 目标目录

? 还有一个 -a 选项用于存档模式。它将连 ACL 也保留下来。

?️ 练习时间

想要练习一下 cp 命令吗?以下是一些简单的练习题供你尝试。

  • 打开终端并创建一个名为 practice_cp 的目录。
  • 现在,将 /etc/services 文件复制到这个新创建的目录中。
  • practice 目录中对复制的 services 文件进行一些小的更改。
  • 现在,使用更新模式再次复制 /etc/services 文件。有什么变化吗?观察一下。
  • 查看 /var/log 目录,并将以 mail 开头的日志文件复制到你的联系目录下。
  • 现在,返回到你的家目录,并创建一个名为 new_dir 的新目录(好吧,我想不出更好的名字)。
  • practice_cp 目录复制到 new_dir 目录中。

对你来说这些练习足够用了。希望你能喜欢在这里学习 Linux 命令。

(题图:MJ/07b35a39-826e-4904-9f85-25257831ce9d)


via: https://itsfoss.com/cp-command/

作者:Abhishek Prakash 选题:lkxed 译者:onionstalgia 校对:wxy

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

有时我与一些害怕使用命令行的朋友交谈,我感到自己给不出好的建议(我已经使用命令行太长时间了),因此我向一些 Mastodon 上的人提出了以下问题:

如果在过去一到三年内,你刚刚不再害怕使用命令行了,是什么帮助了你?

(如果你不记得,或者你已经使用命令行舒适地工作了 15 年,则无需回答——这个问题不适用于你 ?)

这个列表还不如我希望的那么长,但我希望通过发布它来收集更多的答案。显然,并没有一个单一的方法适用于所有人,不同的人会选择不同的路径。

我认为舒适使用命令行有三个方面:减少风险动机资源。我将先谈谈减少风险,然后是一些动机,并列出一些资源。

减少风险的方式

很多人(没错!)对在命令行上意外执行了一些无法撤销的破坏性操作感到担心。

以下是一些人们提到的帮助他们减少风险的策略:

  • 定期备份(有人提到他们在上周的一个命令行错误中意外删除了整个家目录,但很幸运他们有备份)。
  • 对于代码,尽可能多地使用 git
  • rm 设置为类似 safe-rmrmtrash 这样的工具的别名,这样你就不会意外删除不应删除的内容(或者就设置别名到 rm -i)。
  • 尽量避免使用通配符,使用制表符键补全代替(我的 Shell 会使用 TAB 键补全 rm *.txt 并显示我将要删除的内容)。
  • 使用精美的终端提示符,可以显示当前目录、计算机名称、git 分支和你是否具有 root 权限。
  • 如果你计划对文件运行未经测试或危险的命令,先备份文件副本。
  • 拥有一台专用的测试机器(如便宜的旧 Linux 计算机或树莓派)进行特别危险的测试,例如测试备份软件或分区。
  • 对于危险命令,如果有的话,使用 --dry-run 选项来查看执行结果而不实际执行操作。
  • 在你的 Shell 脚本中构建自己的 --dry-run 选项。

这些策略有助于降低在命令行上引发不可逆操作的风险。

杀手级应用程序

一些人提到了一个“杀手级命令行应用程序”,这激励他们开始花更多时间在命令行上。例如:

  • ripgrep
  • jq
  • wget / curl
  • git(一些人发现他们更喜欢使用 git 命令行界面而不是使用图形界面)
  • ffmpeg(用于视频处理)
  • yt-dlp
  • 硬盘数据恢复工具(来自 这个精彩的故事

还有一些人提到他们对图形界面工具感到失望(例如使用了所有内存,并使计算机崩溃的重型集成开发环境),并因此有动机用更轻量级的命令行工具替代它们。

激发人们的命令行技巧

有人提到被其他人在命令行上展示的酷炫功能所激励,例如:

explainshell

有几个人提到了 explainshell,它可以让你粘贴任何命令行指令,并将其分解成不同的部分解释。

命令历史、制表符补全等等

有很多小技巧和窍门可以使在命令行上工作更容易,例如:

  • 使用向上箭头查看先前的命令
  • 使用 Ctrl+R 搜索你的 Bash 历史记录
  • 使用快捷键在行内导航:Ctrl+w (删除一个单词)、Ctrl+a(跳转到行首)、Ctrl+e(跳转到行尾),以及 Ctrl+left arrow / Ctrl+right arrow(向前/向后跳转一个单词)
  • 将 Bash 历史记录设置为无限制
  • 使用 cd - 返回上一个目录
  • 文件名和命令名的制表符自动补全
  • 学习如何使用像 less 这样的分页工具阅读手册页或其他大型文本文件(如搜索、滚动等)
  • 在 macOS 上使用 pbcopy/pbpaste 将剪贴板内容复制/粘贴到 stdout/stdin
  • 在编辑配置文件之前备份它们

fzf

很多人提到使用 fzf 作为模糊搜索 Shell 历史记录的更好方法。除了作为更好的模糊搜索 Shell 历史记录的工具,人们还提到了一些其他用途:

  • 选择 git 分支(git checkout $(git for-each-ref --format='%(refname:short)' refs/heads/ | fzf)
  • 快速查找要编辑的文件(nvim $(fzf)
  • 切换 Kubernetes 上下文(kubectl config use-context $(kubectl config get-contexts -o name | fzf --height=10 --prompt="Kubernetes Context> ")
  • 从测试套件中选择要运行的特定测试

一般的模式是使用 fzf 来选择某个对象(文件、git 分支、命令行参数),fzf 将所选对象输出到标准输出,然后将其插入作为另一个命令的命令行参数。

你还可以将 fzf 用作工具,自动预览输出并快速迭代,例如:

  • 自动预览 jq 的输出(echo '' | fzf --preview "jq {q} < YOURFILE.json"
  • 自动预览 sed 的输出(echo '' | fzf --preview "sed {q} YOURFILE"
  • 自动预览 awk 的输出(echo '' | fzf --preview "awk {q} YOURFILE"

你可以参考这个思路。

通常,人们会为 fzf 的使用定义别名,比如输入 gcb 或其他命令,以快速选择要检出的 git 分支。

树莓派

一些人开始使用树莓派,这样可以更安全地进行实验,而不必担心损坏计算机(只需擦除 SD 卡然后重新开始即可!)。

漂亮的 Shell 环境

很多人说,当他们开始使用像 oh-my-zshFish 这样更用户友好的 Shell 环境时,他们在命令行上感到更舒适。我非常同意这一点 – 我已经使用 Fish 十年了,我非常喜欢它。

在这里还有一些其他的事情可以做:

  • 有些人说,让他们的终端更漂亮可以帮助他们感到更舒适(“让它变成粉色!”)。
  • 设置一个漂亮的 Shell 提示符来提供更多信息(例如,当命令失败时,可以将提示符设置为红色)。特别是 transient prompts(在当前命令设置一个非常花哨的提示符,但在之前的命令中设置一个简单得多的提示符)看起来非常好。

一些用于美化终端的工具:

  • 我使用 base16-shell
  • powerlevel10k 是一个流行的漂亮的 Zsh 主题,具有 transient prompts
  • starship 是一个漂亮的提示符工具
  • 在 Mac 上,我认为 iTerm2 比默认的终端更容易自定义。

漂亮的文件管理器

一些人提到了像 rangernnn 这样的漂亮的终端文件管理器,这是我之前没有听说过的。

一个有帮助的朋友或同事

一个可以回答初学者问题并给你指点的人是无价的。

通过肩并肩地观察学习

有人提到观察更有经验的人使用终端 - 有很多经验丰富的用户甚至没有意识到自己在做什么,你可以从中学到很多小技巧。

别名

很多人说,为常用任务创建自己的别名或脚本就像是一个神奇的“灵光一现”时刻,因为:

  • 他们不必记住语法
  • 然后他们就有了一份自己常用命令的列表,可以轻松调用

查找示例的备忘单

很多手册页没有示例,例如 openssl s\_client 的手册页就没有示例。这使得起步变得更加困难!

人们提到了一些备忘单工具,比如:

  • tldr.sh
  • cheat(还可以进行编辑 - 你可以添加自己的命令以供以后参考)
  • um(一个非常精简的需要自己构建的系统)

例如,openssl 的备忘单 非常棒 - 我认为它几乎包含了我在实际中使用 openssl 时用过的所有内容(除了 openssl s_client-servername 选项)。

有人说他们配置了他们的 .bash_profile,这样每次登录时都会打印出一张备忘单。

不要试图背诵

一些人说他们需要改变自己的方法 - 他们意识到不需要试图记住所有的命令,只需按需查找命令,随着时间的推移,他们会自然而然地记住最常用的命令。

(我最近对学习阅读 x86 汇编有了完全相同的体会 - 我正在上一门课程,讲师说“是的,刚开始时可以每次都查找,最终你会记住最常见的指令。”)

还有一些人说相反的观点 - 他们使用间隔重复应用程序(如 Anki)来记忆常用的命令。

Vim

有人提到他们开始在命令行上使用 Vim 编辑文件,一旦他们开始使用终端文本编辑器,使用命令行处理其他事情也变得更自然。

此外,显然有一个名为 micro 的新编辑器,像是更好的 pico/nano,适用于那些不想学习 Emacs 或 Vim 的人。

桌面上使用 Linux

有人说他们开始使用 Linux 作为他们的日常主力系统,而需要修复 Linux 问题可以帮助他们学习。这也是我在大约 2004 年熟悉命令行的方式(我非常喜欢安装各种不同的 Linux 发行版,以找到我最喜欢的那个),但我猜这不是如今最受欢迎的策略。

被迫仅使用终端

有些人说他们参加了一门大学课程,教授让他们在终端上做所有事情,或者他们自己制定了一个规则,一段时间内必须在终端上完成所有工作。

工作坊

有几个人说像 Software Carpentry 这样的工作坊(面向科学家的命令行、Git 和 Python/R 编程简介)帮助他们更熟悉命令行。

你可以在这里查看 Software Carpentry 课程

书籍和文章

一些提到的材料:

文章:

书籍:

视频:

(题图:MJ/c0dc082a-a477-434b-b826-77a42c8f61c3)


via: https://jvns.ca/blog/2023/08/08/what-helps-people-get-comfortable-on-the-command-line-/

作者:Julia Evans 选题:lujun9972 译者:ChatGPT 校对:wxy

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