惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
爱范儿
爱范儿
P
Proofpoint News Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Tailwind CSS Blog
J
Java Code Geeks
宝玉的分享
宝玉的分享
Jina AI
Jina AI
B
Blog
N
Netflix TechBlog - Medium
Recent Announcements
Recent Announcements
aimingoo的专栏
aimingoo的专栏
腾讯CDC
C
Check Point Blog
The Cloudflare Blog
阮一峰的网络日志
阮一峰的网络日志
博客园 - Franky
罗磊的独立博客
B
Blog RSS Feed
WordPress大学
WordPress大学
小众软件
小众软件
博客园 - 叶小钗
M
MIT News - Artificial intelligence
GbyAI
GbyAI

Yesterday17's Blog

2026 新年解密红包 / Melody Flag | Yesterday17's Blog 谈谈 Iori 的设计思路(二):如何实现一个 Showroom 录制工具? | Yesterday17's Blog 谈谈 Iori 的设计思路(一):从 Nico Timeshift 说起 | Yesterday17's Blog Iori Minyami 0.1.0 发布 | Yesterday17's Blog 2025 新年解密红包 / Melody Flag | Yesterday17's Blog 使用 Cloudflare Warp 解决罗森票务的海外登录问题 | Yesterday17's Blog How To Blog 04: The Astro v5 Era | Yesterday17's Blog 谈谈 tokio::select! 的公平性 | Yesterday17's Blog Learning Pingora 05 - Connect with TLS | Yesterday17's Blog Leaving Bytedance | Yesterday17's Blog 大橋彩香 AsiaTour「Reflection」上海公演 个人向记录 & Repo | Yesterday17's Blog Recoving from burnout - What happened? | Yesterday17 Yubikey 重建手册 | Yesterday17's Blog How To Blog 03: Heimus | Yesterday17's Blog 🪧 Blog Migration Accouncement | Yesterday17's Blog Learn Your IDE - VSCode 是如何仅重启插件的? | Yesterday17's Blog How To Blog 02: Astro❤️Password | Yesterday17's Blog How To Blog 01: Why, How, and the Future | Yesterday17's Blog Learning Pingora 04 - Establish L4 Connection | Yesterday17's Blog Learning Pingora 03 - Upstreams and Peers | Yesterday17's Blog Learning Pingora 02 - A Simple HTTP Server | Yesterday17's Blog Learning Pingora 01 - Getting Started | Yesterday17's Blog 2024 新年解密红包 / Melody Flag | Yesterday17's Blog 向新的一年飞驰——记录 2023 | Yesterday17's Blog 「サクラノ刻」对话选摘(2) | Yesterday17's Blog PGP Key Revocation 注销声明 | Yesterday17's Blog 「サクラノ刻」对话选摘(1) | Yesterday17's Blog 2023 新年解密红包 / Melody Flag | Yesterday17's Blog 『蒼の彼方のフォーリズム』通关感想 | Yesterday17's Blog 单显卡直通教程 | Yesterday17's Blog
*nix 权限初探 | Yesterday17's Blog
Yesterday17 · 2020-03-01 · via Yesterday17's Blog

今天遇到了之前没遇到过的问题(倒不如说之前没遇到才是真的玄学),.ssh/authorized_keys 明明存在,但却没法免密登录。在一番搜索之后,我发现问题的关键在于权限问题。之前对权限的了解较浅,知道的也就 777644 这几个数字,平时用到的也就只有 chmod +x,正好借这个机会好好学习一下。

文件和目录的权限在 《Beginning Unix》 中位于第 67 页。简单来说,权限可以分为四种:

  • r:读取权限(read)
  • w: 写入权限(write)
  • x: 执行权限(execute)
  • -: 无权限(deny)

通过 ls -l,我们可以很方便的看到文件当前的权限配置:

值得注意的是,第一个字符代表的是“目录”的类型,有如下三种形式:

  • d: 目录
  • l: 符号链接
  • -: 非目录(一般来说就是文件)
普通目录和符号链接
普通目录和符号链接

而之后的 9 个字符,则代表了三种不同用户对该文件/目录的权限。2-4 位是当前用户(user,简写为 u)的权限,5-7 位是当前用户组(group,简写为 g) 的权限,而 8-10 位则是其他用户(all,简写为 a)的权限。

权限的概念对于文件和目录而已也不尽相同。对文件而已,r 就是读取,w 就是写入,x 就是执行;而对目录而言,r 是允许读取目录及子目录中的内容,w 是允许向目录和子目录中写入,而 x 则是允许进入该目录。


现在我们知道了权限的字面表达方式,接下来就是修改了。

看了上文如果没看到 chmod 我也是没什么好说的了

chmod 命令提供了三种修改权限的方式,其按照字符划分如下:

  • +: 增加权限,使用方式为 chmod [用户组简写]+[权限] [文件],如 chmod u+x ./run.sh
  • -: 取消权限,使用方式为 chmod [用户组简写]-[权限] [文件],如 chmod -x ./run.sh(这里省略了 u)
  • =: 设置权限,即覆盖当前权限设置,使用方式为 chmod [用户组简写]=[权限] 文件,如 chmod u=rwx ./run.sh
  • 以上三者可以同时使用,通过逗号连接。这里用原书中的例子好了:chmod o+wx,u-x,g=r-x testfile

按照上文描述的方式,我们可以很方便(?)直观(!)地修改文件和目录的权限。

等等,方便?你不觉得这么长一段很费事吗?

有吗?zsh + history 它不香吗(

于是,就有了数字表示法。其实数字表示法和上文的表示方法有简单的一一对应关系,而这种表示的本质——将其加和,实际上就是位运算:

  • 0: -
  • 1: x
  • 2: w
  • 4: r

于是我们就知道了,700 代表的实际上是 u=rwx,g=---,a=---,而 600 则是 u=rw-


回到最开始的问题:为什么 sshd 要求我们的 authorized_keys 必须为 600 权限呢?

等等,开头有这个问题吗

我的猜想是这样的:密钥,就算是公钥,也不应该被其他未经许可的用户读取(当然 root 除外);而公钥也是不需要执行的。由此,我们便需要将 ga 的权限全部取消,并且设置当前用户 u 也只能 rw。而对于 sshd 而言,通常是以 root 权限运行的(观察 /etc/systemd/system/multi-user.target.wants/ssh.service,可以发现其并没有规定用户,而不规定用户的情况下默认即为 root),因此可以直接读取内容。

当然了,这只是我的猜测。由于本人 C 语言8行,没在源码里找到佐证。

ま、それでは(