Linux学习笔记

Linux 学习笔记

1.认识Linux shell

1.什么是Linux?
  • Linux内核

  • GNU工具(GNU's Not Unix的缩写)

  • 图形化桌面环境

  • 应用软件

    1.1 Linux内核功能

    1.系统内存管理 ---内存---虚拟内存---交换空间(swap space)---页面(page)---换出(swapping out)

    2.软件程序管理 ---进程---第一个进程init进程-----开机启动进程表---/etc/inittab或 /etc/init.d

    ---/etc/rcX.d---

    Linux操作系统有5个启动运行级

    运行级为1,单用户模式(系统管理员)才能登录进行紧急的文件系统维护

    运行级为3,标准启动--大多数应用软件比如网路支持程序

    运行级为5,启动图形化X Windows系统

    3.硬件设备管理 ---驱动程序代码 a. 编译进内核的设备驱动代码 b. 可插入内核的设备驱动模块

    Linux系统将硬件设备当成特殊的文件,称为设备文件:

    • 字符型设备文件 ---处理数据时每次只能处理一个字符的设备,如大多数的调制解调器和终端

    • 块设备文件 ---处理数据时每次能处理大块数据的设备,如硬盘

    • 网络设备文件 ---采用数据包发送和接受数据的设备,包括各种网卡和一个特殊的回环设备

      Linux为系统上的每个设备创建一种称为节点的特殊文件,与设备的所有通信都通过设备节点完成。

    4.文件系统管理 ---文件系统(Virtual File System,VFS)作为每个文件系统交互的接口。

    Linux文件系统:

Linux文件系统表.png
1.2 GNU 工具
内核控制硬件设备,GNU工具来执行一些标准功能,比如控制文件和程序。

1.核心GNU工具(GNU coreutils软件包--core utilities)

a. 用来处理文件的工具

b. 用来操作文本的工具

c. 用来管理进程的工具

2\. shell 为用户提供启动程序、管理文件系统的文件以及运行在Linux上的进程的途径。bash shell

2.走进shell

命令行界面(command line interface, CLI)

1.启动shell

GNU bash shell能提供对Linux系统的交互式访问。它是作为普通程序运行的,通常是在用户登录终端时启动。登录时系统启动的设立了依赖于用户账户的配置。/etc/passwd

2.bash 手册

man 命令用来访问存储在Linux系统上的手册页面

man man 可查看与手册页相关的手册页

 man -k 关键字  关键字查找命令
Linux手册页惯用的节名.png
-help 或 --help
常见Linux目录名称.png

2.基本的bash shell命令

1.文件和目录列表
1.1 基本列表功能
ls 命令显示当前目录下的文件和目录(按字母排序)

ls -F 区分文件和目录

ls -a 显示包括隐藏文件在内的所有文件

ls -F -R 列出当前目录下包含的子目录中的文件

ls -l 显示长列表

ls -l file 过滤输出,单个输出 file 文件
1.2 创建文件
touch test 创建一个空文件 或 改变文件的修改时间

touch -a test 修改文件的访问时间 ls -l --time=atime test 显示文件test的访问时间
1.3 复制文件
cp source(源对象) destination(目标对象) 当两者都为文件时,将源文件复制成一个新文件

cp test01 test02

cp -i test01 Document/ 新文件与源文件名相同

cp -R 递归复制整个目录

cp -R Scripts/ Sub_Scripts 在执行cp -R 命令之前,目录Sub_Scripts时随着命令被创建的

cp *script Sub_Scripts/   将所有以script结尾的文件复制到Sub_Scripts目录中
1.4 链接文件

Linux中有两种不同类型的文件链接:

  • 符号链接:是一个实实在在的文件,它指向存放在虚拟目录结构中某个地方的另一个文件。这两个通过符号链接在一起的文件,彼此的内容并不相同。需要加参数-s

    ln -s data_file sl_data_file
    
  • 硬链接:会创建独立的虚拟文件,其中包含了原始文件的信息及位置,根本上时同一个文件,不要加入参数

    ln code_file hi_code_file
    
    ls -i *data_file 命令显示 *data_file文件的inode编号
    

注:只能对处于同一存储媒体的文件创建硬链接。要想在不同存储媒体的文件之间创建链接,只能使用符号链接。

1.5 重命名文件
mv fall fzll  将fall文件更改为fzll,但indoe编号和时间戳保持不变

mv fzll Pictures/ 将fzll文件移动到Pictures目录中,indoe编号与时间戳保持不变

mv Scripts new_Scripts 将目录Scripts整个目录及内容移到new_Scripts目录中
1.6 删除文件
rm -i fall 删除文件fall

rm -f file/directory  删除多个文件或目录时,用-f参数
2.处理目录
2.1 创建目录
mkdir New_Dir  创建名为New_Dir的新目录

mkdir -p New_Dir/Sub_Dir/Under_Dir 创建多个目录和子目录
2.2 删除目录
rmdir New_Dir   rmdir命令只能删除空目录

rm -ri My_Dir   删除文件,再删除目录本身
3.查看文件内容
3.1 查看文件类型
file my_file 查看文件类型
3.2 查看整个文件

1.cat命令

cat test1  查看文件文本内容
-n  参数给所有行加上行号
-b  只给有文本的行加上行号
-T  会用^I字符组合去替换文中的所有制表符

缺陷:一旦运行,就无法控制后面的操作

2.more命令

more /home/clivia/test  #显示文本文件内容,但会在显示每页数据之后停下来

more是分页工具,通过空格键或回车键 逐行向前的方式浏览文本文件。按q见退出

3.less命令

less test1  #能够识别上下键以及上下翻页键
3.3 查看部分文件

查看文件开头或结尾,比如日志文件

  1. tail命令

    tail log_file 默认查看文件末尾10行
    
    tail -n 3 log_file 显示文件最后3行
    
     -f  参数允许在其他进程使用该文件时查看文件的内容,tail命令会保持活动状态,并不断显示添加到文件中的内容。这是实时监测系统日志的绝妙方式。
    
  2. head命令

    head log_file 默认显示文件开头10行
    
    -n 参数显示开头n行
    
4. 更多的bash shell命令
4.1 探查进程
$ ps
    PID TTY             TIME CMD
    3081 pts/0      00:00:00  bash
    3029 pts/0      00:00:00  ps
$
默认情况下,ps命令只会显示运行在当前控制台下的属于当前用户的进程。
上述命令显示了进程的进程ID(Process ID,PID)、运行的终端(TTY)、进程已用的CPU时间。

Linux系统中使用的GNU ps命令支持3中不同类型的命令行参数:

  • Unix风格的参数,前面加单破折线:


    Unix风格的ps命令参数.png
      UID:启动这些进程的用户
      PID:进程的进程ID
      PPID:父进程的进程号(如果该进程是由另一个进程启动的)
      C:进程生命周期中的CPU利用率
      STIME:进程启动时的系统时间
      TTY:进程启动时的终端设备
      TIME:运行进程需要的累计CPU时间
      CMD:启动的程序名称
      F:内核分配给进程的系统标记
      S:进程的状态(O代表正在运行;S代表在休眠;R代表可运行,正等待运行;Z代表僵化,进程已结束但父进程已不存在;T代表停止)
      PRI:进程的优先级(越大的数字代表越低的优先级)
      NI:谦让度值用来参与决定优先级
      ADDR:进程内存地址
      SZ:加入进程被换出,所需交换空间的大致大小
      WCHAN:进程休眠的内核函数的地址
    
  • BSD风格的参数,前面不加破折线:


    BSD风格的ps命令参数.png
    VSZ:进程在内存中的大小,以千字节(KB)为单位
    RSS:进程在未换出时占用的物理内存
    STAT:代表当前进程状态的双字符状态码
    <:该进程运行在高优先级上
    N:该进程运行在低优先级上
    L:该进程由页面锁定在内存中
    s:该进程是控制进程
    l:该进程是多线程的
    +:该进程运行在前台
    
  • GNU风格的长参数,前面加双破折线:


    GNU风格的ps命令参数.png
    --forest  显示进程的层级信息,并用ASCII字符绘出图标
    

    可以将GNU长参数和Unix或BSD风格参数混用来定制输出

ps命令缺点:只能显示某个特定时间点的信息

top命令能够实时显示进程信息。

进程的详细列表:

PID:进程的ID
USER:进程属主的名字
PR:进程的优先级
NI:进程的谦让度值
VIRT:进程占用的虚拟内存总量
RES:进程占用的物理内存总量
SHR:进程和其他进程共享的内存总量
S:进程的状态(D代表可中断的休眠状态,R代表在运行状态,S代表休眠状态,T代表跟踪状态或停止状态,Z代表僵化状态)
%CPU:进程使用的CPU时间比例
%MEN:进程使用的内存占可用内存的比例
TIME+:自进程启动到目前为止的CPU时间总量
COMMAND:进程所对应的命令行名称,也就是启动的程序名
Linux进程信号.png
kill 3940  kill发送的是TERM信号,必须使用PID,而且你必须是进程的属主或登陆root用户

kill -s HUP 3940 强行终止,-s参数支持指定信号(用信号名或信号值)
kill -9 3940 强制无条件终止进程3940

killall http*  支持通过进程名来结束进程,此命令是结束所有以http开头的进程
4.2监测磁盘空间
  1. 挂载存储媒体

    1.1 mount 命令(需要root权限)

    默认情况下,mount命令会输出当前系统上挂载的设备列表

    mount命令提供如下4部分信息:
    1.媒体的设备文件名
    2.媒体挂载到虚拟目录的挂载点
    3.文件系统类型
    4.已挂载媒体的访问状态
    
    mount -t vfat /dev/sdb1 /media/disk  #指定为vfat格式的文件系统挂载 参数-t
    
    参数 描述
    -a 挂载/etc/fstab文件中指定的所有文件系统
    -f 使mount命令模拟挂载设备,但并不真的挂载
    -F 和-a参数一起使用时,会同时挂载所有文件系统
    -v 详细模式,将会说明挂载设备的每一步
    -I 不启用任何/sbin/mount.filesystem下的文件系统帮助文件
    -l 给ext2、ext3或XFS文件系统自动添加文件系统标签
    -n 挂载设备,但不注册到/etc/mtab已挂载设备文件中
    -p num 进行加密挂载时,从问价描述num中获得密码短语
    -s 忽略该文件系统不支持的挂载选项
    -r 将设备挂载为只读的
    -w 将设备挂载为可读写的(默认参数)
    -L label 将设备按指定的label挂载
    -U uuid 将设备按指定的uuid挂载
    -O 和-a参数一起使用,显示命令只作用到特定的一组文件系统上
    -o 给文件系统添加特定的选项

    -o参数允许在挂载文件系统时添加一些以逗号分隔的额外选项。一下为常用选项:

    ro:以只读形式挂载
    rw:以读写形式挂载
    user:允许普通用户挂载文件系统
    check=none:挂载文件系统时不进行完整性校验
    loop:挂载一个文件
    

    2.umount命令

    umount [directory | device ]  #卸载设备
    
  2. df 命令 查看磁盘空间

    df -h 
    
  3. du命令

    du命令可以显示某个特定目录(默认当前目录)的磁盘使用情况

    du命令参数:

    -c:显示所有已列出文件总的大小
    -h:按用户易读的格式输出大小,即用K替代千字节,用M替代兆字节,用G替代吉字节
    -s:显示每个输出参数的总计
    
4.3 处理数据文件
  1. 排序数据 sort命令

    sort file1  #排序file1文件,按默认语言排序
    
    sort -n file2  #按数字的值排序file2
    
    sort -M file3  #按月排序file3
    

    sort命令参数:

    单破折线 双破折线 描述
    -b --ignore-leading-blanks 排序时忽略起始空白
    -C --check=quiet 不排序,如果数据无需也不要报告
    -c --check 不排序,但检查输入数据是u是已排序;未排序的话,报告
    -d --dictionary-order 仅考虑空白和字母,不考虑特殊字符
    -f --ignore-case 默认情况下,会将大写字母排在前面;这个参数会忽略大小写
    -g --general-number-sort 按通用数值来排序(跟-n不同,把值当浮点数来排序,支持科学计数法表示的值)
    -i --ignore-nonprinting 在排序时忽略不可打印字符
    -k --key=POS1[,POS2] 排序从POS1位置开始;如果制定了POS2的话,到POS2位置结束
    -M --month-sort 用三字符月份名按月份排序
    -m --merge 将连个已排序数据文件合并
    -n --numeric-sort 按字符串数值来排序(并不转换浮点数)
    -o --output=file 将排序结果写出到指定的文件中
    -R --random-sort 按随机生成的散列表的键值排序
    --random-source=FILE 指定-R参数用到的随机字节的源文件
    -r --reverse 反序排序(升序变成降序)
    -S --buffer-size=SIZE 指定使用的内存大小
    -s --stable 禁用最后重排序比较
    -T --temporay-directory=DIR 指定一个位置来存储临时工作文件
    -t --field-separatory=SEP 指定一个用来区分键位置的字符
    -u --unique 和-c参数一起使用时,检查严格排序;不和-c参数一起使用时,仅输出第一例相似的两行
    -z --zero-terminated 用NULL字符作为行尾,而不是用换行符
    du -sh * | sort -nr #降序输出磁盘使用情况
    
  2. 搜索数据

    grep [options] pattern [file]  grep命令行格式,输出的是包含了匹配模式的结果
    例如:
    $ grep three file1
    three
    $ grep t file1
    two
    three
    $
    
    参数
    -v:输出不匹配该模式的行
    -n:显示匹配模式的行所在的行号
    -c:知道有多少行含有匹配的模式
    -e:指定多个匹配模式,比如 grep -e t -e f file1 输出含有字符t或字符f的所有行
    
    grep支持Unix风格正则表达式
    比如: grep [tf] file1
    

    egrep 支持POSIX扩展正则表达式

    fgrep支持将匹配莫斯指定为用换行符分割的一列固定长度的字符串

  3. 压缩解压数据

    Linux文件压缩工具

工具 文件扩展名 描述
bzip2 .bz2 采用Burrows-Wheeler块排序文本压缩算法和霍夫曼编码
compress .Z 最初的Unix文件压缩工具
gzip .gz GNU压缩工具,用Lempel-Ziv编码
zip .zip Windows上PKZIP工具的Unix实现
tar(打包工具) .tar tar程序打包的文件,文件大小没有改变
.tar.gz或.tgz tar程序打包的文件,其中经过gzip压缩
.tar.bz2 tar程序打包的文件,其中经过bzip2压缩
1、tar命令
打包:tar czvf FileName.tar DirName
解包:tar zxvf FileName.tar

2、.tar.gz
压缩:tar -zcvf test.tar.gz test
解压:tar -zxvf test.tar.gz

3、.tar.bz2
压缩:tar jcvf test.tar.bz2 test
解压:tar jxvf test.tar.bz2

4、gz命令
压缩:gzip FileName
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz

5、bz2命令
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z FileName

6、Z命令
解压:uncompress FileName.Z
压缩:compress FileName

7、.tar.Z
解压:tar Zxvf FileName.tar.Z
压缩:tar Zcvf FileName.tar.Z DirName

8、zip命令
解压:unzip FileName.zip
压缩:zip -r FileName.zip DirName

9、xz命令
Linux电脑中需要安装xz的工具,xz工具把tar.xz解压成tar,然后在用tar工具解压文件
解压:xz -d temp.tar.xz
    tar -xvf temp.tar
压缩:tar -cvf file.tar file
    xz -z file.tar
5.理解shell
5.1shell类型

CentOS发行版默认系统shell为 bash shell

注意:在有些发行版上,默认的系统shell和默认的交互shell并不相同,例如 Ubuntu, 交互shell为 bash shell,系统默认shell 为 dash shell。

cat /etc/passwd   查看交互shell

ls -l /bin/shell  查看系统shell
5.2 shell的父子关系

在CLI中输入bash就会生成一个子shell,输入exit退出

命令列表:在命令之间加入分号即可

进程列表:必须加括号
(pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls)
echo $BASH_SUBSHELL  #命令,返回表示没有子shell,如果返回1或者更大的数字,表明存在子shell                                                          

​ 子shell的用法:

  1. 后台模式

在后台模式中运行命令可以处理命令的同时让出CLI,以供他用。

sleep 10 进程等待10秒,会话暂停10秒中,然后返回shell CLI提示符
要将命令置入后台模式,可以在命令末尾加上字符&                  
除了ps命令外,jobs命令可以显示出当前运行在后台模式模式中的所有用户的进程(作业)
  1. 将进程列表置入后台

    (tar -cf test.tar /home/test ; tar -cf my.tar /home/clivia)&
    
  2. 协程

    协程可以同时做两件事,它在后台生成一个子shell,并在这个shell中执行命令。要进行协程处理,得使用coproc命令,还有要在子shell中执行的命令。

    $ coproc sleep 10
    [1] 2544
    $ jobs
    [1]+ Running         coproc COPROC sleep 10 &
    COPROC是 coproc命令给进程起的名字
    可以使用命令的扩展语法自己设置这个名字
    $ coproc my_job { sleep 10; }
    [1] 2570
    $
    $              jobs
    [1]+ Running         coproc my_job {sleep 10; } &
    
5.3 理解shell 的内建命令
  1. 外部命令(外部命令)

    外部命令也被称为文件系统命令,是存在于bash shell之外的程序。它不是shell程序的一部分。外部命令程序通常位于/bin、/usr/bin、/sbin、或/usr/sbin中。

    例如:ps就是一个外部命令
    $ which ps
    /bin/ps
    $
    $ type -a ps
    ps is /bin/ps
    $
    
    注意;当外部命令执行时,会创建一个子进程。这种操作被称为衍生(forking)。
    例如:ps命令
    $ ps -f
    UID      PID     PPID    C   STIME   TTY     TIME        CMD
    clivia   2741    2742    0   18:30   pts/9   00:00:00    -bash
    clivia   2801    2743    0   18:39   pts/9   00:00:00    ps -f
    $
    
  2. 内建命令

    内建命令与外建命令区别是前者不需要使用子进程来执行,是shell工具的组成部分,不需要借助外部程序文件来执行。

    cd 和 exit 命令都内建于bash shell。可以用type命令来了解某个命令是否是内建的。

    例如:
    $ type cd
    cd is a shell builtin
    $
    $ type exit
    exit is a shell builtin
    $
    

    也有命令如echo和pwd既是内建命令也有外部命令

    例如:
    $ type -a echo
    echo is a shell builtin
    echo is /bin/echo
    $
    $ which echo
    /bin/echo
    $
    注:which命令只显示出外部命令文件
    
    history 命令内建命令,查看最近用过的命令表
    
    alias 命令别名 
    alias li='ls -li'
    

3.Linux环境变量

bash shell 中,环境变量分为两类:

​ 全局变量

​ 局部变量

1.环境变量
1.1全局环境变量

查看全局变量,可以使用env或printenv命令,但显示个别环境变量的值,可以使用printenv,不能使用env命令,可以使用echo命令,需在变量前加一个美元符($)

$ printenv HOME
/home/clivia
$
$ env HOME
env: HOME: No such file or directory
$
$ echo $HOME
$ /home/clivia
$
1.2局部环境变量

Linux系统并没有一个只显示局部环境变量的命令。

set命令会显示某个特定进程设置的所有环境变量,包括局部变量、全局变量以及用户定义变量。

env、printenv、set命令的区别:
    set命令会显示出全局变量、局部变量以及用户定义变量,还会按照字母顺序对结果进行排序;env、printenv不会对变量排序,也不会输出局部变量和用户定义变量
2.设置用户定义变量
  1. 设置局部用户定义变量

    可以通过等号给环境变量赋值,值可以是数值或字符串
    
    $ echo $my_script
    
    $ my_script=Hello
    $
    $ echo $my_script
    Hello
    
    Notice:
    如果要给变量赋一个好友空格的字符串值,必须单引号来界定字符的首和尾
    
    ****所有的环境变量均使用大写字母,这是bash shell的标准惯例。如果是你自己船舰的局部变量或是shell脚本,使用小写字母***
    重要: 变量名、等号和值之间没有空格。
    
  2. 设置全局环境变量

    在设定全局环境变量的进程所创建的子进程中,该变量都是可见的。创建全局环境变量的方法是先创建一个局部环境变量,然后再把它到处到全局环境中。

    这个过程通过export命令来完成,变量名前面不需要加$.

    $ my_variable="I love linux"
    $
    $ export my_variable
    $
    $ echo $my_variable
    I love linux
    $
    $ bash
    $
    $ echo $my_variable
    I love linux
    $
    $ exit
    exit
    $
    $ echo $my_variable
    I love linux
    $
    
    Notice:
    修改子shell中全局环境变量并不会影响到父shell中该变量的值
    
3.删除环境变量

使用unset命令删除已经存在的环境变量,不需要使用$符号

Notice:
    如果要用到变量,使用$;如果要操作变量,不使用$。一个例外,使用printenv显示某个变量的值。
4.设置 PATH 环境变量

PATH环境变量定义了用于进行命令和程序查找的目录。

$ PATH=$PATH:/home/clivia/scripts
$
$ echo $PATH
/usr/local/sbin;/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/usr/games:/usr/local/games:/home/clivia/scripts
$ 

对PATH变量的修改只能持续到退出或重启系统。这种效果不能持续。

5.定位系统环境变量

让环境变量持久化。在登录Linux系统启动一个bash shell 时,默认情况下bash会在几个文件中查找命令。这些文件叫做启动文件或环境文件。bash检查的启动文件取决于启动bash shell的方式。

启动bash shell 有三种方式;

  1. 登录时作为默认登录shell
  2. 作为非登录shell的交互式shell
  3. 作为运行脚本的非交互shell
5.1 登录shell
登录shell会从5个不同的启动文件里读取命令:
/etc/profile    系统上默认的bash shell的主启动文件。每个用户登录时都会执行这个文件。
$HOME/.bash_profile
$HOME/.bashrc
$HOME/.bash_login
$HOME/.profile
位于用户的HOME目录下,每个用户都可以编辑这些文件并添加自己的环境变量,这些环境变量会在每次启动bash shell会话时生效。
5.2 交互式 shell 进程

不是登录系统时启动的shell,比如在CLI输入bash命令启动的shell,称之为交互式shell

交互式shell不会访问/etc/profile文件,只会检查用户HOME目录中的.bashrc 文件

.bashrc文件有两个作用:
1、查看/etc目录下的bashrc文件
2、为用户提供一个定制自己命名别名和私有脚本函数的地方
5.3 非交互式shell

系统执行shell脚本时用的shell,称为非交互式shell。但是当你在系统上运行脚本时,也希望能够运行一些特定启动的命令。bash shell 提供了BASH_ENV环境变量。

当shell启动一个非交互式shell进程时,它会检查这个环境变量来查看要执行的启动文件,如果有指定文件,shell会执行该文件里的命令,这通常包括shell脚本变量设置。

5.4 环境变量持久化
在/etc/profile.d目录中创建一个以.sh结尾的文件。把所有新的或修改过的全局环境变量设置放在这个文件中。

大多数发行版中,存储个人用户永久性bash shell变量的地方是$HOME/.bashrc文件

6. 数组变量

环境变量可以作为数组使用,可以存储多个值的变量。

要给某个环境变量设置多个值,可以把值放在括号里,值与值之间用空格分隔。
$ mytest=(one two three four five)
$
$ echo $mytest  # 只会显示第一个值
one
$ echo ${mytest[2]}  # 显示第三个值
three
$ 
$ echo ${mytest[*]  # 显示所有值 
one two three four five
$
$ mytest[2]=six     #改变某个索引值位置的值
$
$ echo ${mytest[2]}
six
$
$ unset mytest[2]  #删除数组中某个值
$

4.理解Linux文件权限

4.1Linux的安全性

Linux安全系统的核心时用户账户,用户权限是通过创建用户时分配的用户ID来跟踪的。UID是数值,每个用户都有唯一的UID,但在登录系统时用的不是UID,而是登录名。

4.1.1 /etc/passwd文件
/etc/passwd文件记录了一些用户有关的信息
root用户账户是Linux的系统管理员,固定分配给它的UID是0.
/etc/passwd 文件的字段包含了如下信息:
    登录用户名
    用户密码
    用户账户的UID(数字形式)
    用户账户的组ID(GID)(数字形式)
    用户账户的文本描述(称为备注字段)
    用户HOME目录的位置
    用户默认shell
    
Notice:
密码存储在/etc/passwd文件有安全隐患,现在绝大多数Linux系统将用户密码保存在另一个单独的文件(shadow文件,/etc/shadow),只有特定的程序(比如登录程序)才能访问这个文件。
4.1.2 /etc/shadow 文件

/etc/shadow文件只有root用户才能访问

/etc/shadow文件每条记录都有9个字段
    与/etc/shadow文件中的登录名字段对应的登录名
    加密后的密码
    自上次修改密码后过去的天数密码(自1970年1月1日开始计算)
    多少天后才能更改密码
    多少天后必须更改密码
    密码过期前提前多少天提醒用户更改密码
    密码过期后多少天禁用用户账户
    用户账户被禁用的日期(用自1970年1月1日到当天的天数表示)
    预留字段给将来使用

Notice:
使用shadow密码系统后,Linux系统可以更好地控制用户密码。
4.1.3 添加新用户

useradd命令创建新用户,系统默认值被设置在/etc/default/useradd中,可以使用加 -D选项的useradd命令查看所用Linux系统中的默认值。

# /usr/sbin/useradd -D
GROUP=100       #新用户会被添加到GID为100的公共组
HOME=/home      #新用户的HOME目录将会位于/home/loginname
INACTIVE=-1     #新用户账户密码在过期后不会被禁用
EXPIRE=         #新用户账户未被设置过期日期
SHELL=/bin/bash     #新用户账户将bash shell作为默认shell
SKEL=/etc/skel      #系统会将/etc/skel目录下的内容复制到用户的HOME目录下
CREATE_MAIL_SPOOL=yes   #系统为该用户账户在mail目录下创建一个用于接收邮件的文件
#
参数 描述
-c comment 给新用户添加备注
-d home_dir 为主目录指定一个名字(如果不想用登录名作为主目录的话)
-e expire_date 用YYYY-MM-DD格式指定一个账户过期的日期
-f inactive_days 指定这个账户密码过期后多少天这个账户被禁用;0表示密码一过期就立即禁用,-1表示禁用这个功能
-g initial_group 指定用户登录组的GID或组名
-G goup ... 指定用户除登录组之外所属的一个或多个附加组
-k 必须和-m一起使用,将/etc/skell目录的内容复制到用户的HOME目录
-m 创建用户的HOME目录
-M 不创建用户的HOME目录(当默认设置里要求创建时才使用这个选项)
-n 创建一个与用户登录名同名的新组
-r 创建系统账户
-p passwd 为用户账户指定默认密码
-s shell 指定默认的登录shell
-u uid 为账户指定唯一的UID

表 useradd更改默认值的参数: useradd -D -参数

参数 描述
-b default_home 更改默认的创建用户HOME目录的位置
-e expiration_date 更改默认的新账户的过期日期
-f inactive 更改默认的新用户从密码过期到账户被禁用的天数
-g group 更改默认的组名称或GID
-s shell 更改默认的登录shell
# useradd -D -s /bin/tsch
# useradd -D
GROUP=100       #新用户会被添加到GID为100的公共组
HOME=/home      #新用户的HOME目录将会位于/home/loginname
INACTIVE=-1     #新用户账户密码在过期后不会被禁用
EXPIRE=         #新用户账户未被设置过期日期
SHELL=/bin/tsch     #新用户账户将tsch shell作为默认shell
SKEL=/etc/skel      #系统会将/etc/skel目录下的内容复制到用户的HOME目录下
CREATE_MAIL_SPOOL=yes   #系统为该用户账户在mail目录下创建一个用于接收邮件的文件
#
4.1.4 删除用户

userdel命令只会删除/etc/passwd文件中的用户信息,而不会删除系统中属于该账户的任何文件,加参数-r,会删除用户的HOME目录以及邮件目录。

例如:

# /usr/sbin/userdel -r test
# ls -al /home/test
ls: cannot access /home/test: No such file or diretory
#
4.1.5 修改用户

用户账户修改工具表;

命令 描述
usermod 修改用户账户的字段,还可以指定主要组以及附加组的所属关系
passwd 修改已有用户的密码
chpasswd 从文件中读取登录名密码对,并更新密码
chage 修改密码的过期日期
chfn 修改用户账户的备注信息
chsh 修改用户账户的默认登录shell
  1. usermod

    usermod能修改/etc/passwd文件中的大部分字段,根据参数修改需要修改的字段,参数同useradd。另外还有一些选项如下:

    -l 修改用户账户的登录名
    -L 锁定账户,使用户无法登录
    -p 修改账户的密码
    -U 解除锁定,使用户能够登录
    
  2. passwd和chpasswd

    passwd更改用户密码

    # passwd test 
    

    如果需要系统中的大量用户修改密码,chpasswd命令可用,chpasswd命令能从标准输入自动读取登录名和密码对列表,给密码加密,然后为用户账户设置

  3. chsh、chfn和chage

    chsh命令用来快速修改默认的用户登录shell。使用时必须用shell的全路径名作为参数,不能只用shell名。

    # chsh -s /bin/csh test
    Changing shell for test.
    Shell changed.
    #
    

    chfn 命令提供了在/etc/passwd文件的备注字段中存储信息的标准方法,finger命令可以非常方便的查看Linux系统上的用户信息。

    chage命令用来帮助管理用户账户的有效日期。

    chage命令参数:

    参数 描述
    -d 设置上次修改密码到现在的天数
    -E 设置密码过期的日期
    -I 设置密码过期到锁定账户的天数
    -m 设置修改密码之间最少要多少天
    -W 设置密码过期前多久开始出现提醒信息
4.2 使用 Linux 组

组权限允许多个用户对系统中的对象(比如文件、目录或设备等)共享一组共用的权限。

4.2.1 /etc/group 文件

/etc/group 文件包含系统上用到的每个组的信息。

/etc/group文件共有4个字段:
    组名
    组密码
    GID     #系统账户用的组通常会分配低于500的GID值,用户组GID会从500开始分配
    属于该组的用户列表
Notice:
 千万不能通过直接修改/etc/group文件来添加用户到一个组,要用usermod命令。在添加用户到不同的组之前,要先创建组。
 用户列表某种意义上有些误导人,在列表中,有些组并没有列出用户。这并不是说这些组没有成员。当一个用户在/etc/group文件中指定某个组作为默认组时,用户账户不会作为改组成员出现在/etc/group文件中。
4.2.2 创建新组

groupadd命令可创建新组,在创建新组时,默认没有用户被分配到改组,需要usermod -G 命令来补充

usermod -G 将该组添加到用户的属组列表里
usermod -g 指定的组名会替换掉该账户的默认组
4.2.3 修改组

groupmod -g(GID)或 -n(组名) 新组名 旧组名

/usr/sbin/groupmod -n sharing shared

修改组名时,GID和组成员不会变,只有组名改变,由于所有的安全权限都是基于GID的,可以随意更改组名而不会影响文件的安全性。
4.3 理解文件权限
4.3.1 使用文件权限符
-rwxrwxr-x 1 test test 4882 2020-03-04 16:34 mytest
文件mytest有下面3组权限:
    rwx:文件的属主(设为登录名test)
    rwx:文件的属组(设为组名test)
    r-x:系统上其他人
4.3.2 默认文件权限

Linux文件权限码:

权限 二进制值 八进制值 描述
--- 000 0 没有任何权限
--x 001 1 只有执行权限
-w- 010 2 只有写入权限
-wx 011 3 有写入和执行权限
r-- 100 4 只有读取权限
r-x 101 5 有读取和执行权限
rw- 110 6 与读取和写入权限
rwx 111 7 有全部权限

umask命令用来设置所创建文件和目录的默认权限,它只是一个掩码。它会屏蔽掉不想授予该安全级别的权限

文件一开始的权限是666,减去umask值022之后,就变成644了。

把umask值设成026后,默认文件权限就变成640了,文件就变成751了

4.4 改变安全设置
4.4.1 改变权限

chmod命令用来改变文件和目录的安全性设置,

格式:  chmod options mode file
mode参数可以使用八进制模式或符号模式进行安全性设置。
例如: 
$ chmod 760 newfile
$ ls -l newfile
-rwxrw----  1   clivia  clivia  0   Feb 29  16:30   newfile
$
使用符号模式更改文件或目录权限:
[ugoa...][+-=][rwxXstugo...]
    * u 代表用户
    * g 代表组
    * o 代表其他
    * a 代表上述所有
    * + 代表增加权限
    * - 代表移除权限
    * = 将权限设置成后面的值
    
    * X 如果对象是目录或者它已有执行权限,赋予执行权限
    * s 运行时重新设置UID或GID
    * t 保留文件或目录
    * u 设置属主权限
    * g 设置属组权限
    * o 设置其他用户权限
例如:
$ chmod o+r newfile
$ chmod u-x newfile
4.4.2 改变所属关系

chown命令用来改变文件的属主,chgrp命令用来改变文件的默认属组。

chown命令格式如下:
chown options owner[.group] file
可用登录名或UID来指定文件的新属主。
# chown yang newfile    只改变属主
# chown yang.shared newfile     同时改变文件的属主和属组
# chown .yang newfile   只改变属组
如果Linux系统采用和用户登录名匹配的组名,可以只用一个条目就改变二者。
# chown test. newfile
Notice: 只有root用户能够改变文件的属主。任何属主都可以改变文件的属组,但前提是属主必须是原属组和目标属组的成员。
chgrp命令可以更改文件或目录的默认属组
$ chgrp shared newfile
$ ls -l newfile
-rw-rw-r--  1 clivia    shared      0 Feb 20 20:20 newfile
$
4.5 共享文件

Linux系统上共享文件的方法就是创建组

Linux为每个文件和目录存储了3个额外的信息位。

设置用户ID(SUID):当文件被用户使用时,程序会以文件属主的权限运行。
设置组ID(SGID):对文件来说,程序会以文件属组的权限运行;对目录来说,目录中创建的新文件会以目录的默认属组作为默认属组。
粘着位:进程结束后文件还驻留(粘着)在内存中。

要创建一个共享目录,使目录里的新文件都能沿用目录的属组,只需将改名一路的SGID位置位。

$ mkdir testdir     #创建共享目录
$ ls -l
drwxrwxr-x  2   rich    rich    4096    Feb 29 20:20 testdir/
$ chgrp shared testdir  #改变testdir的默认属组为shared
$ chmod g+s testdir     #将testdir目录的SGID位置位,保证目录中新建的文件都用shared作为默认组
$ ls -l
drwxrwxr-x  2   rich    shared  4096    Feb 29 20:20 testdir/
$ umask 002     #使环境正常工作,所有组成员的umask值设置成文件对属组成员可写
$ cd testdir
$ touch testfile    #在共享目录下创建文件,现在shared组的所有用户都能访问这个文件了
$ ls -l
total 0
-rw-rw-r--  1   rich    shared  0       Feb 29 20:21 testfile
$

5. 管理文件系统

5.1 探索Linux文件系统
5.1.1 基本的文件系统
  1. ext文件系统(扩展文件系统 extended filesystem, ext)
  2. ext2文件系统
5.1.2 日志文件系统
  1. ext3文件系统
  2. ext4文件系统
  3. Reiser文件系统
  4. JFS文件系统
  5. XFS文件系统
5.1.3 写时复制文件系统(copy-on-write,COW)
  1. ZFS文件系统
  2. Btrf文件系统
5.2 操作文件系统
5.2.1 创建分区

在存储设备上创建分区来容纳文件系统,可以用fdisk命令来实现,必须指定要分区的存储设备的设备名,另外好需要有超级用户权限

$ sudo fdisk /dev/sdb
...
...
Command (m for help):

如果是第一次给该存储设备分区,fdisk会警告你设备上没有分区表

fdisk交互式命令提示符hi用单字母命令来告诉fdisk做什么

fdisk命令表:

命令 描述
a 设置活动分区标志
b 编辑BSD Unix系统用的磁盘标签
c 设置DOS兼容标志
d 删除分区
l 显示可用的分区类型
m 显示命令选项
n 添加一个新分区
o 创建DOS分区表
p 显示当前分区表
q 退出,不保存更改
s 为Sun Unix系统创建一个新磁盘标签
t 修改分区的系统ID
u 改变使用的存储单位
v 验证分区表
w 将分区表写入磁盘
x 高级功能
5.2.2 创建文件系统

在将数据存储到分区之前,必须用某种文件系统对其进行格式化,这样Linux才能使用它。

创建文件系统的命令行程序:

工具 用途
mkefs 创建一个ext文件系统
mke2fs 创建一个ext2文件系统
mkfs.ext3 创建一个ext3文件系统
mkfs.ext4 创建一个ext4文件系统
mkreiserfs 创建一个ReiserFS文件系统
jfs_mkfs 创建一个JFS文件系统
mkfs.xfs 创建一个XFS文件系统
mkfs.zfs 创建一个ZFS文件系统
mkfs.btrfs 创建一个Btrfs文件系统

可用type命令查看文件系统工具是否安装

$ sudo mkfs.ext4 /dev/sdb1

创建文件系统后,下一步是将它挂载到虚拟目录下的某个挂载点,这样就可以将数据存储在新文件系统中了。

$ ls /mnt
$
$ sudo mkdir /mnt/my_partition
$
$ ls -al /mnt/my_partition
$
$ ls -dF /mnt/my_partition
/mnt/my_partition
$ 
$ sudo mount -t ext4 /dev/sdb1 /mnt/my_partition
$
$ ls -al /mnt/my_partition
total 24
drwxr-xr-x.     3   root    root    4096    Jun 11  09:50 .
drwxr-xr-x.     3   root    root    4096    Jun 11  09:55 ..
drwxr-----.     3   root    root    16384   Jun 11  09:50 lost+found
$
Notice:这种挂载文件系统的方法只能临时挂载文件系统。当重启Linux系统时,文件系统并不会自动挂载。要强制Linux在启动时自动挂载新的文件系统,可以将其添加到/etc/fstab文件中。
5.2.3 文件系统的检查与修复

每个文件系统都有各自可以和文件系统交互的恢复命令。fsck命令能够检查和修复大部分类型的Linux文件系统,包括ext、ext2、ext3、ext4、ReiserFS、JFS和XFS。

该命令的格式是:

fsck options filesystem
options 可选设备名、在虚拟目录中的挂载点以及分配给文件系统的唯一UUID值

fsck命令行选项:

选项 描述
-a 如果检测到错误,自动修复文件系统
-A 检查/etc/fstab文件中列出的所有文件系统
-c 给支持进度条功能的文件系统显示一个进度条(只有ext2和ext3)
-N 不进行检查,只显示哪些检查会执行
-r 出现错误时提示
-R 使用-A选项时跳过根文件系统
-s 检查多个文件系统时,依次进行检查
-t 指定要检查的文件系统类型
-T 启动时不显示头部信息
-v 在检查时产生详细输出
-y 检测到错误时自动修复文件系统
Notice:只能在为挂在的文件系统上运行fsck命令,对于大多数文件系统来说,只需卸载文件系统来检查,但根文件系统包含所欲核心的Linux命令和日志文件,所以无法卸载它,这时只需用LiveCD启动系统即可,然后再根文件系统上运行fsck命令。
5.3 逻辑卷管理

Linux逻辑卷管理器(logical volume manager,LVM)可以让你在无需重建整个文件系统的情况下,轻松地管理磁盘空间。

5.3.1 逻辑卷管理布局

逻辑卷的核心在于如何处理安装在系统上的硬盘分区。硬盘分区被称作物理卷(physical volume,PV)

多个物理卷集中在一起可以形成一个卷组(volume group,VG),逻辑卷管理系统将卷组视作一个物理硬盘。

整个结构中的最后一层是逻辑卷(logical volume,LV)。


逻辑卷管理环境.png
5.3.2 Linux中的LVM
  1. 快照

    在备份由于高可靠性需求无法锁定的重要数据时,快照非常给力。传统的备份方法在将文件复制到备份媒体上时通常要将文件锁定。快照允许你在复制的同时,保证运行关键任务的Web服务器或数据库服务器继续工作。LVM2允许创建在线逻辑卷的可读写快照。这个功能对快速故障转移或涉及修改数据的程序试验(如果失败,需要恢复修改过的数据)非常有用。

  2. 条带化

    条带化(striping),可跨多个物理硬盘创建逻辑卷。当Linux LVM将文件写入逻辑卷时,文件中的数据块会被分散到多个硬盘上。每个后继数据块会被写到下一个硬盘上。

    条带化有助于提高硬盘的性能,因为Linux可以将文件的多个数据块同时写入多个硬盘,而无需等待单个硬盘移动读写磁头到多个不同位置。读取顺序访问文件同样如此,LVM可同时从多个硬盘读取数据。

    Notice:
    LVM条带化不同于RAID条带化。LVM条带化不提供用来创建容错环境的校验信息。事实上,LVM条带化会增加文件因硬盘故障而丢失的概率。单个硬盘故障可能会造成多个逻辑卷无法访问。
    
  3. 镜像

    和物理分区一样,LVM逻辑卷也容易受到断电和磁盘故障的影响,一旦文件系统损坏,就有可能再也无法恢复。对于涉及大量数据变动的系统,比如数据库服务器,自上次快照之后可能要存储成百上千条记录。

    LVM镜像可以解决这一问题。

    LVM镜像的特点:
     1.镜像是一个实时更新的逻辑卷的完整副本。创建镜像逻辑卷时,LVM会将原始逻辑卷同步到镜像副本中。
     2.同步完成后,LVM会为文件系统的每次写操作执行两次写入—————一次写入到主逻辑卷,一次写入到镜像副本。这会降低系统的写入性能。
    
5.3.3 使用Linux LVM

如何创建LVM来帮助组织系统上的磁盘空间。

  1. 定义物理卷

    将硬盘上的物理分区转换成Linux LVM使用的物理卷区段。使用fdisk命令,-t 改变分区类型。

    用分区来创建实际的物理卷。用pvcreate命令来完成--- sudo pvcreate /dev/sdb1,用pvdisplay命令来显示一创建的物理卷列表。

  2. 创建卷组

    从物理卷中创建一个或多个卷组,使用vgcreate命令

    $ sudo vgcreate Voll /dev/sdb1
     Volume group "Voll" successfully created
    $
    vgcreate命令需要一些命令行参数来定义卷组名以及用来创建的物理卷名。
    sudo vgdisplay Voll 显示创建卷组的细节。
    
  3. 创建逻辑卷

    使用lvcreate命令来创建逻辑卷。

    lvcreate命令选项:

    选项 长选项名 描述
    -c --chunksize 指定快照逻辑卷的单位大小
    -C --contiguous 设置或充值连续分配策略
    -i --stripes 指定条带数
    -I --stripesize 指定每个条带的大小
    -l --extents 指定非陪给新逻辑卷的逻辑区段数,或者要用的逻辑区段的百分比
    -L --size 指定分配给新逻辑卷的硬盘大小
    --minor 指定设备的次设备号
    -m --mirrors 创建逻辑卷镜像
    -M --persistent 让次设备号一直有效
    -n --name 指定新逻辑卷的名称
    -p --permission 为逻辑卷设置读/写权限
    -r --readahead 设置预读扇区数
    -R --regionsize 指定将镜像分成多大的区
    -s --snapshot 创建快照逻辑卷
    -z --zero 将新逻辑卷的前1KB数据设置为零
    示例:
    $ sudo lvcreate -l 100%FREE -n lvtest Voll
     Logical volume "lvtest" created
    $
    
    sudo lvdisplay Voll 命令查看创建的逻辑卷的详细情况。
    
  4. 创建文件系统

    $ sudo mkfs.ext4 /dev/Voll/lvtest  #创建ext4的文件系统
    $
    $ sudo mount /dev/Voll/lvtest /mnt/my_partition  #挂载逻辑卷到/mnt/my_partition
    
  5. 修改LVM

    Linux LVM的好处在于能够动态修改文件系统。

    Linux LVM常用的修改命令如下:

    命令 功能
    vgchange 激活和禁用卷组
    vgremove 删除卷组
    vgextend 将物理卷加到卷组中
    vgreduce 从卷组中删除物理卷
    lvextend 增加逻辑卷的大小
    lvreduce 减小逻辑卷的大小

6.安装软件程序

  • 安装软件
  • 使用Debian包
  • 使用Red Hat包
6.1 基于Debian的系统

dpkg命令是基于Debian系PMS工具的核心。

  • apt-get
  • apt-cache
  • aptitude

aptitude工具本质是apt工具和dpkg的前端。dpkg是软件包管理系统工具,而aptitude则是完整的软件包管理系统。

6.1.1 用aptitude管理软件包
aptitude show package_name  # 显示软件包详细信息
示例:
$ aptitude show mysql-client # 显示包mysql-client的详情
# 注:无法通过aptitude看到一个细节是所有跟某个特定软件包相关的所有文件的列表,可用dpkg命令实现

dpkg -L package_name
示例:
$ dpkg -L vim-common # dpkg列出vim-common软件包所安装的全部文件

dpkg --search absolute_file_name    # 查找某个特定文件属于哪个软件包,使用时必须用绝对文件路径
示例:
$ dpkg --search /usr/bin/xxd
vim-common: /usr/bin/xxd
$
6.1.2 用aptitude安装软件包
aptitude search package_name  #搜索软件包
示例:
$ aptitude search wine
$
aptitude install package_name #安装软件包
$
$ aptitude install wine
$
6.1.3 用 aptitude 更新软件
aptitude safe-upgrade   # 此命令部不需要使用软件包名称作为参数。因为safe-upgrade选项会将所有已安装的包更新到软件仓库中的最新版本,更利于系统稳定
6.1.4 用 aptitude 卸载软件
remove 选项是只删除软件包而不删除数据和配置文件
$ aptitude remove wine
purge 选项是把软件包和相关的数据和配置文件都删除
$ aptitude purge wine
# 注:要看软件包是否已删除,可以再用aptitude的search选项。如果在软件包名称的前面看到一个c,意味着软件已删除,但配置文件尚未从系统删除;如果前面是个p的话,说明配置文件也已删除。
6.1.5 aptitude 仓库

aptitude软件仓库具体存储位置在文件 /etc/apt/sources.list 中。

可用下面的结构来指定仓库源
deb (or deb-src) address distribution_name package_type_list
deb或deb-src的值表明了软件包的类型。
address条目是软件仓库的web地址
distribution_name条目是这个特定软件仓库的发行版版本的名称
package_type_list 条目可能不止一个词,它还表明仓库里面有什么类型的包
6.2 基于 Red Hat 的系统
  • yum:在Red Hat和Fedora中使用

  • urpm:在Mandriva中使用

  • zypper:早openSUSE中使用

    这些都是基于rpm命令行工具

6.2.1 列出已安装包
$ yum list installed
$ yum list installed > installed_software
# yum擅长找出某个特定软件包的详细信息。
$ yum list xterm
# yum能够找到系统上某个特定文件属于哪个软件包
$ yum provides file_name
$ yum provides /etc/yum.conf # 示例
6.2.2 用 yum 安装软件
yum install package_name
$ yum install xterm
# 可以手动下载rpm安装文件并用yum安装,也叫作 本地安装,基本命令是:
$ yum localinstall package_name.rpm
6.2.3 用 yum 更新软件
yum list updates    # 列出所有安装包的可用更新
yum update package_name     # 对特定的软件包进行更新
yum update      # 对更新表中所有的包进行更新
6.2.4 用 yum 卸载软件
yum remove package_name     # 只删除软件包而保留配置文件和数据文件
yum erase package_name      # 删除软件包所有的文件
6.2.5 处理损坏的包依赖关系

有时在安装多个软件包时,某个包的软件依赖关系可能会被另一个包的安装覆盖掉,这叫作损坏的包依赖关系(broken dependency)

$ yum clean all     # 清理放错位置的文件

$ yum deplist package_name      # 显示所有包的库依赖关系以及什么软件可以提供这些库依赖关系

$ yum update --skip-broken      # --skip-broken选项允许你忽略依赖关系损坏的那个包,继续区更新其他软件包,这可能救不了损坏的包,但至少可以更新系统上的其他包。
6.2.6 yum 软件仓库
yum repolist    # 列出软件的仓库

yum 的仓库定义的文件位于/etc/yum.repos.d ,需要添加正确的URL,并获得必要的加密密钥
6.3 从源码安装

以 安装sysstat软件包为例,先是在官网下载它的tarball形式的软件包--sysstat-11.1.1.tar.gz

$ tar -zxvf sysstat-11.1.1.tar.gz   # 解压软件包
$ cd sysstat-11.1.1     # 进入sysstat-11.1.1解压目录
$ ls    # 在目录列表中,应该能够看到README或AAAREADME文件。这个文件包含和该软件安装所需要的操作。
$ ./configure   # 检查配置信息
$ make      # make命令编译源码和链接器为这个包创建最终的可执行文件
$ make install      # 安装sysstat包

7. 使用编辑器

  • vim编辑器
  • nano编辑器
  • emacs编辑器
  • KWrite编辑器
  • Kate编辑器
  • GNOME编辑器
7.1 vim编辑器
7.1.1 vim基础

Ubuntu环境中安装vim软件

$ sudo apt-get install vim
.
.
.
$ readlink -f /usr/bin/vi
/usr/bin/vim.basic
$
$ vim myprog.c
# 只要键入vim或vi命令和要编辑的文件的名字就可以启动vim编辑器,如果指定文件不存在,vim会开辟一段新的缓冲区来编辑。

vim编辑器有两种操作模式:

  • 普通模式----打开新建文件时,vim编辑器会进入普通模式,vim会将按键解释成命令
  • 插入模式----按下i键可进入插入模式,按esc键退出插入模式回到普通模式
普通模式中的一些键的使用:
    h:左移一个字符
    j:下移一行(文本中的下一行)
    k:上移一行(文本中的上一行)
    l:右移一个字符
    PageDown(或Ctrl+F):下翻一屏
    PageUp(或Ctrl+B):上翻一屏
    G:移到缓冲区的最后一行
    num G:移动到缓冲区的第num行
    gg:移到缓冲区的第一行

vim编辑器普通模式下的命令行模式---按冒号键进入。

    q:如果未修改缓冲区数据,退出
    q!:取消所有对缓冲区数据的修改并退出
    w filename:将文件保存到另一个文件中
    wq:将缓冲区数据保存到文件中并退出
7.1.2 编辑数据

在插入模式下,可以向缓冲区插入数据。

vim编辑命令表:

命令 描述
x 删除当前光标所在位置的字符
dd 删除当前光标所在行
dw 删除当前光标所在位置的单词
d$ 删除当前光标所在位置至行尾的内容
J 删除当前光标所在行行尾的换行符(拼接行)
u 撤销前一编辑命令
a 在当前光标后追加数据
A 在当前光标所在行行尾追加数据
r char 用char替换当前光标所在位置的单个字符
R text 用text覆盖当前光标所在位置的数据,知道按下ESC键

有些编辑命令允许使用数字修饰符来指定重复该命令多少次。比如,命令2x会删除从光标当前位置开始的两个字符,命令5dd会删除从光标当前所在行开始的5行。

7.1.3 复制和粘贴

vim在删除数据时,实际上会将数据保存在单独的一个寄存器中。

yy:复制 nyy:向下复制n行
p:粘贴在下一行,P粘贴到上一行 (一定要和yy连用)
u:复原上一个操作
ctrl+r:重做上一个操(和u一起用)
.:重复上一个操作(复制,粘贴)

7.1.4 查找和替换

查找:输入一个查找字符------按下斜线(/)键,光标会跑到消息行,输入查找的文本,按下回车键。

替换:命令格式------ :/s/old/new/,用new来替代old内容

:s/old/new/g:一行命令替换所有old
:n,ms/old/new/g:替换行号n和m之间所有的old
:%s/old/new/g:替换整个文件中的所有old
:%s/old/new/gc:替换整个文件中的所有old,但在每次出现时提示
7.2 nano 编辑器

nano是一款简单易用的控制台模式文本编辑器,大多数Linux发行版都默认安装了nano文本编辑器。

CentOS:执行yum -y install nano

Debian:执行apt-get install -y nano


nano编辑器.png
nano 路径/文件名     # 创建或打开文件

脱字符()表示Ctrl键,X表示的就是组合键Ctrl+X

nano控制命令:

命令 描述
CTRL+C 显示光标在文本编辑器缓冲区中的位置
CTRL+G 显示nano的主帮助窗口
CTRL+J 调整当前文本段落
CTRL+K 剪切文本行,并将其保存在剪切缓冲区
CTRL+O 将当前文本编辑缓冲区的内容写入文件
CTRL+R 将文本读入当前文本编辑缓冲区
CTRL+T 启动可用的拼写检查器
CTRL+U 将剪切缓冲区中的内容放入当前行
CTRL+V 翻动到文本编辑缓冲区中的下一页内容
CTRL+W 在文本编辑缓冲区中搜索单词或短语
CTRL+X 关闭当前文本编辑缓冲区,退出nano,返回shell
CTRL+Y 翻动到文本编辑缓冲区中的上一页内容
7.3 emacs 编辑器

安装emacs编辑器,它有控制台模式和图形模式

$ sudo apt-get install emacs    # Ubuntu发行版安装
.
.
$ sudo yum install emacs    # CentOS发行版安装
7.3.1 控制台中更实用emacs

emacs编辑器使用包括控制键(PC键盘上的Ctrl键,C-)和Meta键(Alt键,M-)组合使用。

例如:要输入Ctrl+x组合键,文档显示成C-x。

使用emacs编辑文件:

$ emacs test.c   # 创建或打开文件tes.c

emacs编辑器移动光标的命令:

命令 描述
C-p 上移一行(文本中的前一行)
C-b 左移一字符
C-f 右移一字符
C-n 下移一行(文本中的下一行)
M-f 右移到下个单词
M-b 左移到上个单词
C-a 移至行首
C-e 移至行尾
M-a 移至当前句首
M-e 移至当前句尾
M-v 上翻一屏
C-v 下翻一屏
M-< 移至文本的首行
M-> 移至文本的尾行
C-x C-s 保存当前缓冲区到文件
C-z 退出emacs并保存在这个会话中继续进行,以便你切回
C-x C-c 退出emacs并停止该程序

表中,C-x命令叫做扩展命令,提供了另一组命令

7.3.2 在GUI环境中使用 emacs
emacs编辑器.png
7.4 KDE 系编辑器

如果所用的Linux发行版中采用的是KDE桌面,那么KDE项目官方有两种流行的文本编辑器。

  • KWrite:单屏幕文本编辑程序
  • Kate:功能全面的多窗口文本编辑程序
7.5 GNOME 编辑器
7.5.1 启动 gedit

大多数的GNOME桌面环境都将gedit放在Accessories面板菜单条目中,Unity桌面环境中,进入Dash-->Search-->输入gedit。或从命令行输入命令启动:

$ gedit file.sh new.c       # 打开两个文件
7.5.2 基本的 gedit 功能

工具栏条目:

  • File:处理新文件、保存已有文件以及打印文件
  • Edit:在工作缓冲区域操作文本并设定编辑器偏好设置
  • View:设定显示在窗口中的编辑器功能以及文本的高亮显示模式
  • Search;在工作缓冲区域查找和替换文本
  • Tools:访问安装在gedit上的插件工具
  • Documents:管理缓冲区中打开文件
  • Help:访问完整的gedit手册

你可能感兴趣的:(Linux学习笔记)