admin管理员组

文章数量:1026989

前言

  • 这篇文章也是花费了我挺多心血的,首先我要表明一点,就是本人写这篇文章之前这里面的知识点起码有百分之其实以上都是不清楚的,而且写完这篇文章总共不超过24小时,字数统计为27800多字1240多行,写完的感觉就是又爽又累,所以一天linux学完除了shell编程是绰绰有余的。
  • 而我写这篇文章的目的呢主要就是为了有一个更好得吸收效果,总之这篇文章的完成度肯定是不够的,比如说好多知识都没写全面,其实也不用写全面,基本上就是把那些常用的知识点写进去就行了。
  • 总之就是因为本人知识局限性,毕竟是现学的嘛,然后再加上写的时间又不长,只是粗略看了一下排版有没有问题就溜了,所以文章中所出现的问题或者遗漏欢迎评论

    文章目录

    • 前言
      • linux基础
        • 终端
        • shell和命令提示符
        • 命令提示符
      • Linux基础命令
        • 命令格式
        • 简单命令
      • linux文件系统
        • linux下的文件类型
        • ls命令的详细使用方法
        • **常用的通配符:**
        • 常用文件操作命令和工具
        • mv 移动/改名
        • rm 删除
        • df 磁盘使用情况查看命令
        • apt系统包管理工具
        • lrzsz 上传下载工具
        • zip/unzip压缩解压工具
        • tar压缩
        • *重定向
          • 文件描述符
          • 输出重定向
          • 输入重定向
        • *管道
          • 定义
          • 注意事项
          • 总结
        • *用户权限=>用户管理&权限控制
          • 介绍
          • linux用户:
            • linux用户种类
          • linux用户管理
            • 添加用户
            • 删除用户
            • 修改用户
              • 修改用户的属性,也就是前面useradd里所提到的那些属性
            • 管理用户口令
          • linux用户属性
            • 用户属性
            • 用户相关文件
        • linux用户组
          • linux用户组管理
            • 添加组:
            • 删除组:
            • 修改组属性
        • linux用户组相关文件
            • linux用户组注意
          • 文件操作权限修改
            • 文件权限叙述
            • 权限用户
            • 文件权限
            • 文件权限分配
            • 权限表示类型
            • 文件权限属性操作命令
              • chgrp
              • chown
              • chmod
          • 切换用户命令`su`
        • 文本处理命令
          • grep
          • find:
        • ln硬链接与软链接
        • vim/vi

linux基础

终端

就是我们常见的命令行交互模式,比如说丑得要死的Windows的cmd,还有powershell等等,反正能进行命令交互的就叫终端,而我们大多数对linux的使用也是基于终端来的

终端分为设备终端、物理终端、虚拟终端、图形终端、串行终端和伪终端,我们通过终端工具由ssh协议连接服务器使用的是伪终端

shell和命令提示符

  • shell就是linux系统的解释器,类似于编程里面的编译器,我们通过高级语言编写出来的源代码需要经过编译器编译成计算机能看懂的二进制代码,从而达到执行的目的。而这个shell就类似这个功能,shell是一个与内核交互的接口,它将我们输入进去的命令转化为计算机能看懂且执行的二进制数据,linux中常见的shell为bash,当然也有许多其他的shell

Linux常见shell:sh、bash、csh、tcsh、ash

不同的组织机构开发了不同的 Shell,它们各有所长,有的占用资源少,有的支持高级编程功能,有的兼容性好,有的重视用户体验。我们也可以将shell当做一门语言,呸,他就是语言,而且他也有他的语法之内的包括什么循环条件他都有,类似于php,python这种的解释型的脚本语言,通俗理解就是连接系统内核于用户的一款软件

cat /etc/shells  //使用该命令可以查看shell列表

使用echo $SHELL命令能够查看当前设备的默认shell,显然我的这个Ubuntu默认用的就是bash,至于为啥是/bin/bash,这就与bin这个文件的作用有关了,我后面会讲

当然你也可以cd到bin这个目录将bash打印出来看看,光看肯定不是很好理解,最好还是实际体验一番,就好像是小时候鼓捣玩具赛车一样,虽然你拆开这个玩具的外壳后看到里面的电路板完全看不懂,但还是有一种动力驱使你去拆开它,而且这又不像玩具那样容易搞坏,你这个系统被你玩坏再重装不就得了,而且linux还是开源的,扯多了

  • 更换默认shell

    chsh   //输入该命令,然后输入密码后进行更换默认shell
    

这里我分享一下当时我修改默认shell时遇到的一些问题,就是最开始我修改完了默认shell之后我输入echo @SHELL发现我的默认shell一直没有变,我一直以为我哪里操作出问题了,结果是我没有重启,害,然后就是切换的shell要是特定文件的格式,比如说"/bin/bash",其中bash就是位于bin文件下的一个文件而已,记住linux核心宗旨,”一切皆为文件“,这是我师父告诉我的

还有就是记这条命令的一个小技巧,chsh == change shell,这样一来就比较好记了是吧

命令提示符

就是前面的输入命令前面的那个小框

┌──(kali㉿kali)-[~]
└─$   

其中kali@kali,前面的那个kali表示用户名,后面的那个kali表示主机名,[]表示当前所在路径,就是表示家路径的意思,最紧接着输入命令的地方的那个KaTeX parse error: Expected 'EOF', got '#' at position 16: 表示你现在是什么权限的用户,`#̲号代表的是当前用户是最高权限用…`

这里已经提到了,我就顺便讲一下绝对路径,相对路径这些

/ :根目录符
. :当前目录符
.. :上级目录符
 ~ :家目录符(用户不同,家目录也不同),比如说root用户的~的绝对路径是/root,而kali用户的~是/home/kali,pysnow用户的~是/home/pysnow
 
 
 绝对路径:路径的写法一定是由根目录 / 写起的,例如 /var/www/html
 相对路径:路径的写法不是由根目录 / 写起的,而是由上级目录(.),家目录(~)开头写的,比如说我通过执行pwd命令知道了我现在的绝对路径是/usr/lib,然后我在当前目录想使用cd ./php,是切换到了哪里?答案是/usr/lib/php,所以这个./就相当于/usr/lib,为什么要使用这种相对路径呢,当然是为了方便啊
 比如说你现在的路径是/var/www/html/898wdahwdw89ydhwh/var/www/html,你想要切换到/var/www/html/898wdahwdw89ydhwh路径上去,你是选择cd ../../../,还是选择cd /var/www/html/898wdahwdw89ydhwh,答案就显而易见了是吧

Linux基础命令

命令格式

command [option] [ARGUMENTS…]

查询命令帮助:COMMAND --help或者man COMMAND

命令补全功能:命令只输入一部分的时候按一下tab键可以补全命令,如果按一下没有反应的话是因为候选命令不止一个,连击两次tab可以显示所有以当前输入内容开头的命令,比如输入syst按一下tab会自动补全为system,再加一个c按tab他就自动补全成systemctl。 补全功能也可以在路径上使用,当你遇到一个名字很奇怪难打的时候你就可以只输入前面几个单词,然后利用自动补全功能将这个文件名补充完整,这样大大得降低了你输入命令的容错率已经提升了效率

  • 选项(OPTIONS):用于启用或关闭命令的某个或某些功能

短选项:-c 例如:-l, -h, -p ,-d等等以单个横岗开头且选项为一个字符
长选项:–word 例如: --help , --name, --dbs等
参数[ARGUMENTS]:命令的 注意:

多个选项以及多参数和命令之间使用空白字符分隔

取消和结束命令执行:Ctrl+c(强制结束),Ctrl+d(正常退出)
多个命令可以用;符号分开
演示如下:

简单命令

  • date 显示当前时间

  • cal 显示日历

  • halt,shutdown -h now,poweroff 关机

  • reboot 重启

  • whoami 查看当前用户名

  • who 查看当前所有在线会话

  • w 查看当前系统所有在线会话和正在进行的操作(正在执行的命令)

  • tty 查看当前使用的终端号是什么

  • ls命令是Linux中最常用的命令之一了,是list source的简写,这个命令简单说就是展示目录下的文件和目录。

  • cd命令也是最常用的命令之一,cd的功能非常简单,就是切换当前所在目录,跟window的cmd里面的cd用法一样

  • apt apt命令在之前也提到过,apt是ubuntu,debian,kali的包管理器(简单说就是自动装软件的)。包管理器存在的意义是因为Linux上很多软件开发都会用到很多同样的系统调用功能,比如文件IO,内存调用,那么这种重复的东西就没有必要重复开发,所以就存在了通用库,但是不是所有的库都是默认存在在系统中的,不同的软件可能要用到不同的库文件,这就叫做软件依赖关系,而apt就是用来解决这个问题的,使用apt安装软件的话会自动帮助用户处理依赖问题,自动安装上软件所需要的各种依赖,这样的话就给用户省了很多麻烦。除此之外还有yum等

    apt update 刷新存储库索引

    apt upgrade 升级所有可升级的软件包

    apt install <应用名> 安装应用
    yum list <应用名> 列出应用

    //这里可以使用通配符来搜索应用,比如 apt list apache* 这样可以搜索出以apache开头的所有应用
    apt remove <应用名> 删除应用
    apt reinstall <应用名> 重装应用

apt 命令取代的命令命令的功能
apt installapt-get install安装软件包
apt removeapt-get remove移除软件包
apt purgeapt-get purge移除软件包及配置文件
apt updateapt-get update刷新存储库索引
apt upgradeapt-get upgrade升级所有可升级的软件包
apt autoremoveapt-get autoremove自动删除不需要的包
apt full-upgradeapt-get dist-upgrade在升级软件包时自动处理依赖关系
apt searchapt-cache search搜索应用程序
apt showapt-cache show显示安装细节

linux文件系统

linux跟windows系统的文件系统的差别非常大,在Linux中,很多基本命令都与文件系统有关。而Linux的文件系统与我们所熟知的Windows文件系统的差别很大,主要体现在以下方面:

