介绍
简介
1964年,美国国防部委托麻省理工学院(MIT)开发一个支持共享计算资源和信息处理的系统,于是,麻省理工学院(MIT)联合贝尔实验室(Bell Labs)、通用电气(GE)共同启动Multics(Multiplexed Information and Computing Service,多路复用信息与计算服务)项目。该项目旨在研发一个革命性的多用户操作系统,项目首次提出了分时操作、虚拟内存、模块化内核设计、层级文件系统以及用户权限控制等创新技术,这些技术后来影响了几乎所有后续操作系统的设计理念。然而,Multics 项目的目标过于宏大,系统架构极其复杂,导致研发过程困难重重,进度缓慢。
随着 Multics 项目的缓慢推进,贝尔实验室的研究人员开始意识到该系统过于复杂,且维护成本高昂,最终决定退出 Multics 项目。曾参与 Multics 项目的肯·汤普森 (Ken Thompson)、丹尼斯·里奇 (Dennis Ritchie) 等人决定在一个规模较小的新项目中重新开发一个操作系统。1969 年,汤普森和里奇在缺乏完整文档支持的情况下,凭借出色的编程技巧和对计算机科学的热爱,成功开发出了 Unix 系统。该操作系统最初使用汇编语言和 B 语言编写,并迅速在贝尔实验室内部流行起来。1972 年,贝尔实验室的丹尼斯·里奇基于 B 语言设计了 C 语言,C 语言不仅保留了 BCPL 和 B 语言的优点,还克服了它们无数据类型等缺点,简练且接近硬件。1973 年,汤普森和里奇使用 C 语言重写了 UNIX 第四版操作系统,极大提升了其可移植性,加上 Unix 系统本身简洁和模块化设计等优点,使其迅速在学术界和工业界传播开来。
在 Unix 的早期发展阶段,贝尔实验室的母公司 AT&T 以低廉甚至免费的许可将 Unix 源码授权给学术机构用于研究和教学。许多机构在此基础上对源码进行了扩充和改进,形成了各种“Unix 变种”,其中最著名的是由加州大学伯克利分校开发的 BSD Unix。BSD Unix 在 Unix 的历史发展中具有重大影响力,被许多商业厂商采用,并成为众多商用 Unix 系统的基础。到了 1990 年代,Unix 和类 Unix 系统越来越受欢迎,成为几乎所有超级计算机的首选操作系统。2000年,苹果公司发布了Darwin系统,这也是一个 Unix 系统,Darwin后来成为了 Mac OS X 操作系统的核心。
随着 Unix 的广泛应用和影响力不断扩大,AT&T公司逐渐意识到了 Unix 的商业价值,开始停止向学术机构授权Unix源码,并对之前的 Unix 及其变种声明了版权。这引发了一系列版权争议和诉讼,其中包括与加州大学伯克利分校之间关于 BSD Unix的版权纠纷。AT&T公司的这种行为引起了许多开发者和用户的不满,1983年,麻省理工学院人工智能实验室的计算机科学家Richard Stallman公布了一项计划,该计划旨在发展出一套完整的开放源代码操作系统来替代Unix,他给该计划起名为GNU(GNU’s Not Unix),以此讽刺GNU不会像unix一样成为一个垄断的专有技术。Richard Stallman认为,软件应当像科学知识一样,能够被自由地分享、修改和传播。为了实现这个宏伟的目标,Stallman 于1985年成立了自由软件基金会 (FSF),为GNU计划提供技术、法律以及财政支持。1989年,Stallman起草了 GNU 通用公共许可证(GPL),这是一种确保软件和其衍生作品永远保持自由的法律工具。在GNU计划的支持下,许多著名的工具和软件组件陆续被开发出来,如GNU编译器(GCC)、GNU Emacs编辑器、GNU C库(glibc)等。然而,尽管这些系统组件逐渐完善,GNU计划仍缺少一个关键的部分——内核。
Unix的限制使用也为当时操作系统的学习和教学带来了许多困难。1987年,阿姆斯特丹自由大学的教授Andrew S. Tanenbaum为了方便教学,借鉴Unix的设计模式开发出了Minix操作系统,这是一个专为教学设计的类Unix操作系统,主要是作为计算机专业学生的学习工具。命运的齿轮开始转动,1991年,一位名为Linus Torvalds的芬兰学生在大学里学习操作系统课程,并接触到了Minix。他对操作系统的原理产生了浓厚的兴趣,Linus发现Minix有一些漏洞和缺陷,于是,他决定自己编写一个类似的操作系统。1991年9月,Linus发布了他的第一个操作系统内核并取名为Linux,并邀请其他程序员对Linux进行测试和改进,Linux最初的版本仅有几千行代码,但随着世界各地开发者的加入,Linux 逐渐成为了一个功能强大的、开源的操作系统内核。开源社区的蓬勃发展成为了连接Linux内核和GNU组件的纽带,社区的开发者们发现,GNU社区拥有功能强大的工具,但缺少一个内核,Linux内核正是GNU计划所缺少的一环。社区的开发者们将 Linux 内核与 GNU和其他项目提供的系统组件整合在一起,形成了一个完整的操作系统——GNU/Linux。
常见的发行版
- Debian:一个完全由社区驱动的Linux发行版,由全球的开发者协作开发,以较长的稳定支持和保守的软件更新策略著称。Debian支持x86、arm、mips、ppc等多种架构,使用APT和dpkg作为软件包管理工具,提供大量开源免费的软件包,是许多其他发行版(如 Ubuntu)的基础
- Ubuntu:一款基于Debian的桌面发行版,由Canonical公司开发并提供技术支持。Ubuntu本身开源免费,且拥有庞大的自由软件社区支持,此外Canonical公司也提供付费的商业支持
- RHEL:全称“Red Hat Enterprise Linux”,是Red Hat公司专门为企业设计的商业版Linux
- Fedora:一款由Fedora项目社区开发维护的开源自由的操作系统,提供桌面版、服务器版、物联网专用等版本,该社区由 Red Hat公司赞助,因此也通常被用作测试RHEL新功能的实验平台
- CentOS:一个开源免费的Linux发行版,基于Red Hat公司的RHEL源代码构建,但去除了RHEL的品牌标识和付费的专有软件,并交由CentOS社区提供支持。但从2020年底开始,CentOS项目开始以CentOS Stream作为主要开发分支,而CentOS Stream本身更多是为 RHEL 提供测试和创新平台,因此不再适合作为生产环境的操作系统使用,其最后一个稳定版本CentOS 8已于2021年底失去了官方支持
- Arch Linux:一个由社区驱动开源高度可定制的操作系统,以其简洁、轻量和高度可定制而著称。Arch Linux只提供最小化的基础系统,默认不会安装多余的软件,用户需要自行手动分区、配置网络、安装引导程序、选择安装和配置软件,因此Arch Linux更适合有一定Linux经验的高级用户和开发者使用。Arch Linux默认使用pacman作为软件包管理器
- open SUSE:由德国的SuSE Linux AG公司发行维护的开源免费的Linux发行版,提供openSUSE Leap和openSUSE Tumbleweed两个版本。openSUSE Leap是基于 SUSE Linux Enterprise(SLE)的稳定版本,适合生产环境和需要高稳定性的用户。openSUSE Tumbleweed是滚动发布的版本,适合喜欢尝试新技术的用户。此外,SUSE公司还提供企业版的付费系统——SUSE Linux Enterprise(SLE)。由于openSUSE 提供了一流的桌面体验,因此桌面版openSUSE也十分流行,openSUSE 默认使用 Btrfs 文件系统和Zypper 作为其包管理器
- Kali Linux:一款基于Debian的Linux发行版,由Offensive Security公司开发和维护。Kali Linux使用了一个定制的Linux内核,支持更多的无线设备并内置了数百种安全工具,涵盖渗透测试的各个领域,包括信息收集、漏洞分析、无线攻击、网络渗透、密码破解、数字取证和逆向工程等,是一个专门为信息安全专业人员设计的用于渗透测试和网络安全评估的操作系统
Linux命令
Linux命令格式
大部分Linux发行版默认使用Bash(GNU Bourne-Again Shell)作为命令解释器,可以通过上下方向键来调取之前执行过的Linux命令,可以使用Tab键来补全命令、参数或文件名。常见的Linux命令的格式为:
命令 [选项] [参数]
- 有命令中多个短选项时,可以写在一起,如:ls -alhF
- 选项可以用长格式(完整的选项名)并使用”--“作为前缀,也可以用短格式(单个字母的缩写)使用”-“作为前缀。如:--help和 -h,都表示获取命令帮助,但在一些命令中,这一对短格式和长格式表示的不是同一个参数,如:shutdown --help表示获取shutdown命令的帮助信息,shutdown -h则为系统关机命令,这里的-h表示halt而非help,这需要参考每个命令的文档
- Linux命令使用--作为选项和参数的分隔符,--除了作为长选项的前导符,它在单独使用时也是选项和参数的分隔符,命令行中--后的参数将作为命令的操作数而不是命令选项,即便之后的参数带着-或--
- 在很多shell中,如果命令在一行内写不下,可以使用延续字符\在下一行中继续输入命令(该字符由shell定义,不是Linux系统本身提供的)
命令类型
Linux中使用的命令主要分为以下几种类型:
shell内建命令:由shell程序提供,这些命令已经和shell编译成了一体,在执行时速度更快,消耗的资源更少。常见的内建命令有cd、echo、pwd、history、alias、continue、exit、jobs、kill等
可执行文件命令:由软件包提供,这些命令是系统中的可执行文件,通常位于/bin、/sbin、/usr/bin、/usr/sbin目录下,每次执行这些命令时,系统都会启动一个新的进程来运行对应的程序。常见的软件包有:
- coreutils(GNU Core Utilities)包:由GNU社区开发和维护,是 Linux 系统中的最基础的工具包,提供了大量常用的可执行文件命令,如:ls、cp、mv、rm、cat、echo、chmod、chown、date、df、du、ln、mkdir、touch、uname 等
- util-linux包:由Linux内核社区负责开发和维护,提供一些常见的系统管理命令,如:mount、kill、date、su、getopt、more等
- inetutils包:由GNU社区维护,提供了基本的网络工具,如:ping、hostname、ftp、telnet等
- net-tools包:托管于GitHub,由其团队维护,提供了提供了基础的网络配置和监控工具,如:ifconfig、netstat、route、arp等
- findutils包:由GNU社区维护,提供一些文件查找和操作工具,如find、locate、xargs等
- procps包:托管于GitHub,由其社区维护,提供系统进程和资源管理工具,如:ps、top、vmstat、killall、free等
- shadow-utils包:托管于GitHub,由其团队维护,提供用户和密码管理工具,如:useradd、passwd、chage等
- 独立的软件包:一些大型功能是独立的软件包提供的,由其独立的社区或团队开发或维护,如:vim(vim社区)、sed(GNU社区)、awk(GNU社区)、grep(GNU社区)、sudo(sudo社区)、yum(Red Hat 社区)、systemd(Red Hat社区)、wget(GNU社区)、curl(curl社区)
脚本命令:通常由用户的shell脚本,python脚本来提供,Linux系统也提供了一些服务管理脚本,如/etc/init.d目录下的脚本
查找命令来源
查找命令来源通常可以使用以下几种方法:
- 使用type命令:type命令是shell内建命令,它可以用来查询某个命令是来源于shell内部,还是来源于外部的二进制文件,type命令用法参考shell内建命令
- 使用--version选项:该选项用来查看命令的版本号,通常也会同时返回命令所属包的版本号
- 使用dpkg或yum包管理器查询
查找命令路径
- which 命令 查找命令所在路径,同时可以查看命令的别名
- whereis 命令 查找命令所在路径,同时可以查看命令帮助文档所在路径
- type -P 命令 查找命令所在路径(详见shell内建命令),由于type命令是bash内建命令,因此比上述两个命令快,且兼容性更好,常用来在shell脚本中查找命令路径
退出状态码
绝大多数命令命令在执行完毕或执行失败时都会返回一个退出状态码(exit status),通常情况下,退出状态码为0表示命令成功执行,执行失败则会返回一个非零值,这个状态码可以在命令退出后使用$?查看,注意,$?永远只会保留上一个命令退出时的状态码
coreutils包命令的通用选项
文件的备份
mv、cp、install、ln等命令将旧文件移动、复制、重命名到新位置时,如果该位置已经有了一个同名文件,这些命令通常会直接覆盖该文件(且没有任何提示),这可能造成数据丢失,因此这些命令提供了一些通用的备份选项:
- -b 如果有同名文件,则为该同名文件进行备份,该选项等价于--backup=existing,因此文件的备份名参考--backup选项的existing值说明
- --backup=值 该选项是-b选项的完整名称,但-b选项不接受参数,该选项接受参数,参数值可以为:
- none或off: 不进行备份(默认)
- numbered或t: 备份为编号形式,备份后文件名为:file.txt~1~(第一次备份)、file.txt~2~ (第二次备份),该选项适用于希望保留所有历史版本备份的情况
- existing或nil: 如果检测到文件备份已经存在且格式为编号形式(如:file.txt.~1~),则继续使用编号形式创建新的备份(新的备份文件将命名为file.txt.~2~);如果没有编号备份,则使用simple选项的备份方式
- simple或never: 进行简单备份,备份文件名为:file.txt~,由于该选项每次生成的备份文件名都为file.txt~,因此它只会保留最后一次备份的文件
- -S “字符串”:指定备份文件的文件名后缀,如果未指定此选项,则使用SIMPLE_BACKUP_SUFFIX环境变量的值。如果未设置 SIMPLE_BACKUP_SUFFIX,则默认值使用~作为后缀名
存储单位规范
1kB表示 1 kilobyte,即 1 kB = 1000 Bytes
1KiB表示 1 kibibyte,即 1 KiB = 1024 Bytes,POSIX标准还使用k(或K)来表示KiB,因此有以下等式:
其余单位M、G、T、P、E、Z、Y、R、Q以此推算
被禁止的高危操作
rm、chgrp、chmod、chown等命令通常默认启用--preserve-root选项,即便在root权限下,这些命令也会拒绝对解析为根目录/的参数进行操作,以保护系统防止意外操作
系统启动与关闭
系统运行级别
Linux系统的开机过程流程为:加载BIOS,进入Boot Loader,加载系统内核,进行内核初始化,启动初始化进程init。
可以使用init 运行级别在系统运行级别之间切换,使用runlevel查询当前运行级别。
运行级别(runlevel) | 说明 |
---|---|
0 | 系统关机,禁止设置为系统默认运行级别 |
1 | 单用户状态,只启动系统核心,用于系统修复和维护 |
2 | 多用户状态,禁用NFS(网络文件系统)和网络服务,可用于停机维护 |
3 | 完全多用户状态,具有完整的功能 |
4 | 系统未使用,保留 |
5 | GUI模式,桌面版Linux专属 |
6 | 系统重启,禁止设置为系统默认运行级别 |
emergency | 用于系统救援 |
在路径/etc/rc.d下存放有7个对应系统运行级别的目录/rc0.d——rc6.d,目录中列出了该运行级别下会启动/关闭的服务,init.d目录下存放有用户可以开机启动的脚本,对于以K(Kill)开头的文件,系统会关闭对应的服务,以S(Start)开头的文件,系统将启动对应的服务,并且启动/关闭次序为S/K之后的值。rc.local文件用于配置用户开机执行的命令,系统在启动后将自动执行该文件中的所有命令。
在一些旧版本的Linux中,/etc/rc.d路径下还含有/etc/inittab文件,文件中可以设置系统默认运行级别。centos7之后的系统将不再支持该方式修改默认级别,而使用target替代了sysvinit的运行级。
Sys v init runlevel | systemd target |
---|---|
0 | poweroff.target |
1 | rescue.target |
2 | multi-user.target |
3 | multi-user.target |
4 | multi-user.target |
5 | graphical.target |
6 | reboot.target |
emergency | emergency.target |
Linux的关闭与重启
1. sync 保存数据
sync 将内存数据存储到磁盘,关机或重启Linux前应当执行该命令防止数据丢失
sync [选项] [文件名]
- 如果不指定任何参数和选项,命令会将所有挂载文件系统中内存缓冲区的数据同步到磁盘
- -d 只同步该文件数据,而不刷新文件的元数据(例如文件权限、所有者、时间戳等)
- -f 将包含该文件的整个文件系统同步到磁盘,而不仅仅是该文件的数据部分
2.shutdown 命令(推荐使用)
shutdown命令用于关闭/重启Linux,命令格式为
shutdown [选项] [时间] [警告消息]
常用选项- -t 值 设置在几秒后关机
- -h 关机
- -r 重启
- -c 取消已经设置的关机/重启命令
- - m 强制杀死所有执行中的程序,然后关机(不调用init进程)
- -k 不关机,仅把警告讯息传送给所有登录的用户
- -f 强制略过fsck磁盘检测(unbuntu独有参数)
- -F 强制进行fsck磁盘检测(unbuntu独有参数)
- -w 测试使用,系统不会重启,但会把重新开机的数据写入/var/log目录下的wtmp记录文件
- -H 或 --halt 相当于halt
- -P 或 --poweroff 相当于poweroff
- --no-wall 系统在重启、关闭时不发送信息给登录的用户
3.halt 关机
halt [选项]
可选选项
- -d 不把关机记录写到 /var/log/wtmp 文件里
- -n 关机前不保存数据到硬盘(包括不把记录写到 /var/log/wtmp 文件里)
- -w 不会真的关机,只是把关机记录写到 /var/log/wtmp 文件里
- -f 强制关机,不调用shutdown命令
- -i 关机前关闭所有网络接口
- -p 关机后关闭电源(poweroff)
4.reboot 重启
reboot [选项]
可选选项
- -d 不把重启记录写到 /var/log/wtmp 文件里
- -n 重启前不保存数据到硬盘(包括不把记录写到 /var/log/wtmp 文件里)
- -w 不会真的重启,只是把重启记录写到 /var/log/wtmp 文件里
- -f 强制重启,不调用shutdown命令
- -i 重启前关闭所有网络接口
5.poweroff 关机并切断电源
poweroff [选项]
可选选项
- -d 不把关机记录写到 /var/log/wtmp 文件里
- -n 关机前不保存数据到硬盘(包括不把记录写到 /var/log/wtmp 文件里)
- -w 不会真的关机,只是把关闭记录写到 /var/log/wtmp 文件里
- -f 强制关闭
- -i 关机前关闭所有网络接口
- -h 关机前将系统中所有的硬件设置为备用模式除了上述命令,还可以通过设置系统运行级别进行关机、重启。使用 init 0 关机,使用init 6 重启。
系统设置
arch查看系统架构
arch 查看系统架构
64位Linux通常为x86_64架构,32位Linux通常为i686,在某些系统上,arch 命令可能是 uname -m 的别名
uname查看系统信息
uname [选项]
- -a 查看系统所有信息,输出的信息依次为:内核名(-s)、主机名(-n)、内核版本(-r)、内核发行日期(-v)、硬件架构名(-m)、处理器信息(-p)、硬件平台名称(-i)、操作系统名称(-o)
- -i 查看硬件平台名称,如:x86_64、PC等,某些系统可能还返回硬件平台类型,如:generic(常规硬件平台)、PC(PC硬件)
- -p 查看处理器信息,如:x86_64、Intel、AMD等,某些系统还可能返回CPU的厂商信息、处理器家族等
- -m 查看系统硬件架构,如:x86_64、i686、arm64等
- -n 查看主机在当前网络中的主机名,如:VM-0-4-ubuntu
- -s 查看系统内核名称,通常是Linux
- -o 查看操作系统名称,如:GNU/Linux
- -r 查看系统内核版本号,如:6.8.0-40-generic
- -v 查看系统内核的发行编号、发行时间等,如:#40-Ubuntu SMP PREEMPT_DYNAMIC Fri Jul 5 10:34:03 UTC 2024
dmesg查看开机时检测的系统内核信息
dmesg
用于显示系统内核的环形缓冲区(ring buffer)中的消息。它提供了关于系统启动过程、硬件设备驱动程序、内核模块加载以及系统错误等重要信息,包括非常详细的CPU(如型号、主频、核心数….)、网卡、硬盘等主机开机检测的信息,一般通过管道符只查看某部分具体信息,如: dmesg | grep CPU 查看CPU详细信息
查看CPU信息
开机检测后,检测到的信息会按格式写于/proc/cpuinfo文件中,通过该文件查看CPU信息更为清晰
nproc查看可用处理器的数量
nproc [选项]
- 默认打印可用的处理器数量
- --all 打印系统上所有已安装的处理器数量,部分处理器可能已安装但不可用
查看当前Linux操作系统的发行版本
使用cat命令查看 /etc/system-release或 /etc/os-release文件即可,redHat系列操作系统可以查看/etc/redhat-release(红帽专属)文件
hostname查看或设置系统名称
hostname [系统名]
- 默认情况下打印当前系统名,通常可能为uname -n的输出值
- 可以指定一个字符串,将当前主机系统名称修改为指定名字,这需要适当权限
hostid查看主机的数字标识
hostid
以十六进制形式打印当前主机的数字标识,此命令不接受任何参数
arp查看与修改arp缓存
ARP 缓存保存着 IP 地址与对应的物理 MAC 地址之间的映射关系,用于网络通信时将 IP 地址解析为 MAC 地址
arp [选项]
- -a 查看系统中所有缓存的 IP 地址和 MAC 地址的映射
- -s IP地址 MAC地址:添加一个IP地址到MAC地址的映射到 ARP 表
- -d IP地址:从 ARP 表中删除指定的 IP 地址条目
- -i 接口:如果系统有多个网络接口,指定接口
uptime查看系统已运行时间和负载
uptime
打印系统当前时间、系统的正常运行时间、登录用户数和系统在过去 1 分钟、5 分钟和 15 分钟内的平均负载,这些信息也是top命令的首行输出信息
last 查看用户登录系统时间与系统重启时间
last
列出目前与过去所有登入过系统的用户信息,并列出了系统何时重启过
lastlog
列出用户上次登录系统的时间(包括系统用户)lastlog -u UID
仅列出指定用户上次登录系统的时间tty终端设备
tty这一名称源自早期的电传打字机(Teletypewriter),它是一种用于与计算机交互的硬件设备。现代的tty通常指的是终端设备的抽象,这些设备可以是物理终端、虚拟终端或串口设备。这些设备直接与输入(如键盘)和输出(如显示器)相关联,为用户提供与计算机交互的输入输出接口。当用户从键盘输入命令时,输入由TTY设备接收,然后交由shell执行,shell执行完毕后,同样将先命令执行结果输出给TTY设备,再由TTY设备发送到显示器。
tty设备挂载路径通常位于/dev目录下,如/dev/tty1,/dev/tty2… 代表不同的虚拟控制台。用户可以通过 Ctrl + Alt + F1 到 Ctrl + Alt + F7 以切换不同的虚拟终端
/dev/pts/目录下的设备文件表示伪终端(pseudo-terminal),如:/dev/pts/0,通常用于SSH、图形终端模拟器等。在使用 Xshell 等终端模拟器远程连接Linux时,远程服务器会为本次会话分配一个伪终端(如:/dev/pts/0),SSH服务会将终端模拟器映射到所分配的伪终端上,然后交由用户进行后续操作。
tty查看终端设备的文件名
tty [选项]
- 查看连接到standard input的终端的文件名
- -s 检查当前终端是否连接到一个有效的终端设备,不打印任何内容,返回exit状态码,0表示当前为标准输入(stdin)是一个终端,1表示当前输入不是一个终端(可能被重定向,或者通过管道输入),2表示命令中使用了无效参数,3表示写入错误
stty修改终端设置
1.查看当前stty终端设置
stty [选项]
- -a 查看当前终端所有设置和状态,包括终端的波特率,终端窗口每页支持的最大行数和最大列数,快捷键、各项输入输出设置的值
- -F 终端设备文件:查看指定终端的设置,而不是当前终端的设置
- -g (--save) 输出保存当前设置
2.修改stty终端设置
这些设置只在本次会话有效
stty [选项] [设置值]
- -F 终端设备文件:修改指定终端的设置,而不是当前终端的设置
- 如果终端异常,可以通过stty sane来恢复默认的终端设置
- 以下设置值支持在前面添加-来关闭该设置
值 | 说明 |
---|---|
echo | 开启回显;-echo会禁用回显,输入字符不显示,常用于密码输入 |
cread | 允许接受输入;-cread会禁用输入,这会导致tty终端无法接收任何键盘输入,如果是虚拟终端,可以关闭当前会话重置设置,如果是物理终端,执行前请确认其他方式能够访问该终端 |
ignbrk | 忽略换行符 |
inlcr | 将换行符替换为回车 |
igncr | 忽略回车 |
iutf8 | 假设输入字符采用 UTF-8 编码 |
iuclc | 将输入的大写字符转换为小写 |
olcuc | 将输出的小写字符转换为大写 |
flusho | 丢弃输出 |
3.修改stty快捷键
可以通过stty 控制字符 快捷键命令更改命令快捷键,stty -a可以查看当前的终端设置,里面包含了当前的快捷键设置
控制字符 | 说明 | 命令示例 |
---|---|---|
intr | 中断字符,通常是 Ctrl+C | stty intr ^C |
quit | 退出字符,通常是 Ctrl+\ | stty quit ^\ |
erase | 删除字符,通常是 Backspace | stty erase ^H |
kill | 行删除字符,通常是 Ctrl+U | stty kill ^U |
eof | 文件结束字符,通常是 Ctrl+D | stty eof ^D |
susp | 暂停字符,通常是 Ctrl+Z | stty susp ^Z |
start | 启动字符,通常是 Ctrl+Q | stty start ^Q |
stop | 停止字符,通常是 Ctrl+S | stty stop ^S |
lnext | 直接发送字符,通常是 Ctrl+V | stty lnext ^V |
werase | 单词删除字符 | stty werase ^W |
locale区域设置
locale用于定义系统的区域设置,修改系统语言、日期与时间显示格式、字符串排序顺序、货币表示格式、地址(国家、城市、街道等)表示格式、度量衡单位(如使用公制还是英制单位)、名字格式(先名还是先姓)等系统设置,方便系统能够根据用户所处地区和语言习惯对以上信息进行调整
locale命令
locale [区域环境变量名]
- 默认情况下,该命令会输出系统当前所有区域相关的环境变量和值
- 指定一个环境变量用于输出该变量的值
- -a 列出系统当前支持的所有语言区域
- -m 列出系统当前支持的所有字符编码映射,如:ANSI_X3.4-1968(ASCII字符集)、UTF-8(最常用Unicode字符集)
- -c 在指定了区域环境变量时,用于在输出前打印该区域环境变量名
- -k 在指定了区域环境变量时,用于显示所指定区域环境变量生效的内容和这些内容的关键字
常见的Locale变量
Locale变量曾经是C语言中定义的宏,后来被继承到了Linux中。以下变量中,LANG变量的值可以被其他变量继承,因此一般情况下,Linux中的以下变量很多都没有为其设置一个单独的值,而是让其从LANG变量继承,因此很多变量并使用echo语句是获取不到变量值的,只能使用locale命令隐式地获取到。如果这些变量被指定了一个值,那么这个值会覆盖从LANG变量继承而来的值。以下各变量的优先级:LC_ALL>LC_*>LANG
变量名 | 说明 |
---|---|
LANG | 指定系统的默认语言和区域设置,如果其他变量没有设置值时,则使用该值作为默认值,它的值优先级也是最低的 |
LC_ALL | 用来覆盖所有其他LC_*变量,强制使用特定的locale设置,该变量值优先级最高,但一般为空 |
LC_CTYPE | 定义字符处理,如字符分类和字符转换 |
LC_NUMERIC | 定义数字表示方式(小数点、千位分隔符等) |
LC_TIME | 定义日期和时间格式 |
LC_COLLATE | 定义字符串的比较和排序规则 |
LC_MONETARY | 定义货币符号和格式 |
LC_MESSAGES | 定义系统消息的语言和格式,如输出系统提示信息、错误信息所使用的语言 |
LC_PAPER | 定义默认纸张大小尺寸,在打印时有用 |
LC_NAME | 定义姓名的书写格式 |
LC_ADDRESS | 定义地址书写格式 |
LC_TELEPHONE | 定义电话号码书写格式 |
LC_MEASUREMENT | 定义度量衡表达方式 |
LC_IDENTIFICATION | 对locale自身信息的概述 |
locale变量的值一般由三部分组成,修正值极少用,书写规则为:
语言[_地区][.字符集编码][@修正值]
- 语言使用两个小写字母表示,如:en(英语)、zh(中文)、fr(法语)、de(德语)
- 地区为可选项,由两个大写字母表示,如:CN(中国)、US(美国)、GB(英国)、FR(法国)
- 字符集编码为可选项,常见的有:UTF-8(多语言字符编码)、GB2312(国标简体中文编码)、ISO-8859-1(西欧常用的一种字符编码)
- 修正值为可选项,用来进一步指定某些特殊变体,如:@latin表示使用拉丁字母的变体
添加区域支持
部分系统默认启用生效的区域可能只有en_US.UTF-8(可以通过locale -a命令查看),用户可以手动启用zh_CN.UTF-8等区域设置。
文件/usr/share/i18n/SUPPORTED列出了系统当前支持的所有区域,但这些区域可能尚未启用,用户可以修改/etc/locale.gen文件,去除所要启用区域前的注释符,使该区域生效,然后执行locale-gen命令,系统会根据locale.gen文件启用的值在/usr/lib/locale目录下生成二进制文件locale-archive,该文件包含了所有当前已经启用区域的本地化数据。
date时间与日期
关于时间的常见概念
秒的定义:1967年,国际度量衡大会将铯-133原子跃迁9,192,631,770 次所需要的时间定义为1秒,铯原子钟有极好的稳定性,它能保证运行大约3170万年才产生一秒的误差
国际原子时(TAI):TAI全称为Temps Atomique International,是全球统一的原子时间标准,由国际计量局(BIPM)收集多个原子钟的时间数据平均得出
地球自转时间(UT1):基于地球自转的时间标准,用于反映地球自转的实际时间。UT1的测量是通过观测宇宙中遥远的“类星体”来完成的,这些观测帮助科学家监测地球自转的速度。但由于地球的自转速度并不完全均匀,会受潮汐、地球内部变化等因素的影响,因此UT1的时间长度会有微小的变化,UT1时间一天的实际长度可能稍长或稍短于24小时
格林尼治时间(GMT):旧译格林威治标准时间,格林尼治标准时间的正午是指当太阳横穿本初子午线的时间,由英国伦敦郊区的皇家格林尼治天文台根据地球自转测量给出。由于地球每天的自转是不规则的,而且正在缓慢减速。所以,格林尼治时间已经不再被作为标准时间使用,而是转而使用协调世界时(UTC)作为标准时间。
协调世界时(UTC):UTC全称为Coordinated Universal Time,是国际公认的世界标准时间,世界各地的时区都是基于 UTC 设定的,如:北京时间是 UTC+8,表示比UTC早8个小时。UTC时间是在TAI基础上修正计算得出的,从而保证了时间的精准性。TAI是一种稳定的时间尺度,严格定义的24小时等于永恒精确的24小时。然而,人类的生产活动基于地球的昼夜周期的,需要依赖地球的自转、光照等因素,人类所依赖的天文时间(略长或略短于24小时)与TAI时间之间有微小的差值,如果直接使用TAI时间,随着时间的推移,UT1和TAI之间的差值会越来越大,日出和日落的时刻会逐渐与人们的日常时间表不一致。为了既保证时间的精确性,又能满足人类生产需要,国际计量局(BIPM)和国际电信联盟(ITU)会根据地球自转的实际情况,结合国际地球自转服务组织(IERS)发布的结果,在TAI的基础上增加或删除闰秒,以此计算出UTC时间,作为全球统一的世界标准时间,使得原子时(TAI)和地球自转时间(UT1)之间的差值保持在0.9秒以内。
闰秒:一个用于协调国际原子时(TAI)和世界时(UT1)的调整措施,闰秒的使用由国际地球自转服务组织(IERS)负责,他们监测地球自转速率与原子时间的差异,并在必要时宣布闰秒的插入或删除。BIPM通过收集和处理全球多个国家的原子钟数据来计算TAI,然后根据IERS发布的闰秒决定调整UTC,当 UT1 慢于 原定的UTC 时,需要在 UTC 时间系统中增加一秒,通常,这个额外的秒数会在6月30日或12月31日的最后一秒加上,此时,秒数会从00-59变成00-60,闰秒的插入可能会让一些默认每分钟60秒的程序出现故障,而一些程序会对其做特殊处理。因此,一些文档中关于秒的计量范围可能为00-59,而一些文档可能为00-60用来处理闰秒(如:GNU社区的date命令文档)
北京时间(CST):又称中国标准时间(China Standard Time),由位于陕西省渭南市蒲城县的中国科学院国家授时中心发播,因此北京时间并不是北京当地的时间,而是东经120°的地方时间
Unix时间戳(POSIX 时间戳):是指自协调世界时(UTC)1970年1月1日00:00:00以来的秒数(不包括闰秒),在Java等编程语言中,时间戳的单位可能是毫秒
公元(AD):AD是Anno Domini的缩写,意为”主的年份”。公元纪年系统由6世纪的斯基泰僧侣狄奥尼修斯·埃克西古斯(Dionysius Exiguus)创建,他被基督教教会委托确定复活节的日期,以替代当时常用的以罗马皇帝迪奥克莱先为基准的纪年系统。基督教使用耶稣诞生的年份作为基督教的时间基准,公元1年即是耶稣诞生的年份。随着基督教在欧洲的传播,公元纪年逐渐成为西方世界普遍采用的历法标准,随后随着欧洲的殖民扩张和文化传播,逐渐在全球范围内被广泛接受和使用。如今,公元纪年系统已成为国际标准
儒略日(Julian Day):又称为朱利安日,代表从公元前4713年1月1日(儒略历)的正午开始到某个指定时间所经过的天数,有点类似于Unix时间戳,儒略日是一个不计年份和月份的计时系统,只计算某个时间距离公元前4713年1月1日过去了几天。如:2021年6月22日12:00的Julian Day是2459388。这个数值表示自公元前4713年1月1日正午以来,已经过去了2459388天。该日期系统主要用于天文领域,天文现象通常涉及非常长的时间跨度,如果使用公历日期系统(年、月、日)作为日期计数非常繁琐,Julian Day系统将日期换算为一个连续的数字,只计算天数,使得日期计算变得更加简洁,特别是在计算天体运动或两个日期之间的时间间隔时。选取公元前4713年1月1日作为Julian Day的起始时间是因为该时间节点是太阳周期(28年为一个周期)、月亮周期(19年为一个周期)、罗马征服日历(15年一个周期,古罗马帝国用于税务和行政管理的日期系统)的共同起点,这个日期是由天文学家约瑟夫·斯卡利杰(Joseph Scaliger)于1583年设定,斯卡利杰计算了这三个周期的最小公倍数,公元前4713年1月1日这天,这三个计时系统都渡过了一个周期并开始了一个新的周期,将拥有一个共同的起点。并且该时间点距离现代足够遥远,在研究绝大多数历史事件和天文事件时,Julian Day的数值都是正数,可以避免在计算中出现负数日期,方便计算和记录。
ISO周日历系统:ISO年份是国际标准化组织(ISO)规定的一种日期表示方式,在日常生活中,不同地区的人对于日期的解读方式不一致,如:01/06/21在有些地区解读为2021年1月6日,有些地区解读为2021年6月1日,也有可能被解读为2001年6月21日。为此,ISO组织制定了ISO 8601标准以确保了全球范围内日期表示的一致性,ISO 8601标准提供的标准日期格式为“YYYY-MM-DD”形式,如:2021-06-01。此外,不同文化和地区对一周的起始时间定义不同,亚洲国家通常以星期一作为一周的第一天,而一些西方国家会以星期日作为一周的第一天,因为在基督教的传统中,周日是耶稣复活的日子,具有特殊的宗教意义。为了避免因地区和文化差异带来的日期混淆,ISO 8601标准还提供了”ISO周编号系统”,该系统中周、年份的计算方式与常见的公历有所不同:
公历年份从1月1日开始,到12月31日结束。而ISO年份不一定从1月1日开始,ISO标准中第一周被定义为包含1月4日的那一周,另一判别方法为:包含1月1日的那一周,有四天或四天以上的天(一周过半的时间)是属于上一年的,那么该周是属于上一年的,并且该周中剩余以1月开头的日期也属于上一年(该规则也被称为”四天规则”)。因此,ISO年份可能会比普通年份早开始几天或者晚结束几天
公历中不同地区对于一周第一天的定义不同,ISO规定每周从星期一开始,星期日结束。每年有52或53个完整的ISO周,ISO年的第一周必须包含当年1月4日。
一 | 二 | 三 | 四 | 五 | 六 | 日 |
---|---|---|---|---|---|---|
26 | 27 | 28 | 29 | 30 | 31 | 1 |
2 | 3 | 4 | 5 | 6 | 7 | 8 |
date命令
date [选项] 输出或修改系统时间和日期
- 默认情况下,date命令会按照locale区域设置的格式输出系统当前时间
- “+日期格式字符串”:可以指定日期时间输出格式
- -s 修改系统时间和日期
- -d 日期:输出指定的时间和日期,常用来格式化日期输出,如果指定输入的日期之间有空格,则需要使用引号包裹
- -f 文件名:从文件中批量载入日期,并格式化输出
- -r 文件名:输出文件最后被修改时间
常用格式 | 说明 |
---|---|
%H | 以24小时制(00-23)输出小时 |
%I | 以12小时制(01-12)输出小时 |
%M | 输出分钟(00-59) |
%S | 输出秒(00-60)(60为闰秒) |
%p | 输出’AM’或’PM’ |
%Z | 输出时区,如北京时间为:CST |
%Y | 输出年,如:2021 |
%m | 输出月(01-12) |
%d | 输出日(01-31) |
输出当前系统时间
修改系统时间
修改系统时间需要用户拥有root权限
格式化输出一个指定的时间和日期
-d选项可以指定一个时间和日期,然后让date命令根据格式字符输出为指定形式,方便在代码中以统一格式输出时间信息。该选项十分强大,它能识别各种不同的日期输入方式,所输入的日期可以是具体值,也可以为相对时间
时间与日期的格式
时间和日期格式字符串通过+号来引导,格式之间可以添加,如果格式字符串中包含空格则需要使用引号包裹。时、分、秒、月、日等单位默认情况下会输出两位,在值只有一位时会前补0,可以在其格式字符前加上_将其修改为前补空格,也可以在格式字符前加上-将其修改为既不前补0也不前补空格。
时间格式符 | 说明 |
---|---|
%H | 以24小时制(‘00’-‘23’)显示小时,值只有一位时前补0 |
%I | 以12小时制(‘01’-‘12’)输出小时,值只有一位时前补0 |
%k | 以24小时制(‘ 0’-‘23’)输出小时,但值只有一位时不前补0,而是前补空格,等价于”%_H”(GNU扩展格式) |
%l | 与%k类似,以12小时制(‘ 1’-‘12’)输出小时,值只有一位时前补空格,等效于”%_I“(GNU扩展格式) |
%M | 输出分钟(‘00’-‘59’) |
%s | 输出自 1970-01-01 00:00 UTC 以来的秒数 |
%S | 输出秒(‘00’-‘60’) |
%N | 输出纳秒(GNU拓展格式) |
%p | 显示’AM’或’PM’ |
%R | 输出24小时制的小时和分钟,等价于”%H:%M” |
%T | 输出24小时制的小时、分钟、秒,等价于”%H:%M:%S” |
%x | 根据用户本地环境自动决定显示格式,如:美国默认显示为MM/DD/YY,而欧洲一些地区可能显示为DD/MM/YYYY |
%z | 显示四位数的时区,如:中国东八区:+0800 |
%Z | 显示时区名字,常见的时区名有:UTC(协调世界时间)、CST(北京时间或中国标准时间)、PST(太平洋标准时间)、GMT(格林威治时间)、CET(中央欧洲时间) |
日期格式符 | 说明 |
---|---|
%a | 星期的缩写,如:Sun |
%A | 星期的全写,如:Sunday |
%b | 月份的缩写,如:Jan |
%B | 月份的全写,如:January |
%c | 根据用户本地环境自动决定时间和日期显示格式,如:Sat 03 Aug 2021 10:17:38 AM CST |
%C | 显示年份的前两位,如:2021显示为20,可以用来和%y搭配将年份拆分为两部分处理(GNU文档中说返回世纪,真实的世纪应该在此基础上+1,计算机习惯从0计数说世纪应该也没错?) |
%d | 显示日期,值只有一位时前补0 |
%D | 以%m/%d/%y形式显示日期,如:06/20/2021 |
%e | 显示日期,值只有一位时前补空格,等同于”%_d” |
%F | 以标准ISO 8601格式显示日期,格式为:YYYY-MM-DD,如:2023-10-01 |
%g | 输出年份的后两位数,这里的年份是基于ISO 8601周历的年份,而非公历(详见对ISO的解释部分),如:2023/01/01返回22 |
%G | %g的四位数版本,输出完整的四位数年份,年份也是基于ISO 8601周历的年份,如:2023/01/01返回2022 |
%h | 与%b相同,显示月份的缩写 |
%j | 显示某个日期当天为一年中的第几天,值为001-366 |
%m | 显示数字形式的月份(01-12),值只有一位时前补0 |
%q | 显示一年中的第几个季度(1-4) |
%u | 显示数字形式的星期(1-7),1对应周一 |
%U | 显示某个日期为一年的第几周(00-53),新年中第一个星期日之前的天数属于第零周 |
%V | 显示ISO周数,即某个日期为ISO年的第几周(01-53),详见对ISO的解释部分 |
%w | 显示数字形式的星期(0-6),0对应于星期日 |
%W | 显示某个日期为一年的第几周(00-53),新年中第一个星期一之前的天数属于第零周 |
%x | 根据用户本地环境自动决定日期显示格式,相较于%c它只显示日期,如:12/31/2016 |
%y | 显示年份的后两位数字(00-99),如:2021年显示为21 |
%Y | 显示完整四位数的年份,也是常用的年份显示方式,如:2021 |
特殊转义字符 | 说明 |
---|---|
%% | 输出% |
%n | 换行符 |
%t | 制表符 |
系统网络
ping 测试网络
ping [-c 次数] IP地址
- -c 指定发送次数
测试网络是否联通,如果不添加-c参数,则会无终止进行ping操作,直至 ctrl+c 停止
ifconfig 网卡设置
ifconfig [网卡名称] [IP地址]
查看和设置网卡
traceroute 查看与目标主机间的网路节点
traceroute 网址或IP地址
显示当前主机与目标主机之间的所有网络节点的IP地址、延迟等信息,节点为***表示该节点信息被加密
查看网络状态
netstat [参数]
查看当前主机的网络连接状态,包括端口号、IP地址等
- -t TCP协议
- -u UDP协议
- -l 监听
- -r 路由
- -n 显示IP地址和端口号
- -a 所有
- -p 列出相关程序名
常用
- netstat -tulnp 查看本机监听的TCP和UDP端口并列出相关程序
- netstat -an 查看本机的所有网络连接
- netstat -rn 查看本机所有路由表
setup 配置网络(redhat系列操作系统专有)
setup
调出GUI界面设置IP地址、子网掩码等信息,setup是redhat开发的用于配置网络IP地址、子网掩码等网络信息的GUI工具,只有部分redhat发行的操作系统中有该工具。