Linux基础知识:读书笔记

15

本文根据《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参数使得信息更易读。
  • tophtop:查看实时系统资源使用情况。
  • ps aux:查看当前运行的进程。
  • ip aifconfig:查看网络接口和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的组成部分,不需要衍生子进程也不需要打开程序文件,速度快、效率高。
  1. history:查看历史输入命令,在命令行输入!!,可以执行最近一条命令;在命令行输入!行号,可以执行对应命令;在CLI会话期间,bash命令的历史记录被存在内存中,退出shell才会写入用户目录下的.bash_history中;要不退出的情况下将记录写入文件中可以用history -a命令;.bash_history只会在首次启动终端会话时才会读取,要重新读取用history -n命令。history -c清除历史记录,history -a更新到.bash_history,就完成了删除历史记录的任务。
  2. 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
tips:default 变量的用法:在对变量进行操作时不用加$,当使用其中的数据时就要加$

对于全局变量的修改只能持续到退出、重启系统。

持久化修改环境变量

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