首先路径名分割符不同,linux的目录分隔是**/**,Windows系统的目录分隔符则是

路径的结构不同,Windows的绝对路径是有两个部分组成,即分盘名,与盘内路径,而linux则是只存在唯一的根目录,它是由根目录发散的树状文件结构

linux中一些固定目录的作用:

/boot:引导文件存放目录,内核文件(vmlinuz)、引导加载器 (bootloader, grub)都存放于此目录
/bin:供所有用户使用的基本命令;不能关联至独立分区, OS启动即会用到的程序
/sbin:管理类的基本命令;不能关联至独立分区,OS启动即 会用到的程序
/lib:启动时程序依赖的基本共享库文件以及内核模块文件 (/lib/modules)
/lib64:专用于x86_64系统上的辅助共享库文件存放位置
/etc:配置文件目录
/home/USERNAME:普通用户家目录
/root:管理员的家目录
/media:便携式移动设备挂载点
/mnt:临时文件系统挂载点
/dev:设备文件及特殊文件存储位置
/opt:第三方应用程序的安装位置
/srv:系统上运行的服务用到的数据
/tmp:临时文件存储位置/proc: 用于输出内核与进程信息相关的虚拟文件系统/sys:用于输出当前系统上硬件设备相关信息虚拟文件系统
/selinux: security enhanced Linux,selinux相关的安全策 略等信息的存储位置
usr: universal shared, read-only data
bin: 保证系统拥有完整功能而提供的应用程序
sbin: 同上
lib:32位使用
lib64:只存在64位系统
include: C程序的头文件(header files) share:结构化独立的数据,例如doc, man等 local:第三方应用程序的安装位置
/var: variable data files
cache: 应用程序缓存数据目录
lib: 应用程序状态信息数据 local:专用于为/usr/local下的应用程序存储可变数据; lock: 锁文件
log: 日志目录及文件
opt: 专用于为/opt下的应用程序存储可变数据;
run: 运行中的进程相关数据,通常用于存储进程pid文件 spool: 应用程序数据池
tmp: 保存系统两次重启之间产生的临时数据

linux下的文件类型

-:普通文件
d: 目录文件
b: 块设备
c: 字符设备
l: 符号链接文件
p: 管道文件pipe
s: 套接字文件socket

那这个文件类型在哪里看呢,输入ls -l

最左边那列,第一个字符可以看到基本上是**-** d l,这些就是文件的文件类型,然后紧接着就是改文件的权限,包括什么读取权限啊写入权限之内的

ls命令的详细使用方法

ls -a 显示当前目录下的所有文件(包含隐藏文件,已.开头的文件或者目录叫做隐藏文件/目录)
ls -l 显示详细的信息
ls -R 递归展示当前目录的所有非隐藏目录/文件(谨慎执行,会一下出来很多文件卡屏,如果出现可以按Linux的强制结束组合键Ctrl + c来阻止命令继续运行)
ls -ld 只展示目录
ls -1 文件分行显示
ls –S 按从大到小排序
ls –t 按mtime排序
ls –u 配合-t选项,显示并按atime从新到旧排序 ls –U 按目录存放顺序显示
ls –X 按文件后缀排序

常用的通配符:

通配符通俗易懂地说就是一种匹配目录/文件名的匹配规则,像我们这种经常做命令注入的就应该比较了解,通配符有比较多种写法,这里我列举几个最常用的:
* 匹配零个或多个字符
? 匹配任何单个字符
[0-9] 匹配数字范围

比如说什么有个flag.php文件啊,你不能直接输入flag这四个字符,但是你可以利用通配符达到同样的目的,即fla*f???????

还有一个形象的例子就是,你打游戏的时候,你觉得某个队友不爽,然后你就扣子骂过去,结果游戏把你扣得字都转化成了***,你知道这个通配符的意思,无非就是什么什么什么什么bi之内的,这个通配符可以是任何东西,有可能是你想那个意思,也有可能是完全另外一个意思,所以你要多给它一点描述让他的意思限制范围变小

这就是对通配符的实际操作,当然你也可以自己在自己的linux系统上实验一下

常用文件操作命令和工具

cp  复制:
选项参数:
-i:覆盖前提示
–n:不覆盖,注意两者顺序
-r, -R: 递归复制目录及内部的所有内容
-a: 归档,相当于-dR --preserv=all
-d:--no-dereference --preserv=links 不复制原文件,只复制链接名
--preserv[=ATTR_LIST]
-p: 等同--preserv=mode,ownership,timestamp
-v: --verbose
-f: --force
用法:
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
cp SRC DEST
注:OPTION表示参数,SRC(SOURCE)表示复制源,也就是被复制的文件或者目录 ,DEST表示复制目标,也就是复制到的目录或者文件,DIRECTORY表示目录

光看原理是不行滴,还是得上手操作一下

cp flag.php flag1 //将文件flag.php复制到当前目录,且重命名为flag1
ls   //发现该目录下多出了一个flag1,并且flag.php还是存在
cp -r ./* /tmp  //将当前目录下所有文件即文件夹都复制到/tmp里面,其中-r表示递归复制,意思是递归复制目录及内部的所有内容
ls /tmp和ls  //发现两个命令的回显一样说明完全复制成功了
cp 517pysnow flag.php flag123 mysql ./test/  //同时复制多个文件到当前目录的test文件夹里面
ls ./test    //发现里面存在文件517pysnow flag.php flag123 mysql,说明操作正确

mv 移动/改名

选项参数:

-i: 交互式,提示是否覆盖

-f: 强制移动,如果有同名文件就覆盖

用法逻辑与cp基本相同,所以逻辑请参考上面cp命令

同样也是实际操作一遍,只要cp命令没啥问题,这个也就没啥问题

rm 删除

可曾听闻过这样一串代码,从删库到跑路的那个表情包

sudo rm -rf /* 

其实语法都差不多,这三个命令,只要记住其中一个命令的具体用法,然后类比推出别的代码就行了

df 磁盘使用情况查看命令

这是一个很常用的目录,其中-h就是将输出的内容转化为方便人阅读的内容,就是直接执行df会以字节(B)来展示磁盘占用情况,加上-h就可以显示成多少G,更加易读

apt系统包管理工具

这个工具我在前面已经简单讲过了, 这个工具其实其底层原理理解起来需要比较多的知识,至少需要知道什么叫做“库”,还需要知道什么叫做“依赖关系”等等,反正涉及的挺多的,感兴趣的话可以自行百度谷歌

可在apt命令末尾加上一个-y表示默认同意请求

就是当你使用apt工具安装某一应用的时候他会询问你yes/no,这时候你只要加了这个-y的话,它就会帮你把这个yes填了,而且不会在询问你

看这次就没询问你yes/no,直接一键安装了,虽然这功能没什么卵用,但是记住还是好的,反正也不难

lrzsz 上传下载工具

服务器上传文件不只有ftp,还有其他的工具就比如说这个lrzsz,而且传输速度稳定这些性能方面不比ftp传输差多是,至于其中的原理可以自行去搜索网络通讯原理和ftp还有lrzsz的逻辑

使用方法:

先使用apt或者yum工具将lrzsz下载下来
sudo apt/yum install lrzsz -y


这个工具只有两条命令
sz: 从服务端下载文件 sendzipper,我称之为从服务器发送文件出去
rz: 上传文件至服务器 receivezipper,在服务器接受文件
是不是很好记啊,那让我们实际操作一下把
  1. 首先打开/var/www/html目录,发现有个index.html,我们将那这个文件做实验

    cd /var/www/html
    
    1. 在服务器端发送文件

      sz ./index.html
      

然后就会弹出一个对话框

这样就可以保存文件了

  1. 接下来是上传文件至服务器

    rz ./           //接受文件至当前目录
    

zip/unzip压缩解压工具

安装:
sudo apt/yum install zip -y
sudo apt/yum install unzip -y
也可以直接
sudo apt/yum install unzip zip -y

这里注意一点,就是解压的时候要给他用-O参数指明编码方式,不然会乱码,因为linux默认的编码方式ans

--把文件a压缩成a.zip

zip a.zip a

--把文件a b c压缩成a.zip

zip a.zip a b c

--把目录tmp压缩成tmp.zip(-r选项用于压缩目录)

zip -r tmp.zip tmp

--解压a.zip文件

unzip a.zip

tar压缩

类似于zip,tar是linux中最常见压缩包压缩工具,压缩包文件以.tar结尾,初次之外还有gzip,bzip2。总之这些工具都可以作为源码备份的好工具,而且这三个工具经常联合使用,一般来说联合使用都是通过tar将多个文件打包成一个文件,然后再调用gzip或者bzip2将打包好的文件进行压缩,从而生成以.tar.gz或者.tar.bz2的压缩包

打包压缩
tar [option] [压缩后的文件名] [待压缩的文件名]      
解包解压
tar [option] [将要解压的文件名] [option2] [解压路径]  //解压路径如果不选,默认是解压到当前路径
-c 打包,生成档案文件
-x 解包,解开档案文件
-v 列出归档解档的详细过程,显示进度
-f 指定档案文件名称,如果有多个选项,该选项必须放选项最后
-z 调用gzip 命令进行压缩或解压缩
-j 调用bzip2 命令进行压缩或解压缩

-C 指定解压目录,注意: 该目录必须是已经存在的。

*重定向

linux shell的重定向是个什么东西呢,顾名思义就是重新定位方向,定位什么方向呢,那就是输入和输出的方向,也就是说linux shell的重定向就是改变输入和输出的方向

接下来我讲一下输入跟输出

输入一般是指你通过键盘输入数据,然后shell将你输入的数据进行解释编译然后交给内核运行,这就是标准输入方向,也就是键盘跟程序的关系

反之,输出就是计算机将运算出来的结果通过shell等中间代理将运行的结果反映在外面的显示屏上,这就叫做输出,是从程序到显示屏的关系

文件描述符

linux下一切皆为文件,包括你输入输出用的硬件设备都是文件,linux会给每个打开的文件分配一个ID,也叫作文件描述符,

Linux 程序在执行任何形式的 I/O 操作时,都是在读取或者写入一个文件描述符。一个文件描述符只是一个和打开的文件相关联的整数,它的背后可能是一个硬盘上的普通文件、FIFO、管道、终端、键盘、显示器,甚至是一个网络连接,其中stdin,stdot,stderr都是默认开启的,可以直接对他们进行操作

输出重定向

我们平时一般的输出结果都是直接显示在显示屏上的,也就是输出带显示屏的,但是有些时候我们为了方便整理输出内容,比如说某网站的运行日志,你说你直接把输出内容通过shell显示出来,这个内容你平时又不会去用到,只有当有问题出现时,你才会想起来要找到其几天的输出结果,而这时候你又因为只对这些输出结果进行了输出而没有进行存储,导致你没地方可以查看,这样就很难受是吧,所以我们就想着把这些输出内容全部存储到一个文件里面,当我们什么时候想要查看的时候,就将这个文件里面的内容打印出来

所以总结一下:我们为什么要进行输出重定向?因为有一些输出结果我们暂时不想然它们直接显示在显示屏上,而是将它们存储起来,这就是输出重定向

标准输出重定向:
command > file  //将执行command命令的输出结果以覆盖的形式重新定位输出到file文件里面
command >> file  //将执行command命令的输出结果以叠加的形式重新定位输出到file文件里面
错误输出重定向:
command 2> file  //将执行command命令的错误的输出结果以覆盖的形式重新定位输出到file文件里面
command 2>> file //将执行command命令的错误的输出结果以叠加的形式重新定位输出到file文件里面
正确错误输出同时重定向:
command >file 2>&1  //将执行command命令的输出的正确和错误结果以覆盖的形式重新定位输出到file文件里面
command >>file 2>&1  //将执行command命令的输出的正确和错误结果以叠加的形式重新定位输出到file文件里面
command >file1 2>file2  //将正确的输出结果以覆盖方式保存在file1,将错误的输出信息以覆盖的方式保存在file2
command >>file1 2>file2  //将正确的输出结果以叠加方式保存在file1,将错误的输出信息以叠加的方式保存在file2

注意事项

  • 重定向符 > 表示覆盖,>> 表示叠加
  • 这里的2>&1中的’&'符号代表转义的意思,就是将后面的那个转义成文件描述符的意思
  • 标准输出如果没有指明,那默认就为1,即command > file中本来应该写成command 1> file的,只是这里他把这个1给省略了而已
  • 文件描述符必须紧挨着重定向符号
输入重定向

输入重定向又是一个什么操作呢,我们可以知道一般输入的数据都是键盘键入的,而这个输入重定向就是不让读取键盘输入的数据,而是我们指定读取输入的数据

标准输入重定向:
command < flie //将file中的内容已覆盖的形式作为command的输入数据进行执行
command << end  //一直读取键盘的命令,知道遇到结束符才停止读取数据,这里的结束符也就是"end",当然这个end结束符是可以自定义的
command <file1 >file2  //将file1中的内容作为command的输入,将标准输出的结果保存到file2文件中

注意事项

  • 标准输出如果没有指明,那默认就为0,即command < file中本来应该写成command 0< file的,只是这里他把这个0给省略了而已
  • 输入重定向符号<<,这个符号的作用是使用特定的分界符作为命令输入的结束标志,而不使用 Ctrl+D 键
  • <<之后的分界符可以自由定义,只要再碰到相同的分界符,两个分界符之间的内容将作为命令的输入(不包括分界符本身)

*管道

linux管道符 “|”

定义
  • 利用Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入

建议先把我写的那篇linux重定向文章前面的输出输出概念看下,这样有助于对这个管道符作用的理解

  • 当出现多个管道符是,则是将第一个管道符中命令执行的输出结果重定向作为第二个管道符|前面那个命令的输入,然后以此类推~~
注意事项
commandA | commandB
  • 这个管道符只能重定向标准输出,而不能重定向错误输出,意思是只有当|前面的命令能够执行的时候才会将输出结果作为后面那个命令的输入

  • 管道符右边的命令必须是能接受输入命令的才行

总结
  • 其实这样看来管道符的作用跟输入输出重定向其实要达到的目的是一样的,也就是改变输出和输入的方向,但是也存在不同
  • 比如说管道符是同时执行两个进程,即|符号两边的命令分别是一个进程,而重定向符>却只有一个进程
  • 重定向符的重定向输出只能是文件,即command <file,但是管道可以是命令
  • 管道符只能对标准输入和标准输出能达到重定向的目的,而重定向比它多一个错误输出的重定向功能
  • 当然输出重定向后面也是只能跟文件,即command >file

*用户权限=>用户管理&权限控制

介绍

linux是一个多用户系统,给每个用户安排相应的权限,从而达到更好得管理文件的作用,比如说一个用户分配一类文件,让这某一类文件只能让特定的用户进行敏感操作,从而防止因为误操作导致影响到其它的文件,造成系统奔溃

我在这里先对用户组的一些简单的名词进行介绍

  • uid: 用户标识符,每个用户都有一个特定的数值,这样是为了方便执行的时候内核更方便去调用关于你这个用户的信息,不同的用户他们uid一般不一样,比如说root的uid默认为0,普通用户的uid为500-6000,但也有的linux是从1000开始,就比如说kali,然后处在这两个用户之间的就是伪用户的uid
  • gid: 组表示符,意思和用户表示符一样,可以类比起来理解
  • 登陆shell: 这个在另外那篇文章有详细讲到,就是一种连接系统内核于用户的应用程序
linux用户:
linux用户种类
  • 超级用户 :root,uid=0,最高权限管理用户,可以对其它用户的权限进行修改,默认对所有文件都是最高权限,即读写执行

    root是所有类Unix系统的管理员,它的权限是最高的,因此在我们平时使用过程中就会很方便,不会存在上面权限不足的问题,但是相对的安全风险也越大,有些时候就是因为root用户执行的一条错误命令,导致系统出现不可逆的崩溃,总之一句话能力很大,责任更大 -pysnow,大家在使用root用户的时候一定要谨慎,特别是对一些系统文件进行操作的时候
    
  • 普通用户:具有操作系统有限的权限,UID值 500 – 6000

可以存在多个普通用户,普通用户的权限是有限制的,比如说一些根目录的文件只有读的权限,一些敏感文件只有执行而没有读的权限。然后这个普通用户区别于伪用户,他是存在口令的,也就是我们俗称的登陆密码,也有使用shell的权限,并且每个普通用户都有属于自己的家目录,一般位于/home目录下与自己用户同名的文件夹,比如说我的普通用户名是kali,那我的家目录就是/home/kali,这个家目录可以用~代替,当然这个家目录不一定是必须要和你用户名保持一致,你可以修改它。
我们为什么要有这个普通用户呢,首先,肯定是为了保证安全,防止误操作,其次是方便管理,比如说你把你的这个系统交给多个人用,你不可能直接将root的权限给它吧,你肯定是给它一个权限相对较低的用户,让它既能享受到这个系统带来的部分服务的同时,又能防止他们对自己的系统搞破坏。举几个现实的例子,就是校园网的管理员账号,教师账号,学生账号他们对于的权限不同,直播间的超管,普通发弹幕用户等
  • 伪用户:为了满足系统进程需要而特地创建的永久,由于没有给他分配shell,所以不能使用该进行登陆操作,uid为1-499

    又叫系统或者服务用户,一般来说这些用户的作用就是满足当执行某一系统进程时的权限需要,有些系统文件普通用户是没有权限的,所以为了执行这一命令就需要分配更高的权限,但是又不能过高,高到像root用户那样,所以就会根据不同的功能为他们常见不同的用户去执行它
     *一般来说一种命令或者服务对应一个伪用户
     *伪用户不仅是用来执行系统有关的进程,也能使一些第三方服务功能,比如说什么网站服务,可能它的某一部分需要用到高于普通用户的权限,所以在安装这门服务的时候会默认给你的系统添加一个伪用户,使服务正常运行
     *执行一个操作命令时都会以某一特定用户的名义执行,当你使用普通用户登陆的时候你想要执行reboot重启系统命令这一操作按理来说是不允许的,但是为什么在操作的时候又可以了呢,那是因为你执行这个命令的时候是以的系统伪用户中的某一个的身份执行的
    常见的系统伪用户如下:
    bin 拥有可执行的用户命令文件 
    sys 拥有系统文件 
    adm 拥有帐户文件 
    uucp UUCP使用 
    lp lp或lpd子系统使用 
    nobody NFS使用
    

    可以使用cat /etc/passwd命令查看当前系统的所有用户的详细信息

    linux用户管理
    添加用户
    useradd [option] 用户名字
    
    option选项:
            -c comment 指定一段注释性描述。
            -d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
            -g 用户组 指定用户所属的用户组。
            -G 用户组,用户组 指定用户所属的附加组。
            -s Shell文件 指定用户的登录Shell。
            -u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。
    

    例子

    • useradd -c 博客专用例子用户 pysnow
      

    可以看到这个comment就是给用户添加的一串描述,实际上没有任何作用除了方便知道用户的功能,这样防止你创建的用户多了之后不知道哪个用户是用来干什么的

    • xxxxxxxxxx useradd -u 1314 -g 1111 -s /usr/bin/bash -dm /home/example pysnow
      

      注意事项

      • 如果在创建用户的时候除了用户名以外什么都不指明的话,那就会默认为一下结果

        comment的信息为空或者*
        
        家目录默认在/home下与当前该创建的用户名字相同的文件夹内
        
        uid会默认在当前所有用户中最高的uid的基础上加1,比如说我当前系统中用户uid数值最大的是1314,那我通过useradd example命令创建的用户,它的uid就该为1315
        
        gid默认会与uid相同除非你主动去配置或者修改它,而且当你通过-g添加用户组的时候,选择的gid必须是已经存在的
        
        bash默认使用/bin/sh
        
        • 通过-o选项创建的两个或者多个uid相同的用户时,会把这多个用户看做时一个用户,但是不影响这几个用户的功能,也就是说从功能上看这几个用户还是分开的
删除用户

​ 删除用户实际上就是对文件部分信息的删除,也就是删除/etc/passwd,/etc/shadow中有关该用户的信息等等

​ 命令

            ```bash

userdel [option] 用户名
```

常见的option选项有-r,即递归删除,将该用户的家目录一同删除
userdel -r 用户名
修改用户
修改用户的属性,也就是前面useradd里所提到的那些属性
usermod [option] 用户名
常见的option如上
		-c comment 指定一段注释性描述。
        -d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
        -g 用户组 指定用户所属的用户组。
        -G 用户组,用户组 指定用户所属的附加组。
        -s Shell文件 指定用户的登录Shell。
        -u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。
管理用户口令

也就是管理用户的登录密码,之前我们通过useradd命令创建的用户默认是没有口令的,也就是没有登陆密码,是别系统锁定的,无法登陆以及使用,所以我们为了登陆使用该新增用户,必须为其添加口令

passwd [option] 用户名  //修改其它用户口令,一般时用root用户进行操作
passwd [option]			   //修改默认用户名,也就是当前用户

​ 常用option如下

-l(lock) 锁定口令,即禁用账号。
-u(unlock) 口令解锁。
-d(delete) 使账号无口令。
-f(force) 强迫用户下次登录时修改口令。

注意事项

  • 普通用户为自己修改口令的时候,会询问当前用户口令,类似于qq修改密码
  • 而是用root为别人修改口令的时候不会询问,类似qq的召回密码功能
  • 当使用-d选项将某一用户或者将自己当前用户的口令修改为无的时候,下次再次尝试登陆的时候系统会默认不让你登陆,也可以使用-l选项达到同样不被允许登陆的目的
linux用户属性
用户属性
用户名:是代表用户账号的字符串。
通常长度不超过8个字符,并且由大小写字母和/或数字组成。登录名中不能有冒号(:),因为冒号在这里是分隔符。
为了兼容起见,登录名中最好不要包含点字符(.),并且不使用连字符(-)和加号(+)打头。

口令:即用户名的登录密码,一些系统中,存放着加密后的用户口令字
虽然这个字段存放的只是用户口令的加密串,不是明文,但是由于/etc/passwd文件对所有用户都可读,所以这仍是一个安全隐患。因此,现在许多Linux 系统(如SVR4)都使用了shadow技术,把真正的加密后的用户口令字存放到/etc/shadow文件中,而在/etc/passwd文件的口令字段中只存放一个特殊的字符,例如“x”或者“*”

用户标识符(uid):是一个整数,系统内部用它来标识用户。
一般情况下它与用户名是一一对应的。如果几个用户名对应的用户标识号是一样的,系统内部将把它们视为同一个用户,但是它们可以有不同的口令、不同的主目录以及不同的登录Shell等。
通常用户标识号的取值范围是0~65 535。0是超级用户root的标识号,1~99由系统保留,作为管理账号,普通用户的标识号从100开始。在Linux系统中,这个界限是500。

组标识符:类比于用户标识符,表示用户所属的组,且/etc/passwd是与/etc/group对应的

comment(注释性描述):类似于编程里面的注释,编译运行的时候不会运行,但可以起到帮助别人快速看懂代码,字段记录着用户的一些个人情况。
例如用户的真实姓名、电话、地址等,这个字段并没有什么实际的用途。在不同的Linux 系统中,这个字段的格式并没有统一。在许多Linux系统中,这个字段存放的是一段任意的注释性描述文字,用做finger命令的输出。

主目录:也就是用户的起始工作目录。
它是用户在登录到系统之后所处的目录。在大多数系统中,各用户的主目录都被组织在同一个特定的目录下,而用户主目录的名称就是该用户的登录名。各用户对自己的主目录有读、写、执行(搜索)权限,其他用户对此目录的访问权限则根据具体情况设置。

登陆shell:
用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即Shell。
Shell是用户与Linux系统之间的接口。Linux的Shell有许多种,每种都有不同的特点。常用的有sh(Bourne Shell), csh(C Shell), ksh(Korn Shell), tcsh(TENEX/TOPS-20 type C Shell), bash(Bourne Again Shell)等。
系统管理员可以根据系统情况和用户习惯为用户指定某个Shell。如果不指定Shell,那么系统使用sh为默认的登录Shell,即这个字段的值为/bin/sh。
用户的登录Shell也可以指定为某个特定的程序(此程序不是一个命令解释器)。
利用这一特点,我们可以限制用户只能运行指定的应用程序,在该应用程序运行结束后,用户就自动退出了系统。有些Linux 系统要求只有那些在系统中登记了的程序才能出现在这个字段中。
*伪用户:
这些用户在/etc/passwd文件中也占有一条记录,但是不能登录,因为它们的登录Shell为空。它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。
用户相关文件
  • 在linux中的/etc目录有一个文件叫做passwd,里面存放了当前系统的所有用户的信息,即用户的属性

  • 同样在当前/etc目录下有个文件叫shadow,用来用户口令加密后的信息,一般普通用户是无权访问的

  • 再同样在当前目录下放着一个文件叫做skel,这是一个配置文件,用于配置创建用户时的那些默认属性

接下来我将对这前两个文件进行详解

  1. /etc/passwd文件

    用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
    例子:pysnow:x:1314:1111::/home/example:/usr/bin/bash
    用户名:pysnow
    口令:x
    用户标识号:1314
    组标识号:1111
    comment描述:无
    家目录:/home/example
    登陆bash: /usr/bin/bash
    

    可以看到这个文件中每一行就是代表一个用户的信息,每行的信息都是通过分号将用户的属性分隔开的

  2. /etc/shadow文件

    由于/etc/passwd文件是所有用户都可读的,如果用户的密码太简单或规律比较明显的话,一台普通的计算机就能够很容易地将它破解,因此对安全性要求较高的Linux系统都把加密后的口令字分离出来,单独存放在一个文件中,这个文件是/etc/shadow文件。 有超级用户才拥有该文件读权限,这就保证了用户密码的安全性。

    /etc/shadow中的记录行与/etc/passwd中的一一对应,它由pwconv命令根据/etc/passwd中的数据自动产生

    它的文件格式与/etc/passwd类似

    登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
    
    例子:pysnow:!:18973:0:99999:7:::
    登录名:"登录名"是与/etc/passwd文件中的登录名相一致的用户账号
    
    加密口令:口令字段存放的是加密后的用户口令字,长度为13个字符。如果为空,则对应用户没有口令,登录时不需要口令;如果含有不属于集合 { ./0-9A-Za-z }中的字符,则对应的用户不能登录。
    
    最后一次修改时间:表示的是从某个时刻起,到用户最后一次修改口令时的天数。时间起点对不同的系统可能不一样
    
    最小时间间隔:指的是两次修改口令之间所需的最小天数。
    
    最大时间间隔:指的是口令保持有效的最大天数。
    
    警告时间:字段表示的是从系统开始警告用户到用户密码正式失效之间的天数。
    
    不活动时间:表示的是用户没有登录活动但账号仍能保持有效的最大天数。
    
    失效时间:字段给出的是一个绝对的天数,如果使用了这个字段,那么就给出相应账号的生存期。期满后,该账号就不再是一个合法的账号,也就不能再用来登录了。
    

linux用户组

每一个用户都有属于他的一个或者多个用户组(附加组),这样做的目的是方便管理,比如说当你的系统用户特别多的时候,你一个一个管理不过来,这时候你就可以安装自己的需要将他们分到不同的组,这样以后可以直接通过对组的操作从而达到批量管理用户信息

在linux中默认的是在生成用户的时候自动生成一个组,且组标识符(gid)与用户标识符(uid)一致

linux用户组管理
添加组:
groupadd [option] 用户组

常用option选项:
    -g GID 指定新用户组的组标识号(GID)。
    -o 一般与-g选项同时使用,表示新用户组的GID可以与系统已有用户组的GID相同。
删除组:
groupdel 用户组
修改组属性
groupmod [option] 用户组

常用option选项:	
    -g GID 为用户组指定新的组标识号。
    -o 与-g选项同时使用,用户组的新GID可以与系统已有用户组的GID相同。
    -n新用户组 将用户组的名字改为新名字

linux用户组相关文件

  • 用户分组是Linux 系统中对用户进行管理及控制访问权限的一种手段。

  • 每个用户都属于某个用户组;一个组中可以有多个用户,一个用户也可以属于不同的组。

  • 当一个用户同时是多个组中的成员时,在/etc/passwd文件中记录的是用户所属的主组,也就是登录时所属的默认组,而其他组称为附加组。

  • 用户要访问属于附加组的文件时,必须首先使用newgrp命令使自己成为所要访问的组中的成员。

  • 用户组的所有信息都存放在/etc/group文件中。此文件的格式也类似于/etc/passwd文件,由冒号(:)隔开若干个字段,这些字段有

组名:口令:组标识号:组内用户列表

组名:是用户组的名称,由字母或数字构成。与/etc/passwd中的登录名一样,组名不应重复。

口令:字段存放的是用户组加密后的口令字。一般Linux 系统的用户组都没有口令,即这个字段一般为空,或者是*。

组标识号:与用户标识号类似,也是一个整数,被系统内部用来标识组。

组内用户列表:是属于这个组的所有用户的列表,不同用户之间用逗号(,)分隔。这个用户组可能是用户的主组,也可能是附加组。
linux用户组注意
  • 前面我也说过,一个用户能同时具有多个用户组,其实这里的多个组就是多个附加组,所属组只有一个,怎么说呢,就是一个用户只能对应一个用户组,但是一个用户组能够对应多个用户,而为了实现对应多个用户这个操作就出现了附加组这个概念,就这个意思,这也就是为什么我们的那些虚拟机,云服务器能够提权,切换root用户等,因为同一个用户组里面的所有用户互相共享权限

    就比如说这里图中的kali,它有个附加组就是root

  • 用户可以通过newgrp切换成其它用户组,当然前提是那个用户组是你这个用户的附加组

    newgrp root  //切换到root组
    
文件操作权限修改

从前面我们已经学习了用户,已经用户组的概念,然后这些用户和用户组的权限不同

文件权限叙述

在linux中每个文件都有它权限设置,即对哪些人有着什么样的权限,对那些组又有什么样的权限

可以利用ls -l命令查看文件的权限信息

总用量 8
-rw-r--r-- 1 kali kali 210 1212 17:17 test2
-rw-r--r-- 1 kali kali  13 1212 06:53 test2~

-[权限] [所属用户] [所属组] ~~~~

在每行文件信息的最左边有一个以-开头九位字符,相应的也就对应这九种权限,然后是所属哟用户名,再是所属用户组名

  • 这个开头的-其实是文件类型
权限用户
root:
凌驾于所有用户至上,默认拥有最高权限

user:所属用户
即每个文件对应的那个属主,这个属主用户拥有这个文件的全部权限

group:用户组内非所属用户:
即这个文件的所属用户组中出去属主的其他用户,这些用户相对得又会设置一些权限

other:其它用户
出去前面几种剩下的用户,这些用户相应的又会被单独分配权限,一般来说。其它用户的权限基本为无
文件权限

文件有三种权限,分别为r w x,即读、写、执行,当然也还有一种-,代表无权限

文件权限分配

就是前面说的那个九种分配权限,这个九个字符每三个为一组,每一组分别对应权限用户,每个权限用户被分配到三种权限即

rwx     rwx     rwx
user   group   other
  • 如果没有权限的时候会以-代替
权限表示类型

Linux文件权限属性有两种表示设置方法,一种是数字,一种是符号。

Linux 文件的基本权限就有九个,分别是 owner/group/others(拥有者/组/其他) 三种身份各有自己的 read/write/execute 权限。

各权限的分数对照表如下:

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

例子:

-rwxrwx---

上面这个权限信息可以分解为rwx rwx ---
也就对属主已经属组都是rwx三项权限,对其它用户是完全无权限,那表示成数字是怎样的呢?
owner = rwx = 4+2+1 = 7
group = rwx = 4+2+1 = 7
others= --- = 0+0+0 = 0
也就是770
文件权限属性操作命令
chgrp
作用:更改文件属组

语法:
chgrp [-R] 属组名 文件名

参数选项
-R:递归更改文件属组,就是在更改某个目录文件的属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改。
chown
更改文件属主,也可以同时更改文件属组
语法:

chown [–R] 属主名 文件名
chown [-R] 属主名:属组名 文件名

参数选项
-R:递归更改文件属组,就是在更改某个目录文件的属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改。
chmod
  • 最常用的权限操作命令,用于修改上面提到的那个文件的权限属性

  • chmod修改权限的方式也就是前面提到的那两种方式,虽然第二种我没写

chmod [-R] xyz 文件或目录

选项与参数:

xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都会变更

数字改变文件属性

例子:

chmod 777 test2
修改文件test2的属性为,所有用户用于读取 写入 以及执行的权限

符号改变文件属性

chmodu g o a+(加入)r文件或目录
g-(除去)w
o=(设定)x
a

例子:

chmod a-x test2
即对所有用户的执行权限减去
切换用户命令su
whoami:查看当前使用用户的用户名
id:查看当前使用用户的uid值,以及所属组
who:查看可操作的用户
sudo [command]: 以管理员root的身份执行命令
su -[username]: 切换用户,一般用于普通用户之间互换,这个用户名字前面的-,表示切换到目标用户后使用新用户的环境,所以推荐加上
sudo su: 		切换到root用户,需要输入root用户密码
exit:     		返回切换前的用户,也可以用ctrl+D代替

文本处理命令

顾名思义就是对文本信息进行处理的命令,这里我就对一些经常用到的文本处理命令进行简单的讲解

grep

grep是一款非常强大的文本过滤命令,它支持正则表达式等匹配方式,主要配合管道符进行文件搜索的功能

比如说:

ls /bin|grep python

这一行命令就是将bin目录下中所有包含python这个字符串的文件名给过滤输出出来

当然grep这个命令工具还有许多选项option,可以自行搜索别人的文章讲解

grep [option] patten 指定文件

常见 grep 参数列表

-c 打印每个输入文件的匹配行数

-l 打印每个输入文件的名字

-n提供输入行的行号

-i忽略表达式中字母大小写。

-v反向选择,输出不含配置参数的那一行内容

-a :将 binary 文件以 text 文件的方式搜寻数据
find:

强大的文件及目录搜索命令

其实find命令不太属于文件处理的命令而是属于文件操作的,但这里我是因为刚好写到grep命令,看了一下前面好像也没有写关于find的内容,所以就将就把关于find命令的使用放在这里来

find通常与文件操作命令相连用,比若说批量删除文件之内的

find 路径 [option] "搜索内容"
路径:
可以是相对路劲也可以是绝对路劲,总之要指明要在哪个文件目录下进行搜索

option依据:
-name : 按照文件或目录的名字来搜索
-iname : 按照文件或目录的名字来搜索,不区分大小写
-size : 根据文件大小搜索
-user/group : 根据所有者/所属组查找
-amin : 根据访问时间查找
-cmin : 根据修改文件属性的时间查找
-mmin : 根据修改文件内容的时间查找
-a : 两个条件同时满足
-o : 两个条件满足任意一个即可

搜索内容:
根据所选择的依据不同而变化,一般都是所要搜索的文件名或者目录名,可以使用通配符进行搜索

ln硬链接与软链接

linux中存在硬链接和软链接两种链接方式,链接链接,顾名思义就是连接文件的东西,类似与网站的url,技能表示页面所在位置,即文件所在位置,也能通过构造URL传参从而达到对文件操作的目的,这就是链接,而lu命令就是生成文件的链接

硬连接

硬连接指通过索引节点来进行连接。在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在 Linux 中,多个文件名指向同一索引节点是存在的。比如:A 是 B 的硬链接(A 和 B 都是文件名),则 A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号相同,即一个 inode 节点对应两个不同的文件名,两个文件名指向同一个文件,A 和 B 对文件系统来说是完全平等的。删除其中任何一个都不会影响另外一个的访问。

硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

软连接

另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于 Windows 的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。比如:A 是 B 的软链接(A 和 B 都是文件名),A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号不相同,A 和 B 指向的是两个不同的 inode,继而指向两块不同的数据块。但是 A 的数据块中存放的只是 B 的路径名(可以根据这个找到 B 的目录项)。A 和 B 之间是“主从”关系,如果 B 被删除了,A 仍然存在(因为两个是不同的文件),但指向的是一个无效的链接。
ln [option] [文件绝对路径] 链接文件名
option:
-s :创建软链接

实际操作例子

  • 我在/home/kali/pysnow目录下给1.txt分别创建了一个硬链接test1,以及一个软链接test2

  • 当我分别将test1,和test2的内容进行输出时,都和1.txt的输出内容一样

    通过ls -i可以看到test1的innode节点与1.txt的innode节点一样,这样就说明这两个属于同一个链接,并且都能对磁盘上对应的信息进行操作

    当我将test1的链接删除后,同样访问test2软链接时文件内容没受影响

    ***** 综上所述*

    • 软链接相当于Windows里面的快捷方式C语言里面的指针(bushi),删除后对文件本身在磁盘里面的内容不影响
    • 默认一个文件信息对应一个硬链接,当我们通过ln命令创建出来的硬链接时,两个文件链接都能对文件在磁盘里面的存储情况进行修改,且是and关系,即必须两者都必须做出同样的操作时,操作才会生效

vim/vi

安装:
sudo apt install vim
sudo yum install vim

vim和vi都是Linux上的文本编辑工具,所有的类Unix系统都会自带vi文本编辑器,vim可以看做是vi的升级版,我们平时使用的更多的也是vim

  • vim是一款优秀的编程程序,而不是文字处理程序(vim官方说的)

  • vim也有目前大部分图形化编程软件的功能,比如说自动补全,编译器,错误跳转等,所以说它是编程软件一点都不为过

编辑模式:

  1. 命令模式(Command mode)
  2. 输入模式(Insert mode)
  3. 底线命令模式(Last line mode)

命令模式:
用户刚刚启动 vi/vim,便进入了命令模式。

此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下i,并不会输入一个字符,i被当作了一个命令。

以下是常用的几个命令:

i 切换到输入模式,以输入字符。
x 删除当前光标所在处的字符。
: 切换到底线命令模式,以在最底一行输入命令。
若想要编辑文本:启动Vim,进入了命令模式,按下i,切换到输入模式。

命令模式只有一些最基本的命令,因此仍要依靠底线命令模式输入更多命令。
输入模式
在命令模式下按下i就进入了输入模式。
在输入模式中,可以使用以下按键:
字符按键以及Shift组合,输入字符
ENTER,回车键,换行
BACK SPACE,退格键,删除光标前一个字符
DEL,删除键,删除光标后一个字符
方向键,在文本中移动光标
HOME/END,移动光标到行首/行尾
Page Up/Page Down,上/下翻页
Insert,切换光标为输入/替换模式,光标将变成竖线/下划线
ESC,退出输入模式,切换到命令模式
底线命令模式
在命令模式下按下:(英文冒号)就进入了底线命令模式。
底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。
在底线命令模式中,基本的命令有(已经省略了冒号):
q 退出程序
w 保存文件
按ESC键可随时退出底线命令模式。

通过vim 文件名命令打开文件

 光标移动:
在命令模式下可以使用键盘  h j k l  四个按键来移动光标(必须是小写英文字母,大写的含义不同,切记),也可以用方向键来移动光标
h - 左移
j - 下移
k - 上移
l - 右移

然后按下i进入编辑模式,这时候你可以看到在屏幕下方出现了insert(假装有,我这个linux换成了中文),试着写一个hello word在文件最下边

写好了要怎么保存呢,直接按下esc进入命令模式,再按一下冒号进入底线命令模式,输入wq后回车,这样文件就保存好啦

然后使用cat命令验证一下

很显然成功了,基本上这个例子所使用的操作已经够用了

文章到这里就结束啦,能不能给人家点个赞加关注啊(瘫倒)~~

前言

  • 这篇文章也是花费了我挺多心血的,首先我要表明一点,就是本人写这篇文章之前这里面的知识点起码有百分之其实以上都是不清楚的,而且写完这篇文章总共不超过24小时,字数统计为27800多字1240多行,写完的感觉就是又爽又累,所以一天linux学完除了shell编程是绰绰有余的。
  • 而我写这篇文章的目的呢主要就是为了有一个更好得吸收效果,总之这篇文章的完成度肯定是不够的,比如说好多知识都没写全面,其实也不用写全面,基本上就是把那些常用的知识点写进去就行了。
  • 总之就是因为本人知识局限性,毕竟是现学的嘛,然后再加上写的时间又不长,只是粗略看了一下排版有没有问题就溜了,所以文章中所出现的问题或者遗漏欢迎评论

    文章目录

    • 前言
      • linux基础
        • 终端
        • shell和命令提示符
        • 命令提示符
      • Linux基础命令
        • 命令格式
        • 简单命令
      • linux文件系统
        • linux下的文件类型
        • ls命令的详细使用方法
        • **常用的通配符:**
        • 常用文件操作命令和工具
        • mv 移动/改名
        • rm 删除
        • df 磁盘使用情况查看命令
        • apt系统包管理工具
        • lrzsz 上传下载工具
        • zip/unzip压缩解压工具
        • tar压缩
        • *重定向
          • 文件描述符
          • 输出重定向
          • 输入重定向
        • *管道
          • 定义
          • 注意事项
          • 总结
        • *用户权限=>用户管理&权限控制
          • 介绍
          • linux用户:
            • linux用户种类
          • linux用户管理
            • 添加用户
            • 删除用户
            • 修改用户
              • 修改用户的属性,也就是前面useradd里所提到的那些属性
            • 管理用户口令
          • linux用户属性
            • 用户属性
            • 用户相关文件
        • linux用户组
          • linux用户组管理
            • 添加组:
            • 删除组:
            • 修改组属性
        • linux用户组相关文件
            • linux用户组注意
          • 文件操作权限修改
            • 文件权限叙述
            • 权限用户
            • 文件权限
            • 文件权限分配
            • 权限表示类型
            • 文件权限属性操作命令
              • chgrp
              • chown
              • chmod
          • 切换用户命令`su`
        • 文本处理命令
          • grep
          • find:
        • ln硬链接与软链接
        • vim/vi

linux基础

终端

就是我们常见的命令行交互模式,比如说丑得要死的Windows的cmd,还有powershell等等,反正能进行命令交互的就叫终端,而我们大多数对linux的使用也是基于终端来的

终端分为设备终端、物理终端、虚拟终端、图形终端、串行终端和伪终端,我们通过终端工具由ssh协议连接服务器使用的是伪终端

shell和命令提示符

  • shell就是linux系统的解释器,类似于编程里面的编译器,我们通过高级语言编写出来的源代码需要经过编译器编译成计算机能看懂的二进制代码,从而达到执行的目的。而这个shell就类似这个功能,shell是一个与内核交互的接口,它将我们输入进去的命令转化为计算机能看懂且执行的二进制数据,linux中常见的shell为bash,当然也有许多其他的shell

Linux常见shell:sh、bash、csh、tcsh、ash

不同的组织机构开发了不同的 Shell,它们各有所长,有的占用资源少,有的支持高级编程功能,有的兼容性好,有的重视用户体验。我们也可以将shell当做一门语言,呸,他就是语言,而且他也有他的语法之内的包括什么循环条件他都有,类似于php,python这种的解释型的脚本语言,通俗理解就是连接系统内核于用户的一款软件

cat /etc/shells  //使用该命令可以查看shell列表

使用echo $SHELL命令能够查看当前设备的默认shell,显然我的这个Ubuntu默认用的就是bash,至于为啥是/bin/bash,这就与bin这个文件的作用有关了,我后面会讲

当然你也可以cd到bin这个目录将bash打印出来看看,光看肯定不是很好理解,最好还是实际体验一番,就好像是小时候鼓捣玩具赛车一样,虽然你拆开这个玩具的外壳后看到里面的电路板完全看不懂,但还是有一种动力驱使你去拆开它,而且这又不像玩具那样容易搞坏,你这个系统被你玩坏再重装不就得了,而且linux还是开源的,扯多了

  • 更换默认shell

    chsh   //输入该命令,然后输入密码后进行更换默认shell
    

这里我分享一下当时我修改默认shell时遇到的一些问题,就是最开始我修改完了默认shell之后我输入echo @SHELL发现我的默认shell一直没有变,我一直以为我哪里操作出问题了,结果是我没有重启,害,然后就是切换的shell要是特定文件的格式,比如说"/bin/bash",其中bash就是位于bin文件下的一个文件而已,记住linux核心宗旨,”一切皆为文件“,这是我师父告诉我的

还有就是记这条命令的一个小技巧,chsh == change shell,这样一来就比较好记了是吧

命令提示符

就是前面的输入命令前面的那个小框

┌──(kali㉿kali)-[~]
└─$   

其中kali@kali,前面的那个kali表示用户名,后面的那个kali表示主机名,[]表示当前所在路径,就是表示家路径的意思,最紧接着输入命令的地方的那个KaTeX parse error: Expected 'EOF', got '#' at position 16: 表示你现在是什么权限的用户,`#̲号代表的是当前用户是最高权限用…`

这里已经提到了,我就顺便讲一下绝对路径,相对路径这些

/ :根目录符
. :当前目录符
.. :上级目录符
 ~ :家目录符(用户不同,家目录也不同),比如说root用户的~的绝对路径是/root,而kali用户的~是/home/kali,pysnow用户的~是/home/pysnow
 
 
 绝对路径:路径的写法一定是由根目录 / 写起的,例如 /var/www/html
 相对路径:路径的写法不是由根目录 / 写起的,而是由上级目录(.),家目录(~)开头写的,比如说我通过执行pwd命令知道了我现在的绝对路径是/usr/lib,然后我在当前目录想使用cd ./php,是切换到了哪里?答案是/usr/lib/php,所以这个./就相当于/usr/lib,为什么要使用这种相对路径呢,当然是为了方便啊
 比如说你现在的路径是/var/www/html/898wdahwdw89ydhwh/var/www/html,你想要切换到/var/www/html/898wdahwdw89ydhwh路径上去,你是选择cd ../../../,还是选择cd /var/www/html/898wdahwdw89ydhwh,答案就显而易见了是吧

Linux基础命令

命令格式

command [option] [ARGUMENTS…]

查询命令帮助:COMMAND --help或者man COMMAND

命令补全功能:命令只输入一部分的时候按一下tab键可以补全命令,如果按一下没有反应的话是因为候选命令不止一个,连击两次tab可以显示所有以当前输入内容开头的命令,比如输入syst按一下tab会自动补全为system,再加一个c按tab他就自动补全成systemctl。 补全功能也可以在路径上使用,当你遇到一个名字很奇怪难打的时候你就可以只输入前面几个单词,然后利用自动补全功能将这个文件名补充完整,这样大大得降低了你输入命令的容错率已经提升了效率

  • 选项(OPTIONS):用于启用或关闭命令的某个或某些功能

短选项:-c 例如:-l, -h, -p ,-d等等以单个横岗开头且选项为一个字符
长选项:–word 例如: --help , --name, --dbs等
参数[ARGUMENTS]:命令的 注意:

多个选项以及多参数和命令之间使用空白字符分隔

取消和结束命令执行:Ctrl+c(强制结束),Ctrl+d(正常退出)
多个命令可以用;符号分开
演示如下:

简单命令

  • date 显示当前时间

  • cal 显示日历

  • halt,shutdown -h now,poweroff 关机

  • reboot 重启

  • whoami 查看当前用户名

  • who 查看当前所有在线会话

  • w 查看当前系统所有在线会话和正在进行的操作(正在执行的命令)

  • tty 查看当前使用的终端号是什么

  • ls命令是Linux中最常用的命令之一了,是list source的简写,这个命令简单说就是展示目录下的文件和目录。

  • cd命令也是最常用的命令之一,cd的功能非常简单,就是切换当前所在目录,跟window的cmd里面的cd用法一样

  • apt apt命令在之前也提到过,apt是ubuntu,debian,kali的包管理器(简单说就是自动装软件的)。包管理器存在的意义是因为Linux上很多软件开发都会用到很多同样的系统调用功能,比如文件IO,内存调用,那么这种重复的东西就没有必要重复开发,所以就存在了通用库,但是不是所有的库都是默认存在在系统中的,不同的软件可能要用到不同的库文件,这就叫做软件依赖关系,而apt就是用来解决这个问题的,使用apt安装软件的话会自动帮助用户处理依赖问题,自动安装上软件所需要的各种依赖,这样的话就给用户省了很多麻烦。除此之外还有yum等

    apt update 刷新存储库索引

    apt upgrade 升级所有可升级的软件包

    apt install <应用名> 安装应用
    yum list <应用名> 列出应用

    //这里可以使用通配符来搜索应用,比如 apt list apache* 这样可以搜索出以apache开头的所有应用
    apt remove <应用名> 删除应用
    apt reinstall <应用名> 重装应用

apt 命令取代的命令命令的功能
apt installapt-get install安装软件包
apt removeapt-get remove移除软件包
apt purgeapt-get purge移除软件包及配置文件
apt updateapt-get update刷新存储库索引
apt upgradeapt-get upgrade升级所有可升级的软件包
apt autoremoveapt-get autoremove自动删除不需要的包
apt full-upgradeapt-get dist-upgrade在升级软件包时自动处理依赖关系
apt searchapt-cache search搜索应用程序
apt showapt-cache show显示安装细节

linux文件系统

linux跟windows系统的文件系统的差别非常大,在Linux中,很多基本命令都与文件系统有关。而Linux的文件系统与我们所熟知的Windows文件系统的差别很大,主要体现在以下方面:

首先路径名分割符不同,linux的目录分隔是**/**,Windows系统的目录分隔符则是

