Linux基础知识:读书笔记
本文根据《Linux命令行与shell脚本编程大全(第四版)》整理的读书笔记
常用命令
uname -m
:输出CPU的架构类型,例如x86_64或armv7l。uname -a
:输出所有系统信息,包括内核版本、机器架构等。uname -p
:输出处理器架构。uname -i
:输出硬件平台架构。cat /etc/os-release
:查看发行版信息。lsb_release -a
:如果安装了lsb(Linux Standard Base),则可以使用此命令显示发行版信息。hostnamectl
:在systemd系统上显示系统信息,包括操作系统详细信息。lscpu
:显示CPU架构信息。free -h
:查看内存使用情况,-h
参数使得信息更易读。df -h
:查看磁盘使用情况,-h
参数使得信息更易读。top
或htop
:查看实时系统资源使用情况。ps aux
:查看当前运行的进程。ip a
或ifconfig
:查看网络接口和IP配置信息
显示文件及目录
ls -F 会在目录后/表示
ls -a 后显示隐藏文件,会发现.和..也是个目录。。。
ls -R 递归显示文件
ls -l 显示详细文件信息
ls -l file 显示指定文件信息
ls -ld directry显示指定目录详细信息
ls 后面加指定的文件名可以起到过滤作用,并且支持元字符和正则表达式
eg: ls -l my*(*表示匹配多个或0个任意字符,?表示匹配任意一个字符)
创建、复制、移动(重命名)、删除文件
touch :创建或改变已有文件的时间戳
cp source destination :
- 当destination可以改名,若存在同名文件,会默认覆盖,所以最好加上-i参数,提示功能。
- 若表示目录应该在末尾加上
/
! - -R选项可以递归复制整个目录的内容
mv : 同cp类似,加上-i后当出现destination是存在文件时,会提醒是否覆盖。
rm:删除文件,-i提醒删除哪些
管理目录
mkdir 创建目录,-p选项表示批量创建不存在的父目录。
rmdir :删除空目录。
rm -r:删除目录,不论是否为空目录。
查看文件内容
file : 探测文件内部并判断文件类型
cat :-n 显示行号,-b给有文本的行才加行号
more:分页预览,空格向前翻页,Enter逐行向前翻页,q结束。
less:more的高级版,还能识别上下箭头键和上下翻页键。
head:开头10行内容,-n 开头n行内容。
tail:结尾10行内容,-n结尾n行内容。-f保存活动状态,实时显示末尾内容。
进程管理
ps:-e系统中运行的所以进程,-f扩充输出有用信息,-l获取更多信息。
- uid:启动进程的用户
- pid:进程id
- ppid:进程的父进程的id
- C:生命期中的cpu利用率
- stime:启动时的时间
- tty:从哪个终端设备启动
- time:运行进程的累计cpu时间
- cmd:启动的程序名称
- F:内核分配给进程的系统标识
- S:进程状态(O运行,S休眠,R可运行,正等待运行,Z僵化已经终止,找不到父进程,T停止)
- Pri:进程优先级(数字越大,优先级月底)
- Ni:谦让度,用于觉得优先级
- ADDR:内存地址
top:实时显示进程信息,在运行时键入f可以排序,键入d可以修改轮询间隔,键入q可以退出。
- 第一行显示了当前时间、系统运行时长、登录用户数、系统平均负载(3个值,分布表示=最近1分钟,最近5分钟,最近15分钟,的平均负载)
- 第二行显示了进程概况:多少经常处于运行、休眠、停止、僵化(进程停止,父进程没有响应)。
- 第三行显示cpu概况
- 后面两行,分别显示系统的物理内存及系统交换控件。
kill、pkill:结束进程,前者要知道进程id,后者用程序名(并且可以使用通配符)。
磁盘信息
mount :查询磁盘挂载信息,-t根据磁盘格式化所使用的文件系统类型筛选输出。
mount -t type device directory:手动挂载。
umount directory:卸载
df:查看所以已挂载磁盘使用情况。-t可以更加 文件系统类型进行筛选。-h转换为人类易读的显示方式(M兆字节,G吉字节)。
du:查看当前目录的磁盘使用情况。-c显示所有列出文件的总大小,-h同上,-s汇总。
数据排序
sort:默认根据字符排序,-n数值排序,-M月份排序,-r降序排序
sort -t 分隔符 -k 排序字段 file:用分隔符分裂后,用第k列数据进行排序
du -ch *|sort -nr:当前目录文件从大到小排序。
数据搜索
grep [option] pattern [file]:在输入或指定文件中逐行搜索匹配指定模式的文本。该命令的输出是包含了匹配模式的行。
- -v排除包含pattern的行
- -c返回匹配的行计数
- -e输入多个匹配模式。grep -e pattern -e pattern2 file
- 可以用正则表达式表示模式
数据压缩及归档
gzip:压缩指定文件,或写多个文件名,或用通配符压缩多个文件,生成.gz后缀的压缩文件。
tar :命令操作(-c创建,-t查看tar文件的内容但不提前,-x提取文件),命令选项(-f结果输出到文件,-v在处理文件时显示文件名)
tar -cvf test.tar test/ test2/
创建了一个名为test.tar的归档,包含目录test和test2的内容tar -tf test.tar
列出test.tar中的内容,但不提取。tar -xvf text.tar
提前test.tar中的内容,含义目录结构,则在当前目录中重建该目录的整个结构。
shell
基本操作
ctrl + L:清屏
ctrl+u,k:删除光标前、后字符
ctrl+a,e:光标移动到行首、行末
shell类型
默认的交互shell
也称登录shell,当登录系统时,系统启动什么shell,取决于/etc/passwd个人用户配置文件的第七列。本机为bash shell
通过which bash,可以查看bash所在位置,一般在/usr/bin/bash。一般/bin是/usr/bin的软链接,所以用户的默认程序是/bin/bash,但bash shell程序实际位于/usr/bin/bash目录中。
默认的系统shell
sh(/bin/sh)用于那些需要在启动时使用的系统shell脚本。同样通过which sh可以查看对应的shell类型。
对与我的ubuntu来说,交互shell为bash shell、系统shell为dash shell。
进程列表
- $0:可以通过该环境变量,了解现在命令行使用的是什么shell
- $BASH_SUBSHELL:通过该环境变量,可以输出有几个子shell。
(sleep 2;echo $BASH_SUBSHELL; sleep 2)
:该进程列表会生成一个子shell,输出为1。
后台运行、协程
- &用在命令后:将命令置于后台运行。
- jobs:显示当前运行在后台模式中属于你的所有进程。
- coproc sleep 10:表示协程,会创建子shell运行sleep 10,并将命令置于后台。从jobs也可以看出命令后带了一个&。
外部命令和内部命令
- 外部命令会衍生出子进程,但和子shell一样仍然可以通过信号进行互通。
- 内部命令是shell一体的,是shell的组成部分,不需要衍生子进程也不需要打开程序文件,速度快、效率高。
- history:查看历史输入命令,在命令行输入!!,可以执行最近一条命令;在命令行输入!行号,可以执行对应命令;在CLI会话期间,bash命令的历史记录被存在内存中,退出shell才会写入用户目录下的.bash_history中;要不退出的情况下将记录写入文件中可以用history -a命令;.bash_history只会在首次启动终端会话时才会读取,要重新读取用history -n命令。history -c清除历史记录,history -a更新到.bash_history,就完成了删除历史记录的任务。
- alias:定义别名;-p查看当前可用别名。
环境变量
- 全局环境变量:可以在shell和子shell中使用。
- 局部环境变量:只能在创建它的shell中使用的变量。
- 查看全局环境变量命令:printenv、env
- 查看全局、局部环境变量、用户自定义变量命令:set
- 定义局部变量:var=hello,不能有空格,若字符串有空格需要用引号
- 定义全局变量:export var="I am global var",在子shell中也可以用,并且在子shell中修改、甚至是删除,都不会改变父shell的全局变量。
- 删除环境变量:unset var(不需要用$)。
- Path环境变量:定义了用于查找外部命令和程序的目录。目录之间用:分割。添加环境变量为直接在后面加:再接着写入就行。
PATH =$PATH:/home/ubuntu/Scripts
对于全局变量的修改只能持续到退出、重启系统。
持久化修改环境变量
1.登录shell
bash shell 作为登录shell启动时,shell会从以下5个启动文件中读取命令:
- /etc/profile:系统默认的主启动文件
- $HOME/.bash_profile
- $HOME/.bashrc
- $HOME/.bash_login
- $HOME/.profile
2.交互式shell
不是在登录系统时启动的shell(比如在命令行中输入bash),那么此时的shell是交互式shell,不处理/etc/profile文件,只检查$HOME目录中的.bashrc文件。
3.非交互式shell
系统执行shell脚本时用的就是这种shell。脚本没有命令行提示符,当想运行特定启动命令时,需要用到BASH_ENV环境变量。该环境名中的文件名就是要被启动执行的。
用户权限
用户和组
Linux将用户账户信息存储在/etc/passwd文件,将组信息存储在/etc/group文件中。
ubuntu小于1000的UID留给了系统用户使用,是系统重运行的各种服务进程访问资源使用的特殊账户。普通用户从1000开始编排。
/etc/passwd文件中每行含义为 登录用户名:用户密码:UID(数字形式):GID(数字形式):备注字段:$HOME目录的位置:默认的Shell
/etc/group文件每行含义为 组名:组密码:GID:属于该组的用户列表
-
useradd:创建新用户
useradd -D
输出默认的创建用户时的设置
useradd -D -s /bin/tsch
修改默认设置,这里是将默认shell修改了
useradd -m 用户名
-m会创建改用的$HOME目录 -
groupadd:创建新组
groupadd 组名
默认不为其分配任何用户,要添加用户需要用usermod。 -
usermod:修改已有用户账户,提供了修改/etc/passwd大部分字段的相关选项
usermod -G 组名 用户名
:将该组名添加到用户账号的组列表中。
usermod -g
要格外消息,指定的组名会替换掉/etc/passwd文件中该用户分配的主要组。-G则是将该组加入该用户的属组列表,不影响主要组。还有别的一些字段:-c用于修改备注字段,-e用于修改过期日期,-g修改默认的登录组,-I修改登录名,-L锁定账号禁止用户登录,-p修改密码,-U解除锁定
-
groupmod:修改已有组信息
groupmod -n sharing shared
修改组名为sharing
groupmod -g
修改已有组的GID -
passwd修改密码
只有root用户才有权限修改别人的密码passwd 用户名
,若只使用passwd
表示修改自己的密码,使用-e选项可以强制用户下次登录时修改密码。
chpasswd批量修改密码:chpasswd < users.txt
每个文件有3个安全等级:文件的属主,能访问文件的默认属组,系统的其他用户。
每个安全等级通过3个访问权限来定义:r读取,w写入,x执行。比如rwx表示3可以读取、写入和执行,这种3位二进制可以组成一位8进制数来表示。从而用3个8进制数表示3个安全等级所对应的权限。
umask命令是掩膜的概念,用来设置系统中新建文件和目录的安全设置,默认值在/etc/profile文件中,不过也可以随时用umask命令修改。对应文件来说最高权限是6,对于可执行文件和目录来说最高权限是7。
umask总共为4位(sgid/suid/粘滞位的8进制数,属主,组权,其它用户的权限),不过通常用到的是后3个,umask设置为002,新建文件权限为(6-0,6-0,6-2),新建目录为(7-0,7-0,7-2)。umask和chmod是想对应的关系。
2进制和8进制关系
- 权限:
1表示可执行
2表示可读
4表示可写
从中1+2=3为r-x;1+4=5为-wx,2+4=6位rw-。7表示全部权限。 - linux给文件存储的额外3个信息位,SUID,SGID和粘滞位。SUID当用户执行文件时,程序会以属主的权限运行;SGID文件会以属组权限运行,当为目录时在该设置后的目录下创建新文件以目录属组为默认属组;粘滞位(sticky bit)应用于目录时,只有文件属主可以删除和重命名该目录中的文件。可以通过chmod命令设置信息位,将其添加到标准3位八进制之前。
- 额外信息位的8进制数,0表示清除所有位,1设置粘滞位,2设置SGID位,4设置SUID位,1+2=3设置粘滞位+SGID位;2+4=6设置SGID和SUID位;1+4设置粘滞位和SUID位。7设置所有位。
权限修改命令
- chmod
可以修改文件和目录的安全设置。只有文件的属主才能修改文件或目录的权限。但root用户可以修改系统中任意文件文件或目录的安全设置。#修改textfile文件权限 chmod 662 textfile #符号模式 chmod [ugoa..][+-=][rwxXst..] textfile #[ugoa..]:第一组表示权限作用对象,u代表用户,g代表组,o代表其他用户,a代表上述所有。 #[+-=]:第二组表示现有权限上增加(+),移除(-),设置(=)权限。 #[rwxXstugo..]:第三组表示设置的权限。rwx不用说了,X仅当对象是目录和已有执行权限时才赋予执行权限。s在执行时设置SUID和SGID。t设置粘滞位。
- chown
更改文件的属主。chown option owner[.group] file
加上[.group]可以同时修改属主和属组。 - chgrp
更改文件的属组,修改该文件属组的用户要同时属于原属组和新数组。
访问控制列表(ACL)
ACL允许指定包含多个用户或组的列表以及为其分配的权限。
- getfacl file:查看权限
- setfacl file:设置权限
setfacl [options] rule filenames -m 命令选项修改分配给文件或目录的权限。 -x删除特定权限 rule可以有3中格式:u[ser]:uid:perms;g[roup]:gid:perms;o[ther]::perms setfacl -m g:sales:rw test