为什么 `ssh -p` 是小写,`scp -P` 却是大写?
为什么 ssh -p 是小写,scp -P 却是大写?
用 Linux 的人多半都遇到过这么个小别扭:把 SSH 端口从 22 改掉之后,ssh -p 2222 用得好好的,换成 scp 传文件,顺手敲 scp -p 2222 却报错——这里得用大写的 -P。
一切要从一个比 SSH 还老的工具说起
答案的关键其实不在 SSH,而在一个更早的工具身上。
上世纪 80 年代初的 BSD Unix 里,已经有了一整套"r 系列"远程命令:rlogin(远程登录)、rsh(远程执行)、rcp(远程拷贝)。它们明文传输、设计简单,在那个内网基本互信的年代够用了。
其中和我们今天这个问题直接相关的是 rcp(Remote Copy)。它有个挺常用的选项:
rcp -p file remote:/path # -p = preserve,拷贝时保留文件的时间戳和权限
记住这个 -p = preserve 的设定就好。它本身平平无奇,但正是它,在十几年后让 scp 的端口参数不得不"挪个位置"——我们要找的答案,其实就藏在这个不起眼的小选项里。
SSH 出场:端口顺手就拿到了小写 p
1995 年,芬兰赫尔辛基理工大学的研究员 Tatu Ylönen 发现校园网里有人在嗅探密码。当时 telnet、rlogin 这些工具全是明文传输,密码等于在网上裸奔。于是他写了 SSH(Secure Shell),目标就是加密替代 telnet 和 r 系列命令。
(顺带一提,SSH 默认的 22 端口也是他挑的:telnet 是 23,ftp 是 21,他觉得夹在中间的 22 好记,就向 IANA 申请了下来。)
对 ssh 这个客户端来说,指定端口用哪个字母?当时小写 p 空着,没有任何冲突,于是很自然地:
ssh -p 2222 user@host # -p = port
这里没有任何别扭。ssh -p 一直都清清爽爽。麻烦要等它的兄弟出生才出现。
scp 出生时,小写 p 已经被占了
SSH 火起来后,大家自然想要一个"加密版的文件拷贝",于是 scp(Secure Copy) 出现了。
关键在于:scp 不是从零写的,它继承了 rcp 的代码框架和命令行习惯,本质上就是"跑在 SSH 加密通道上的 rcp"。
于是就回到了开头那个设定。在 rcp 的世界里,小写 -p 早就是 preserve 了。scp 为了和老祖宗保持兼容(别让老用户的脚本和习惯失效),把这个含义原样保留了下来:
scp -p file user@host:/path # -p = preserve,继承自 rcp
这么一来,当 scp 也需要一个"指定端口"的选项时,小写 p 这个最顺手的位置已经没了。于是端口就落到了大写的 -P 上:
scp -P 2222 file user@host:/path # -P = Port,因为小写 p 让给了 preserve
这事没什么玄机,scp 的官方手册自己就写了一行注释解释:
这个选项写成大写的 ‘P’,是因为小写 ‘-p’ 已经在 rcp 里被保留用于保存文件的时间和权限了。
说到底就这么回事:不是 ssh 谦让,也不是谁比谁重要,而是 scp 一出生就沿用了 rcp 的习惯,小写 p 的坑早被占了,端口只能往大写 P 挪一格。
sftp 也跟着大写了
后来的 sftp(SSH File Transfer Protocol)作为文件传输工具,同样有"保留属性"和"指定端口"两种需求,于是跟着 scp 的约定走,端口也用大写 -P。
到这儿就能总结出一个还算好记的规律:
- 登录类工具(ssh):端口是小写
-p。 - 文件传输类工具(scp / sftp):端口是大写
-P,因为小写-p要留给"保留文件属性"。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)