路径的结构不同,Windows的绝对路径是有两个部分组成,即分盘名,与盘内路径,而linux则是只存在唯一的根目录,它是由根目录发散的树状文件结构

linux中一些固定目录的作用:

/boot:引导文件存放目录,内核文件(vmlinuz)、引导加载器 (bootloader, grub)都存放于此目录
/bin:供所有用户使用的基本命令;不能关联至独立分区, OS启动即会用到的程序
/sbin:管理类的基本命令;不能关联至独立分区,OS启动即 会用到的程序
/lib:启动时程序依赖的基本共享库文件以及内核模块文件 (/lib/modules)
/lib64:专用于x86_64系统上的辅助共享库文件存放位置
/etc:配置文件目录
/home/USERNAME:普通用户家目录
/root:管理员的家目录
/media:便携式移动设备挂载点
/mnt:临时文件系统挂载点
/dev:设备文件及特殊文件存储位置
/opt:第三方应用程序的安装位置
/srv:系统上运行的服务用到的数据
/tmp:临时文件存储位置/proc: 用于输出内核与进程信息相关的虚拟文件系统/sys:用于输出当前系统上硬件设备相关信息虚拟文件系统
/selinux: security enhanced Linux,selinux相关的安全策 略等信息的存储位置
usr: universal shared, read-only data
bin: 保证系统拥有完整功能而提供的应用程序
sbin: 同上
lib:32位使用
lib64:只存在64位系统
include: C程序的头文件(header files) share:结构化独立的数据,例如doc, man等 local:第三方应用程序的安装位置
/var: variable data files
cache: 应用程序缓存数据目录
lib: 应用程序状态信息数据 local:专用于为/usr/local下的应用程序存储可变数据; lock: 锁文件
log: 日志目录及文件
opt: 专用于为/opt下的应用程序存储可变数据;
run: 运行中的进程相关数据,通常用于存储进程pid文件 spool: 应用程序数据池
tmp: 保存系统两次重启之间产生的临时数据

linux下的文件类型

-:普通文件
d: 目录文件
b: 块设备
c: 字符设备
l: 符号链接文件
p: 管道文件pipe
s: 套接字文件socket

那这个文件类型在哪里看呢,输入ls -l

最左边那列,第一个字符可以看到基本上是**-** d l,这些就是文件的文件类型,然后紧接着就是改文件的权限,包括什么读取权限啊写入权限之内的

ls命令的详细使用方法

ls -a 显示当前目录下的所有文件(包含隐藏文件,已.开头的文件或者目录叫做隐藏文件/目录)
ls -l 显示详细的信息
ls -R 递归展示当前目录的所有非隐藏目录/文件(谨慎执行,会一下出来很多文件卡屏,如果出现可以按Linux的强制结束组合键Ctrl + c来阻止命令继续运行)
ls -ld 只展示目录
ls -1 文件分行显示
ls –S 按从大到小排序
ls –t 按mtime排序
ls –u 配合-t选项,显示并按atime从新到旧排序 ls –U 按目录存放顺序显示
ls –X 按文件后缀排序

常用的通配符:

通配符通俗易懂地说就是一种匹配目录/文件名的匹配规则,像我们这种经常做命令注入的就应该比较了解,通配符有比较多种写法,这里我列举几个最常用的:
* 匹配零个或多个字符
? 匹配任何单个字符
[0-9] 匹配数字范围

比如说什么有个flag.php文件啊,你不能直接输入flag这四个字符,但是你可以利用通配符达到同样的目的,即fla*f???????

还有一个形象的例子就是,你打游戏的时候,你觉得某个队友不爽,然后你就扣子骂过去,结果游戏把你扣得字都转化成了***,你知道这个通配符的意思,无非就是什么什么什么什么bi之内的,这个通配符可以是任何东西,有可能是你想那个意思,也有可能是完全另外一个意思,所以你要多给它一点描述让他的意思限制范围变小

这就是对通配符的实际操作,当然你也可以自己在自己的linux系统上实验一下

常用文件操作命令和工具

cp  复制:
选项参数:
-i:覆盖前提示
–n:不覆盖,注意两者顺序
-r, -R: 递归复制目录及内部的所有内容
-a: 归档,相当于-dR --preserv=all
-d:--no-dereference --preserv=links 不复制原文件,只复制链接名
--preserv[=ATTR_LIST]
-p: 等同--preserv=mode,ownership,timestamp
-v: --verbose
-f: --force
用法:
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
cp SRC DEST
注:OPTION表示参数,SRC(SOURCE)表示复制源,也就是被复制的文件或者目录 ,DEST表示复制目标,也就是复制到的目录或者文件,DIRECTORY表示目录

光看原理是不行滴,还是得上手操作一下

cp flag.php flag1 //将文件flag.php复制到当前目录,且重命名为flag1
ls   //发现该目录下多出了一个flag1,并且flag.php还是存在
cp -r ./* /tmp  //将当前目录下所有文件即文件夹都复制到/tmp里面,其中-r表示递归复制,意思是递归复制目录及内部的所有内容
ls /tmp和ls  //发现两个命令的回显一样说明完全复制成功了
cp 517pysnow flag.php flag123 mysql ./test/  //同时复制多个文件到当前目录的test文件夹里面
ls ./test    //发现里面存在文件517pysnow flag.php flag123 mysql,说明操作正确

mv 移动/改名

选项参数:

-i: 交互式,提示是否覆盖

-f: 强制移动,如果有同名文件就覆盖

用法逻辑与cp基本相同,所以逻辑请参考上面cp命令

同样也是实际操作一遍,只要cp命令没啥问题,这个也就没啥问题

rm 删除

可曾听闻过这样一串代码,从删库到跑路的那个表情包

sudo rm -rf /* 

其实语法都差不多,这三个命令,只要记住其中一个命令的具体用法,然后类比推出别的代码就行了

df 磁盘使用情况查看命令

这是一个很常用的目录,其中-h就是将输出的内容转化为方便人阅读的内容,就是直接执行df会以字节(B)来展示磁盘占用情况,加上-h就可以显示成多少G,更加易读

apt系统包管理工具

这个工具我在前面已经简单讲过了, 这个工具其实其底层原理理解起来需要比较多的知识,至少需要知道什么叫做“库”,还需要知道什么叫做“依赖关系”等等,反正涉及的挺多的,感兴趣的话可以自行百度谷歌

可在apt命令末尾加上一个-y表示默认同意请求

就是当你使用apt工具安装某一应用的时候他会询问你yes/no,这时候你只要加了这个-y的话,它就会帮你把这个yes填了,而且不会在询问你

看这次就没询问你yes/no,直接一键安装了,虽然这功能没什么卵用,但是记住还是好的,反正也不难

lrzsz 上传下载工具

服务器上传文件不只有ftp,还有其他的工具就比如说这个lrzsz,而且传输速度稳定这些性能方面不比ftp传输差多是,至于其中的原理可以自行去搜索网络通讯原理和ftp还有lrzsz的逻辑

使用方法:

先使用apt或者yum工具将lrzsz下载下来
sudo apt/yum install lrzsz -y


这个工具只有两条命令
sz: 从服务端下载文件 sendzipper,我称之为从服务器发送文件出去
rz: 上传文件至服务器 receivezipper,在服务器接受文件
是不是很好记啊,那让我们实际操作一下把
  1. 首先打开/var/www/html目录,发现有个index.html,我们将那这个文件做实验

    cd /var/www/html
    
    1. 在服务器端发送文件

      sz ./index.html
      

然后就会弹出一个对话框

这样就可以保存文件了

  1. 接下来是上传文件至服务器

    rz ./           //接受文件至当前目录
    

zip/unzip压缩解压工具

安装:
sudo apt/yum install zip -y
sudo apt/yum install unzip -y
也可以直接
sudo apt/yum install unzip zip -y

这里注意一点,就是解压的时候要给他用-O参数指明编码方式,不然会乱码,因为linux默认的编码方式ans

--把文件a压缩成a.zip

zip a.zip a

--把文件a b c压缩成a.zip

zip a.zip a b c

--把目录tmp压缩成tmp.zip(-r选项用于压缩目录)

zip -r tmp.zip tmp

--解压a.zip文件

unzip a.zip

tar压缩

类似于zip,tar是linux中最常见压缩包压缩工具,压缩包文件以.tar结尾,初次之外还有gzip,bzip2。总之这些工具都可以作为源码备份的好工具,而且这三个工具经常联合使用,一般来说联合使用都是通过tar将多个文件打包成一个文件,然后再调用gzip或者bzip2将打包好的文件进行压缩,从而生成以.tar.gz或者.tar.bz2的压缩包

打包压缩
tar [option] [压缩后的文件名] [待压缩的文件名]      
解包解压
tar [option] [将要解压的文件名] [option2] [解压路径]  //解压路径如果不选,默认是解压到当前路径
-c 打包,生成档案文件
-x 解包,解开档案文件
-v 列出归档解档的详细过程,显示进度
-f 指定档案文件名称,如果有多个选项,该选项必须放选项最后
-z 调用gzip 命令进行压缩或解压缩
-j 调用bzip2 命令进行压缩或解压缩

-C 指定解压目录,注意: 该目录必须是已经存在的。

*重定向

linux shell的重定向是个什么东西呢,顾名思义就是重新定位方向,定位什么方向呢,那就是输入和输出的方向,也就是说linux shell的重定向就是改变输入和输出的方向

接下来我讲一下输入跟输出

输入一般是指你通过键盘输入数据,然后shell将你输入的数据进行解释编译然后交给内核运行,这就是标准输入方向,也就是键盘跟程序的关系

反之,输出就是计算机将运算出来的结果通过shell等中间代理将运行的结果反映在外面的显示屏上,这就叫做输出,是从程序到显示屏的关系

文件描述符

linux下一切皆为文件,包括你输入输出用的硬件设备都是文件,linux会给每个打开的文件分配一个ID,也叫作文件描述符,

Linux 程序在执行任何形式的 I/O 操作时,都是在读取或者写入一个文件描述符。一个文件描述符只是一个和打开的文件相关联的整数,它的背后可能是一个硬盘上的普通文件、FIFO、管道、终端、键盘、显示器,甚至是一个网络连接,其中stdin,stdot,stderr都是默认开启的,可以直接对他们进行操作

输出重定向

我们平时一般的输出结果都是直接显示在显示屏上的,也就是输出带显示屏的,但是有些时候我们为了方便整理输出内容,比如说某网站的运行日志,你说你直接把输出内容通过shell显示出来,这个内容你平时又不会去用到,只有当有问题出现时,你才会想起来要找到其几天的输出结果,而这时候你又因为只对这些输出结果进行了输出而没有进行存储,导致你没地方可以查看,这样就很难受是吧,所以我们就想着把这些输出内容全部存储到一个文件里面,当我们什么时候想要查看的时候,就将这个文件里面的内容打印出来

所以总结一下:我们为什么要进行输出重定向?因为有一些输出结果我们暂时不想然它们直接显示在显示屏上,而是将它们存储起来,这就是输出重定向

标准输出重定向:
command > file  //将执行command命令的输出结果以覆盖的形式重新定位输出到file文件里面
command >> file  //将执行command命令的输出结果以叠加的形式重新定位输出到file文件里面
错误输出重定向:
command 2> file  //将执行command命令的错误的输出结果以覆盖的形式重新定位输出到file文件里面
command 2>> file //将执行command命令的错误的输出结果以叠加的形式重新定位输出到file文件里面
正确错误输出同时重定向:
command >file 2>&1  //将执行command命令的输出的正确和错误结果以覆盖的形式重新定位输出到file文件里面
command >>file 2>&1  //将执行command命令的输出的正确和错误结果以叠加的形式重新定位输出到file文件里面
command >file1 2>file2  //将正确的输出结果以覆盖方式保存在file1,将错误的输出信息以覆盖的方式保存在file2
command >>file1 2>file2  //将正确的输出结果以叠加方式保存在file1,将错误的输出信息以叠加的方式保存在file2

注意事项

  • 重定向符 > 表示覆盖,>> 表示叠加
  • 这里的2>&1中的’&'符号代表转义的意思,就是将后面的那个转义成文件描述符的意思
  • 标准输出如果没有指明,那默认就为1,即command > file中本来应该写成command 1> file的,只是这里他把这个1给省略了而已
  • 文件描述符必须紧挨着重定向符号
输入重定向

输入重定向又是一个什么操作呢,我们可以知道一般输入的数据都是键盘键入的,而这个输入重定向就是不让读取键盘输入的数据,而是我们指定读取输入的数据

标准输入重定向:
command < flie //将file中的内容已覆盖的形式作为command的输入数据进行执行
command << end  //一直读取键盘的命令,知道遇到结束符才停止读取数据,这里的结束符也就是"end",当然这个end结束符是可以自定义的
command <file1 >file2  //将file1中的内容作为command的输入,将标准输出的结果保存到file2文件中

注意事项

  • 标准输出如果没有指明,那默认就为0,即command < file中本来应该写成command 0< file的,只是这里他把这个0给省略了而已
  • 输入重定向符号<<,这个符号的作用是使用特定的分界符作为命令输入的结束标志,而不使用 Ctrl+D 键
  • <<之后的分界符可以自由定义,只要再碰到相同的分界符,两个分界符之间的内容将作为命令的输入(不包括分界符本身)

*管道

linux管道符 “|”

定义
  • 利用Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入

建议先把我写的那篇linux重定向文章前面的输出输出概念看下,这样有助于对这个管道符作用的理解

  • 当出现多个管道符是,则是将第一个管道符中命令执行的输出结果重定向作为第二个管道符|前面那个命令的输入,然后以此类推~~
注意事项
commandA | commandB
  • 这个管道符只能重定向标准输出,而不能重定向错误输出,意思是只有当|前面的命令能够执行的时候才会将输出结果作为后面那个命令的输入

  • 管道符右边的命令必须是能接受输入命令的才行

总结
  • 其实这样看来管道符的作用跟输入输出重定向其实要达到的目的是一样的,也就是改变输出和输入的方向,但是也存在不同
  • 比如说管道符是同时执行两个进程,即|符号两边的命令分别是一个进程,而重定向符>却只有一个进程
  • 重定向符的重定向输出只能是文件,即command <file,但是管道可以是命令
  • 管道符只能对标准输入和标准输出能达到重定向的目的,而重定向比它多一个错误输出的重定向功能
  • 当然输出重定向后面也是只能跟文件,即command >file

*用户权限=>用户管理&权限控制

介绍

linux是一个多用户系统,给每个用户安排相应的权限,从而达到更好得管理文件的作用,比如说一个用户分配一类文件,让这某一类文件只能让特定的用户进行敏感操作,从而防止因为误操作导致影响到其它的文件,造成系统奔溃

我在这里先对用户组的一些简单的名词进行介绍

  • uid: 用户标识符,每个用户都有一个特定的数值,这样是为了方便执行的时候内核更方便去调用关于你这个用户的信息,不同的用户他们uid一般不一样,比如说root的uid默认为0,普通用户的uid为500-6000,但也有的linux是从1000开始,就比如说kali,然后处在这两个用户之间的就是伪用户的uid
  • gid: 组表示符,意思和用户表示符一样,可以类比起来理解
  • 登陆shell: 这个在另外那篇文章有详细讲到,就是一种连接系统内核于用户的应用程序
linux用户:
linux用户种类
  • 超级用户 :root,uid=0,最高权限管理用户,可以对其它用户的权限进行修改,默认对所有文件都是最高权限,即读写执行

    root是所有类Unix系统的管理员,它的权限是最高的,因此在我们平时使用过程中就会很方便,不会存在上面权限不足的问题,但是相对的安全风险也越大,有些时候就是因为root用户执行的一条错误命令,导致系统出现不可逆的崩溃,总之一句话能力很大,责任更大 -pysnow,大家在使用root用户的时候一定要谨慎,特别是对一些系统文件进行操作的时候
    
  • 普通用户:具有操作系统有限的权限,UID值 500 – 6000

可以存在多个普通用户,普通用户的权限是有限制的,比如说一些根目录的文件只有读的权限,一些敏感文件只有执行而没有读的权限。然后这个普通用户区别于伪用户,他是存在口令的,也就是我们俗称的登陆密码,也有使用shell的权限,并且每个普通用户都有属于自己的家目录,一般位于/home目录下与自己用户同名的文件夹,比如说我的普通用户名是kali,那我的家目录就是/home/kali,这个家目录可以用~代替,当然这个家目录不一定是必须要和你用户名保持一致,你可以修改它。
我们为什么要有这个普通用户呢,首先,肯定是为了保证安全,防止误操作,其次是方便管理,比如说你把你的这个系统交给多个人用,你不可能直接将root的权限给它吧,你肯定是给它一个权限相对较低的用户,让它既能享受到这个系统带来的部分服务的同时,又能防止他们对自己的系统搞破坏。举几个现实的例子,就是校园网的管理员账号,教师账号,学生账号他们对于的权限不同,直播间的超管,普通发弹幕用户等
  • 伪用户:为了满足系统进程需要而特地创建的永久,由于没有给他分配shell,所以不能使用该进行登陆操作,uid为1-499

    又叫系统或者服务用户,一般来说这些用户的作用就是满足当执行某一系统进程时的权限需要,有些系统文件普通用户是没有权限的,所以为了执行这一命令就需要分配更高的权限,但是又不能过高,高到像root用户那样,所以就会根据不同的功能为他们常见不同的用户去执行它
     *一般来说一种命令或者服务对应一个伪用户
     *伪用户不仅是用来执行系统有关的进程,也能使一些第三方服务功能,比如说什么网站服务,可能它的某一部分需要用到高于普通用户的权限,所以在安装这门服务的时候会默认给你的系统添加一个伪用户,使服务正常运行
     *执行一个操作命令时都会以某一特定用户的名义执行,当你使用普通用户登陆的时候你想要执行reboot重启系统命令这一操作按理来说是不允许的,但是为什么在操作的时候又可以了呢,那是因为你执行这个命令的时候是以的系统伪用户中的某一个的身份执行的
    常见的系统伪用户如下:
    bin 拥有可执行的用户命令文件 
    sys 拥有系统文件 
    adm 拥有帐户文件 
    uucp UUCP使用 
    lp lp或lpd子系统使用 
    nobody NFS使用
    

    可以使用cat /etc/passwd命令查看当前系统的所有用户的详细信息

    linux用户管理
    添加用户
    useradd [option] 用户名字
    
    option选项:
            -c comment 指定一段注释性描述。
            -d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
            -g 用户组 指定用户所属的用户组。
            -G 用户组,用户组 指定用户所属的附加组。
            -s Shell文件 指定用户的登录Shell。
            -u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。
    

    例子

    • useradd -c 博客专用例子用户 pysnow
      

    可以看到这个comment就是给用户添加的一串描述,实际上没有任何作用除了方便知道用户的功能,这样防止你创建的用户多了之后不知道哪个用户是用来干什么的

    • xxxxxxxxxx useradd -u 1314 -g 1111 -s /usr/bin/bash -dm /home/example pysnow
      

      注意事项

      • 如果在创建用户的时候除了用户名以外什么都不指明的话,那就会默认为一下结果

        comment的信息为空或者*
        
        家目录默认在/home下与当前该创建的用户名字相同的文件夹内
        
        uid会默认在当前所有用户中最高的uid的基础上加1,比如说我当前系统中用户uid数值最大的是1314,那我通过useradd example命令创建的用户,它的uid就该为1315
        
        gid默认会与uid相同除非你主动去配置或者修改它,而且当你通过-g添加用户组的时候,选择的gid必须是已经存在的
        
        bash默认使用/bin/sh
        
        • 通过-o选项创建的两个或者多个uid相同的用户时,会把这多个用户看做时一个用户,但是不影响这几个用户的功能,也就是说从功能上看这几个用户还是分开的
删除用户

​ 删除用户实际上就是对文件部分信息的删除,也就是删除/etc/passwd,/etc/shadow中有关该用户的信息等等

​ 命令

            ```bash

userdel [option] 用户名
```

常见的option选项有-r,即递归删除,将该用户的家目录一同删除
userdel -r 用户名
修改用户
修改用户的属性,也就是前面useradd里所提到的那些属性
usermod [option] 用户名
常见的option如上
		-c comment 指定一段注释性描述。
        -d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
        -g 用户组 指定用户所属的用户组。
        -G 用户组,用户组 指定用户所属的附加组。
        -s Shell文件 指定用户的登录Shell。
        -u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。
管理用户口令

也就是管理用户的登录密码,之前我们通过useradd命令创建的用户默认是没有口令的,也就是没有登陆密码,是别系统锁定的,无法登陆以及使用,所以我们为了登陆使用该新增用户,必须为其添加口令

passwd [option] 用户名  //修改其它用户口令,一般时用root用户进行操作
passwd [option]			   //修改默认用户名,也就是当前用户

​ 常用option如下

-l(lock) 锁定口令,即禁用账号。
-u(unlock) 口令解锁。
-d(delete) 使账号无口令。
-f(force) 强迫用户下次登录时修改口令。

注意事项

  • 普通用户为自己修改口令的时候,会询问当前用户口令,类似于qq修改密码
  • 而是用root为别人修改口令的时候不会询问,类似qq的召回密码功能
  • 当使用-d选项将某一用户或者将自己当前用户的口令修改为无的时候,下次再次尝试登陆的时候系统会默认不让你登陆,也可以使用-l选项达到同样不被允许登陆的目的
linux用户属性
用户属性
用户名:是代表用户账号的字符串。
通常长度不超过8个字符,并且由大小写字母和/或数字组成。登录名中不能有冒号(:),因为冒号在这里是分隔符。
为了兼容起见,登录名中最好不要包含点字符(.),并且不使用连字符(-)和加号(+)打头。

口令:即用户名的登录密码,一些系统中,存放着加密后的用户口令字
虽然这个字段存放的只是用户口令的加密串,不是明文,但是由于/etc/passwd文件对所有用户都可读,所以这仍是一个安全隐患。因此,现在许多Linux 系统(如SVR4)都使用了shadow技术,把真正的加密后的用户口令字存放到/etc/shadow文件中,而在/etc/passwd文件的口令字段中只存放一个特殊的字符,例如“x”或者“*”

用户标识符(uid):是一个整数,系统内部用它来标识用户。
一般情况下它与用户名是一一对应的。如果几个用户名对应的用户标识号是一样的,系统内部将把它们视为同一个用户,但是它们可以有不同的口令、不同的主目录以及不同的登录Shell等。
通常用户标识号的取值范围是0~65 535。0是超级用户root的标识号,1~99由系统保留,作为管理账号,普通用户的标识号从100开始。在Linux系统中,这个界限是500。

组标识符:类比于用户标识符,表示用户所属的组,且/etc/passwd是与/etc/group对应的

comment(注释性描述):类似于编程里面的注释,编译运行的时候不会运行,但可以起到帮助别人快速看懂代码,字段记录着用户的一些个人情况。
例如用户的真实姓名、电话、地址等,这个字段并没有什么实际的用途。在不同的Linux 系统中,这个字段的格式并没有统一。在许多Linux系统中,这个字段存放的是一段任意的注释性描述文字,用做finger命令的输出。

主目录:也就是用户的起始工作目录。
它是用户在登录到系统之后所处的目录。在大多数系统中,各用户的主目录都被组织在同一个特定的目录下,而用户主目录的名称就是该用户的登录名。各用户对自己的主目录有读、写、执行(搜索)权限,其他用户对此目录的访问权限则根据具体情况设置。

登陆shell:
用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即Shell。
Shell是用户与Linux系统之间的接口。Linux的Shell有许多种,每种都有不同的特点。常用的有sh(Bourne Shell), csh(C Shell), ksh(Korn Shell), tcsh(TENEX/TOPS-20 type C Shell), bash(Bourne Again Shell)等。
系统管理员可以根据系统情况和用户习惯为用户指定某个Shell。如果不指定Shell,那么系统使用sh为默认的登录Shell,即这个字段的值为/bin/sh。
用户的登录Shell也可以指定为某个特定的程序(此程序不是一个命令解释器)。
利用这一特点,我们可以限制用户只能运行指定的应用程序,在该应用程序运行结束后,用户就自动退出了系统。有些Linux 系统要求只有那些在系统中登记了的程序才能出现在这个字段中。
*伪用户:
这些用户在/etc/passwd文件中也占有一条记录,但是不能登录,因为它们的登录Shell为空。它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。
用户相关文件
  • 在linux中的/etc目录有一个文件叫做passwd,里面存放了当前系统的所有用户的信息,即用户的属性

  • 同样在当前/etc目录下有个文件叫shadow,用来用户口令加密后的信息,一般普通用户是无权访问的

  • 再同样在当前目录下放着一个文件叫做skel,这是一个配置文件,用于配置创建用户时的那些默认属性

接下来我将对这前两个文件进行详解

  1. /etc/passwd文件

    用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
    例子:pysnow:x:1314:1111::/home/example:/usr/bin/bash
    用户名:pysnow
    口令:x
    用户标识号:1314
    组标识号:1111
    comment描述:无
    家目录:/home/example
    登陆bash: /usr/bin/bash
    

    可以看到这个文件中每一行就是代表一个用户的信息,每行的信息都是通过分号将用户的属性分隔开的

  2. /etc/shadow文件

    由于/etc/passwd文件是所有用户都可读的,如果用户的密码太简单或规律比较明显的话,一台普通的计算机就能够很容易地将它破解,因此对安全性要求较高的Linux系统都把加密后的口令字分离出来,单独存放在一个文件中,这个文件是/etc/shadow文件。 有超级用户才拥有该文件读权限,这就保证了用户密码的安全性。

    /etc/shadow中的记录行与/etc/passwd中的一一对应,它由pwconv命令根据/etc/passwd中的数据自动产生

    它的文件格式与/etc/passwd类似

    登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
    
    例子:pysnow:!:18973:0:99999:7:::
    登录名:"登录名"是与/etc/passwd文件中的登录名相一致的用户账号
    
    加密口令:口令字段存放的是加密后的用户口令字,长度为13个字符。如果为空,则对应用户没有口令,登录时不需要口令;如果含有不属于集合 { ./0-9A-Za-z }中的字符,则对应的用户不能登录。
    
    最后一次修改时间:表示的是从某个时刻起,到用户最后一次修改口令时的天数。时间起点对不同的系统可能不一样
    
    最小时间间隔:指的是两次修改口令之间所需的最小天数。
    
    最大时间间隔:指的是口令保持有效的最大天数。
    
    警告时间:字段表示的是从系统开始警告用户到用户密码正式失效之间的天数。
    
    不活动时间:表示的是用户没有登录活动但账号仍能保持有效的最大天数。
    
    失效时间:字段给出的是一个绝对的天数,如果使用了这个字段,那么就给出相应账号的生存期。期满后,该账号就不再是一个合法的账号,也就不能再用来登录了。
    

linux用户组

每一个用户都有属于他的一个或者多个用户组(附加组),这样做的目的是方便管理,比如说当你的系统用户特别多的时候,你一个一个管理不过来,这时候你就可以安装自己的需要将他们分到不同的组,这样以后可以直接通过对组的操作从而达到批量管理用户信息

在linux中默认的是在生成用户的时候自动生成一个组,且组标识符(gid)与用户标识符(uid)一致

linux用户组管理
添加组:
groupadd [option] 用户组

常用option选项:
    -g GID 指定新用户组的组标识号(GID)。
    -o 一般与-g选项同时使用,表示新用户组的GID可以与系统已有用户组的GID相同。
删除组:
groupdel 用户组
修改组属性
groupmod [option] 用户组

常用option选项:	
    -g GID 为用户组指定新的组标识号。
    -o 与-g选项同时使用,用户组的新GID可以与系统已有用户组的GID相同。
    -n新用户组 将用户组的名字改为新名字

linux用户组相关文件

  • 用户分组是Linux 系统中对用户进行管理及控制访问权限的一种手段。

  • 每个用户都属于某个用户组;一个组中可以有多个用户,一个用户也可以属于不同的组。

  • 当一个用户同时是多个组中的成员时,在/etc/passwd文件中记录的是用户所属的主组,也就是登录时所属的默认组,而其他组称为附加组。

  • 用户要访问属于附加组的文件时,必须首先使用newgrp命令使自己成为所要访问的组中的成员。

  • 用户组的所有信息都存放在/etc/group文件中。此文件的格式也类似于/etc/passwd文件,由冒号(:)隔开若干个字段,这些字段有

组名:口令:组标识号:组内用户列表

组名:是用户组的名称,由字母或数字构成。与/etc/passwd中的登录名一样,组名不应重复。

口令:字段存放的是用户组加密后的口令字。一般Linux 系统的用户组都没有口令,即这个字段一般为空,或者是*。

组标识号:与用户标识号类似,也是一个整数,被系统内部用来标识组。

组内用户列表:是属于这个组的所有用户的列表,不同用户之间用逗号(,)分隔。这个用户组可能是用户的主组,也可能是附加组。
linux用户组注意
  • 前面我也说过,一个用户能同时具有多个用户组,其实这里的多个组就是多个附加组,所属组只有一个,怎么说呢,就是一个用户只能对应一个用户组,但是一个用户组能够对应多个用户,而为了实现对应多个用户这个操作就出现了附加组这个概念,就这个意思,这也就是为什么我们的那些虚拟机,云服务器能够提权,切换root用户等,因为同一个用户组里面的所有用户互相共享权限

    就比如说这里图中的kali,它有个附加组就是root

  • 用户可以通过newgrp切换成其它用户组,当然前提是那个用户组是你这个用户的附加组

    newgrp root  //切换到root组
    
文件操作权限修改

从前面我们已经学习了用户,已经用户组的概念,然后这些用户和用户组的权限不同

文件权限叙述

在linux中每个文件都有它权限设置,即对哪些人有着什么样的权限,对那些组又有什么样的权限

可以利用ls -l命令查看文件的权限信息

总用量 8
-rw-r--r-- 1 kali kali 210 1212 17:17 test2
-rw-r--r-- 1 kali kali  13 1212 06:53 test2~

-[权限] [所属用户] [所属组] ~~~~

在每行文件信息的最左边有一个以-开头九位字符,相应的也就对应这九种权限,然后是所属哟用户名,再是所属用户组名

  • 这个开头的-其实是文件类型
权限用户
root:
凌驾于所有用户至上,默认拥有最高权限

user:所属用户
即每个文件对应的那个属主,这个属主用户拥有这个文件的全部权限

group:用户组内非所属用户:
即这个文件的所属用户组中出去属主的其他用户,这些用户相对得又会设置一些权限

other:其它用户
出去前面几种剩下的用户,这些用户相应的又会被单独分配权限,一般来说。其它用户的权限基本为无
文件权限

文件有三种权限,分别为r w x,即读、写、执行,当然也还有一种-,代表无权限

文件权限分配

就是前面说的那个九种分配权限,这个九个字符每三个为一组,每一组分别对应权限用户,每个权限用户被分配到三种权限即

rwx     rwx     rwx
user   group   other
  • 如果没有权限的时候会以-代替
权限表示类型

Linux文件权限属性有两种表示设置方法,一种是数字,一种是符号。

Linux 文件的基本权限就有九个,分别是 owner/group/others(拥有者/组/其他) 三种身份各有自己的 read/write/execute 权限。

各权限的分数对照表如下:

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

例子:

-rwxrwx---

上面这个权限信息可以分解为rwx rwx ---
也就对属主已经属组都是rwx三项权限,对其它用户是完全无权限,那表示成数字是怎样的呢?
owner = rwx = 4+2+1 = 7
group = rwx = 4+2+1 = 7
others= --- = 0+0+0 = 0
也就是770
文件权限属性操作命令
chgrp
作用:更改文件属组

语法:
chgrp [-R] 属组名 文件名

参数选项
-R:递归更改文件属组,就是在更改某个目录文件的属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改。
chown
更改文件属主,也可以同时更改文件属组
语法:

chown [–R] 属主名 文件名
chown [-R] 属主名:属组名 文件名

参数选项
-R:递归更改文件属组,就是在更改某个目录文件的属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改。
chmod
  • 最常用的权限操作命令,用于修改上面提到的那个文件的权限属性

  • chmod修改权限的方式也就是前面提到的那两种方式,虽然第二种我没写

chmod [-R] xyz 文件或目录

选项与参数:

xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都会变更

数字改变文件属性

例子:

chmod 777 test2
修改文件test2的属性为,所有用户用于读取 写入 以及执行的权限

符号改变文件属性

chmodu g o a+(加入)r文件或目录
g-(除去)w
o=(设定)x
a

例子:

chmod a-x test2
即对所有用户的执行权限减去
切换用户命令su
whoami:查看当前使用用户的用户名
id:查看当前使用用户的uid值,以及所属组
who:查看可操作的用户
sudo [command]: 以管理员root的身份执行命令
su -[username]: 切换用户,一般用于普通用户之间互换,这个用户名字前面的-,表示切换到目标用户后使用新用户的环境,所以推荐加上
sudo su: 		切换到root用户,需要输入root用户密码
exit:     		返回切换前的用户,也可以用ctrl+D代替

文本处理命令

顾名思义就是对文本信息进行处理的命令,这里我就对一些经常用到的文本处理命令进行简单的讲解

grep

grep是一款非常强大的文本过滤命令,它支持正则表达式等匹配方式,主要配合管道符进行文件搜索的功能

比如说:

ls /bin|grep python

这一行命令就是将bin目录下中所有包含python这个字符串的文件名给过滤输出出来

当然grep这个命令工具还有许多选项option,可以自行搜索别人的文章讲解

grep [option] patten 指定文件

常见 grep 参数列表

-c 打印每个输入文件的匹配行数

-l 打印每个输入文件的名字

-n提供输入行的行号

-i忽略表达式中字母大小写。

-v反向选择,输出不含配置参数的那一行内容

-a :将 binary 文件以 text 文件的方式搜寻数据
find:

强大的文件及目录搜索命令

其实find命令不太属于文件处理的命令而是属于文件操作的,但这里我是因为刚好写到grep命令,看了一下前面好像也没有写关于find的内容,所以就将就把关于find命令的使用放在这里来

find通常与文件操作命令相连用,比若说批量删除文件之内的

find 路径 [option] "搜索内容"
路径:
可以是相对路劲也可以是绝对路劲,总之要指明要在哪个文件目录下进行搜索

option依据:
-name : 按照文件或目录的名字来搜索
-iname : 按照文件或目录的名字来搜索,不区分大小写
-size : 根据文件大小搜索
-user/group : 根据所有者/所属组查找
-amin : 根据访问时间查找
-cmin : 根据修改文件属性的时间查找
-mmin : 根据修改文件内容的时间查找
-a : 两个条件同时满足
-o : 两个条件满足任意一个即可

搜索内容:
根据所选择的依据不同而变化,一般都是所要搜索的文件名或者目录名,可以使用通配符进行搜索

ln硬链接与软链接

linux中存在硬链接和软链接两种链接方式,链接链接,顾名思义就是连接文件的东西,类似与网站的url,技能表示页面所在位置,即文件所在位置,也能通过构造URL传参从而达到对文件操作的目的,这就是链接,而lu命令就是生成文件的链接

硬连接

硬连接指通过索引节点来进行连接。在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在 Linux 中,多个文件名指向同一索引节点是存在的。比如:A 是 B 的硬链接(A 和 B 都是文件名),则 A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号相同,即一个 inode 节点对应两个不同的文件名,两个文件名指向同一个文件,A 和 B 对文件系统来说是完全平等的。删除其中任何一个都不会影响另外一个的访问。

硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

软连接

另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于 Windows 的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。比如:A 是 B 的软链接(A 和 B 都是文件名),A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号不相同,A 和 B 指向的是两个不同的 inode,继而指向两块不同的数据块。但是 A 的数据块中存放的只是 B 的路径名(可以根据这个找到 B 的目录项)。A 和 B 之间是“主从”关系,如果 B 被删除了,A 仍然存在(因为两个是不同的文件),但指向的是一个无效的链接。
ln [option] [文件绝对路径] 链接文件名
option:
-s :创建软链接

实际操作例子

  • 我在/home/kali/pysnow目录下给1.txt分别创建了一个硬链接test1,以及一个软链接test2

  • 当我分别将test1,和test2的内容进行输出时,都和1.txt的输出内容一样

    通过ls -i可以看到test1的innode节点与1.txt的innode节点一样,这样就说明这两个属于同一个链接,并且都能对磁盘上对应的信息进行操作

    当我将test1的链接删除后,同样访问test2软链接时文件内容没受影响

    ***** 综上所述*

    • 软链接相当于Windows里面的快捷方式C语言里面的指针(bushi),删除后对文件本身在磁盘里面的内容不影响
    • 默认一个文件信息对应一个硬链接,当我们通过ln命令创建出来的硬链接时,两个文件链接都能对文件在磁盘里面的存储情况进行修改,且是and关系,即必须两者都必须做出同样的操作时,操作才会生效

vim/vi

安装:
sudo apt install vim
sudo yum install vim

vim和vi都是Linux上的文本编辑工具,所有的类Unix系统都会自带vi文本编辑器,vim可以看做是vi的升级版,我们平时使用的更多的也是vim

  • vim是一款优秀的编程程序,而不是文字处理程序(vim官方说的)

  • vim也有目前大部分图形化编程软件的功能,比如说自动补全,编译器,错误跳转等,所以说它是编程软件一点都不为过

编辑模式:

  1. 命令模式(Command mode)
  2. 输入模式(Insert mode)
  3. 底线命令模式(Last line mode)

命令模式:
用户刚刚启动 vi/vim,便进入了命令模式。

此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下i,并不会输入一个字符,i被当作了一个命令。

以下是常用的几个命令:

i 切换到输入模式,以输入字符。
x 删除当前光标所在处的字符。
: 切换到底线命令模式,以在最底一行输入命令。
若想要编辑文本:启动Vim,进入了命令模式,按下i,切换到输入模式。

命令模式只有一些最基本的命令,因此仍要依靠底线命令模式输入更多命令。
输入模式
在命令模式下按下i就进入了输入模式。
在输入模式中,可以使用以下按键:
字符按键以及Shift组合,输入字符
ENTER,回车键,换行
BACK SPACE,退格键,删除光标前一个字符
DEL,删除键,删除光标后一个字符
方向键,在文本中移动光标
HOME/END,移动光标到行首/行尾
Page Up/Page Down,上/下翻页
Insert,切换光标为输入/替换模式,光标将变成竖线/下划线
ESC,退出输入模式,切换到命令模式
底线命令模式
在命令模式下按下:(英文冒号)就进入了底线命令模式。
底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。
在底线命令模式中,基本的命令有(已经省略了冒号):
q 退出程序
w 保存文件
按ESC键可随时退出底线命令模式。

通过vim 文件名命令打开文件

 光标移动:
在命令模式下可以使用键盘  h j k l  四个按键来移动光标(必须是小写英文字母,大写的含义不同,切记),也可以用方向键来移动光标
h - 左移
j - 下移
k - 上移
l - 右移

然后按下i进入编辑模式,这时候你可以看到在屏幕下方出现了insert(假装有,我这个linux换成了中文),试着写一个hello word在文件最下边

写好了要怎么保存呢,直接按下esc进入命令模式,再按一下冒号进入底线命令模式,输入wq后回车,这样文件就保存好啦

然后使用cat命令验证一下

很显然成功了,基本上这个例子所使用的操作已经够用了

文章到这里就结束啦,能不能给人家点个赞加关注啊(瘫倒)~~

本文标签: 详解入门操作系统基础Linux