杨记

碎片化学习令人焦虑,系统化学习使人进步

0%

Linux入门

Linux入门学习,介绍了Linux常用命令,Linux文件系统权限,进程,软件包管理,Shell编程的基础

学习自华为iLearnX官网

Linux简介

Linux内核版本

image-20220121152327120


Linux安装

  • 安装程序的引导方式
    • RHEL支持从光盘和USB存储设备引导安装程序
  • 安装程序包读取软件包的方式
    • 从光盘读取软件包进行安装是RHEL提供的缺省安装方式
    • 安装程序可读取硬盘中保存的安装光盘镜像文件(ISO文件)进行安装
    • 安装程序可从NFS、FTP和HTTP网络服务器中读取文件进行安装

Linux安装过程

  • 启动安装程序
    • 设置主机引导设备为光盘驱动器
    • 从安装光盘启动主机
  • 检测安装光盘的完整性
  • 安装程序的配置过程
    • 安装包选择全部安装
    • 划分分区,划分一个swap(物理内存两倍),个/boot(100M)和个/即可
  • 文件复制过程
  • 安装过程结束

Linux发行版本

  • Linux发行版的名称和版本号是由发行版的维护者決定的
    • RHEL4,5,6是由 Red Hat公司发布的
    • Suse Linux10是由 Novell松司发布的
    • Debian Linux3.1是由 Debian维护社区发布的

Linux在企业中的应用

  • Linux作为 Internet网络服务器的应用
    • 提供Web、DNS、FTP和E-mai服务
  • Linux作为中小企业内部服务器的应用
    • 提供网络代理、网络防火墙、DHCP和文件共享服务
  • Linux作为桌面环境的应用
    • 可选择使用KDE、 GNOME等多种桌面环境
  • Linux1作为软件开发环境的应用
    • 支持C、C++、PERL、PHP、JAVA和 Python语言的开发

常用shell分类

  • Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。是在 Linux内核与用户之间的解释器程序,现在 Linux通常指/bin/bash解释器来负责向内核翻译以及传达用户/程序指令,sheIl相当于操作系统的“外壳“
  • ksh .profile
  • bash .bash profile

Linux常见命令介绍


Linux常见命令格式

  • 命令名称【命令参数】【命令对象】注意,命令名称、命令参数、命令对象用空格键分割开
  • Linux命令及其参数是严格区分大小写
  • Linux文件名严格区分大小写
  • 查看指令用法 man/help 命令

查看文件和文件夹

  • ls命令
    • Is命令的功能是显示指定目录下的文件目录清单
    • 相当于dos下的di命令,而且其参数更加丰富多样
  • ls示例一 不带参数

    • ls
    • 功能:显示指定目录中的文件清单,如果没有指定任何目录,则默认为当前目录。
  • ls示例二 显示隐含文件

    • ls -a
    • 参数-a的功能:显示隐含文件
    • 说明:若文件名以 “.” 开头,则认为是隐含的,进而普通的ls命令不显示以 “.” 开头的文件;所以要完全显示某目录下的文件清单,必须加上 -a 参数オ行。
  • ls示例三 长格式输出

    • ls -l
    • 参数 -l 的功能是:以长格式列表输出指定目录中的文件清单。
    • 解释长格式输出的内容如下:
    • 文件类型 文件权限 硬连接数 属主 属组 大小 日期 时间 文件名
          `d   rwxrwxr-x   2   user1 user1 4096 Aug 17 09:10  abc` 
      
  • ls示例四 递归显示

    • ls -R
    • 参数-R的功能是:递归显示指定目录下的文件清单,即会显示指定目录分支内各子目录中的文件清单。

image-20220407113940167

文件类型

标识 文件类型
- 普通文件
d 目录文件
c 字符设备文件
b 块设备文件
p 管道或FIFO
l 符号链接
s 套接字

查看命令使用

name --help


显示当前路径

  • pwd命令
  • 功能:显示当前目录

新建目录

  • mkdir
  • 示例一:mkdir abc
    • 功能:在当前目录下创建目录abc
  • 示例二:创建多级目录
    • mkdir -p a/b/c
    • 功能:参数 -p 功能是如果要创建的目录的父目录,则先创建其父目录,再创建该目录;
    • 如果指定的目录存在,则不影响原目录,也不会报错。

创建文件

  • touch
  • 示例一:创建空文件

    • touch myfile
    • 功能:如果myfile不存在,则创建一个大小为0字节名为myfile的空文件
  • 示例二:改变文件的最后修改时间

    • touch myfile
    • 功能:如果myfile已存在,则将改变myfile的最后修改时间。

文件复制

  • cp
  • 示例一:复制文件
    • cp /etc/php.* abc
    • 功能:将 /etc 目录下以 php. 开头的文件复制到目录abc中
    • 说明:”*” 是通配符,可以匹配多个字符;”?”只能匹配一个字符
    • 增加参数 -r 忽略文件夹
  • 示例二:复制目录
    • cp -R /etc abc
    • 功能:增加了参数-R,就能将目录 /etc 下面的所有子目录和文件都能复制到目录abc中

文件移动

  • mv
  • 示例一:将文件移动到目录中

    • mv myfile mydir1
    • 功能:如果mydir1存在且是个目录,则将文件myfile移动到目录mydir1中
  • 示例二:修改文件名

    • mv myfile myfile2
    • 功能:将文件(或目录)myfile改名为myfile2

删除空目录

  • rmdir
  • rmdir -p mydir
    • 功能:删除指定的空目录
    • -p 递归删除目录mydir1,当子目录删除后其父目录为空是,也一并删除。如果整个路径被删除或由于某种原因保留部分路径,则系统在标准输出上显示相应的信息。

删除

  • rm
  • 示例一:删除文件

    • rm php.ini
    • 功能:删除指定的文件php.ini
  • 示例二:删除目录

    • rm -rf abc
    • 功能:参数 -r 是递归的意思,即可以删除非空目录;参数 -f 是强制的意思。

显示文件内容

  • cat
  • 示例一:显示文件内容

    • cat myfile
    • 功能:显示指定文件myfile的内容
  • 示例二:创建文件

    • cat > myfile2
    • Welcome to Linux World!
    • 按 ctrl+d 结束输入
    • 功能:利用输出重定向符 “>” 来创建简短的文本文件 myfile2 。

分屏显示

  • more 和 less 命令
    • more /etc/httpd/conf/httpd.conf
    • 功能:分屏显示指定问津 httpd.conf 的内容,非常适合显示超过一屏的文本文件。
      • 每按一下空格键,向后翻一屏;每按一下回车键,向后翻一行。
      • more 可以按 B 回翻一页
    • 说明:与more功能很相似,只不过less功能更强大,支持PageUp键向前翻屏,及PageDown向后翻屏,按q退出

显示文件头内容

  • head
  • 示例一:显示文件头10行内容
    • head /etc/httpd/conf/httpd.conf
    • 功能:默认显示指定文件的头10行的内容
  • 示例二:显示文件头n行内容
    • head -n 19 /etc/httpd/conf/httpd.conf
    • 功能:参数-n设置显示指定行数

显示文件最后内容

  • tail
  • 示例一:显示文件最后10行
    • tail /etc/httpd/conf/httpd.conf
    • 功能:默认显示指定文件的末尾10行内容
  • 示例二:显示文件末尾n行内容
    • tail -n 19 /etc/httpd/conf/httpd.conf
    • 功能:参数-n设置显示指定行数

建立硬连接和软连接

  • ln 建立硬连接
    • ln myfile myfile.hlink
    • 功能:为文件myfile创建名为myfile.hlink的硬连接
    • ls -l可以查看到两个文件一样大,但本质上没有复制文件,myfile的硬连接计数增加
  • ls -il
  • 说明:通过 ls -il 命令可以看出myfile与myfile.hlink的i节点号(最左边的数)是一样的,即硬连接与原文件共用同一个i节点,请注意两个文件的连接数。
  • ln 建立软连接
    • ln -s myfile myfile.slink 这里为相对路径,移动myfile.slink文件则无效了
    • 功能:为文件myfile创建名为myfile.slink的软连接
    • 说明:试试用rm命令删除myfile文件,注意观察连接数的变化,再分别访问myfile.hlink和myfile.slink,看看是否能够正常访问。
    • 软连接myfile.slink无效了
    • ln -s ~/myfile myfile.slink 使用绝对路,移动myfile.slink仍然有效,移动源文件则无效
    • myfile.slink 文件大小 为保存的 路径信息
  • 目录不可以创建硬连接,可以创建软连接

查找命令

  • which
  • 示例
    • which cp
    • which updatedb
    • 功能:显示命令的绝对路径
    • 注意:该命令只能在命令搜索路径指定的目录中去查找命令或程序
  • whereis
  • 示例
    • whereis ln
    • 功能:查询指定命令所在目录以及帮助文档所在目录
  • type 查找一个命令的位置
    • type cd 显示 cd is a shell builtin
    • type cp 显示cp is /usr/bin/cp
    • 还可以加上参数 -a

切换用户

  • su
  • 示例:
    • su - root
    • 功能:切换当前用户的身份
    • su命令带有参数 “-” ,其含义是改变身份的同时也改变了工作环境

文件查找

  • find
  • 示例——按文件名查找
    • find / -name "dhcpd*"
    • 功能:参数 -name 指明按文件名进行查找,即从 / 目录开始查找以”dhcpd”开头的所有文件
  • 示例——按文件大小查找
    • find /etc -size 8
    • 功能:从 /etc 下开始查找大小为8块的文件,此处默认512字节为1块。若认为块大小为1k,则应写为8k。
    • 其它可以使用的单位有 c(字节)、w(双字节)、M(兆字节)、和 G(吉字节)。
    • 8k 查找等于8k的文件,-8k小于8k,+8k大于8k
    • find /etc -size +8k -size -12k 查找大于8k小于12k
  • 示例——按文件类型查找
    • find /var -type d -print
    • 功能:从 /var 目录下开始查找类型为目录的文件,其中参数 -print 是显示到屏幕上,经常省略
  • 示例——按文件的修改时间查找
    • find . -cmin -5
    • 功能:从当前目录下查找5分钟之内修改过的文件
    • 如果把 “-5” 改为 “+5” ,则表示查找5分钟以前修改过的文件。不带 ”+“ 或 ”-“ ,则认为整5分钟。
    • 如果把时间单位改为天,则使用参数 “-ctime” , 如:find . -ctime -5
  • 示例——按文件的权限查找
    • find mytmp -perm 755
    • 功能:查找mytmp目录下的权限恰为755的文件
    • find mytmp -perm -755
    • 功能:查号mytmp目录下的满足755中任何一种权限的文件,即符合任何一个指定的权限位即可
    • find mytmp -perm +755
    • 查找mytmp目录下的权限至少满足755的文件,即指定的所有权限位必须符合才算满足查询条件
  • 示例——多条件查询
    • find / -ctime -5 -a -name "*.conf"
    • 功能:查找5天以内修改过的所有 .conf 的文件
    • 说明:默认情况下各查询条件之间是“与”的关系,也可用 -a 或 -and 来表示;-o表示“或”;! 表示“非”。
    • find . \(-type f -or type | \) -ok rm {} \;
    • 功能:从当前目录下开始查找普通文件或符号连接文件,针对找到的每个文件,在执行rm命令之前提问是否要执行该命令。
    • 其中 \(\)是优先符号,参数 “-ok” 比 ”-exec” 多了交互功能

文件内容操作

  • grep
  • 示例——在指定文件中查找包含特定的字符串的行
    • grep "bind" host.conf
    • 功能:在文件host.conf中查找包含字符串 “bind” 行。
    • grep "network" /etc/*.conf
    • 功能:利用通配符可在多个文件中查找包含特定的字符串的行。
  • 示例——查找不包括指定字符串的行
    • grep -v "network" /etc/nsswitch.conf
    • 功能:查找 /etc/nsswitch.conf 文件中不包含字符串 “network” 的行。
  • 示例——在指定目录下递归查找
    • grep -r "stdio.h" /etc

统计指令

  • wc
  • 示例——统计指定文件的行数、单词数和字符数
    • wc /etc/nsswitch.conf
    • 功能:统计出文件 /etc/nswwitch.conf 共有行数、单词数、字符数。
  • 示例——参数使用
    • wc -l /etc/nsswitch.conf
    • 功能:参数 -l 的功能可统计出指定文件的行数。另外,利用参数 -w 统计单词,利用 -c 统计字符数

按正序逆序输出

  • sort
  • 示例——按正序输出
    • sort mytest
    • 功能:将指定文件以行为单位按正序输出
  • 示例——按逆序输出
    • sort -r mytest
    • 功能:将指定文件以行为单位按逆序输出

文件比较

  • diff
  • 示例
    • diff test mytest
    • 功能:比较文件 test 与 mytest 是否相同,将不同之处输出到屏幕上

压缩和解压缩

缺项:只能对文件分别压缩,不能打包压缩成一个文件,且不能压缩目录

gzip 命令 和 gunzip 命令

  • gzip myetc.tar
  • 功能:将文件 myetc.tar 压缩为 myetc.tar.gz

  • gunzip myetc.tar.gz

  • 功能:将文件 myetc.tar.gz 解压缩为 myetc.tar

类似还有 bzip2 命令 和 bunzip2 命令 压缩文件后缀为bz2

  • bzip2 -k *.txt
  • 将所有.txt结尾的文件 压缩为 .txt.bz2
  • -k可以保留原文件

打包压缩

tar 命令

tar命令是经典的备份/还原命令,几乎所有最新的软件包都是通过tar包发布的

  • 参数:
    • -c 创建 (压缩)
    • -x 释放 (解压缩)
    • -v 显示处理过程
    • -f 指定压缩或解压缩文件名
    • -z 使用gzip命令压缩文件 后缀.tar.gz
    • -j 使用bzip2命令压缩文件 后缀tar.bz2
    • -Z 调用 compress 命令来压缩,扩展名为.tar.Z
    • -C 可指定解压缩位置
  • 示例——打包(备份)
    • tar -cvf myetc.tar /etc
    • 功能:将目录 /etc 打包为一个名为myetc.tar的文档
  • 示例——打包(备份)并压缩
    • tar -zcvf myetc.tar.gz /etc
    • 功能:将目录 /etc 打包并压缩为一个名为 myetc.tar.gz 的文档
  • 示例——解压缩还原
    • tar -zxvf myetc.tar.gz
    • 说明:未指明还原位置,将会还原在当前目录下
    • tar -zxvf myetc.tar.gz -C /tmp
    • 参数 -C 可指明还原位置

rar 需手动安装

  • 参数
    • a 压缩
    • x 解压缩
  • 压缩 rar a 生成文件名 要压缩的内容
    • rar a alltxt dir2/
    • 将dir2目录压缩,会自动夹上.rar后缀
  • 解压缩 rar x 压缩文件 释放的位置
    • rar x dirbk.rar dir/
    • dirbk.rar解压缩值dir目录中

zip

  • 压缩 zip 压缩包名 压缩的文件或目录 压缩目录要加 -r
    • zip -r dirbk dir 压缩目录dirdirbk.zip
    • zip txt *.txt 压缩所有.txt后缀的文件为txt.zip
  • 解压缩 unzip 压缩包名 -d 解压目录
    • zip dirbk.zip -d dir1/ 解压缩到dir1目录

挂载与卸载命令

  • mount 命令

如果系统挂载成功,在/media目录下,如果手动挂载,一般置于/mnt目录

  • 示例——挂载光盘
    • mount -t iso9660 /dev/cdrom /mnt/cdrom
    • 功能:参数 -t 指明要挂载的文件系统的类型,设备文件,挂载点
    • 本例:将光盘挂载到 /mnt/cdrom 目录下,其中光盘文件系统类型是 iso9660
  • 示例——挂载U盘
    • mount -t vfat /dev/sda1 /mnt/myusb
    • 功能:将文件系统类型为 vfat 的U盘 挂载到 /mnt/myusb 目录下
    • 说明:vfat 针对的是 FAT32、FAT16文件系统;U盘采用与 SCSI 硬盘相同的设备文件;
    • 注意:一般在挂载U盘前,先执行 fdisk -l 命令 查看U盘的名称,如这里是/dev/sda1
  • 示例——挂载软盘
    • mount -t msdos /dev/fd0 /mnt/floppy
    • 功能:将软盘挂载到 /mnt/floppy 目录下,软盘的文件系统类型一般为 msdos
    • 说明:挂载点不一定必须在 /mnt 下,它可以是任意一个空目录
  • umount 命令
  • 示例
    • umount /mnt/cdrom
    • 功能:卸载光盘文件系统
    • 说明:在卸载文件系统时可以使用设备文件或挂载点。
    • 切记,一定要在挂载点之外,才能卸载相应的设备(文件系统)

网卡配置命令

  • ifconfig
  • 示例——显示接口(网卡)配置参数
    • ifconfig
    • 功能:显示网卡参数的配置情况,包括IP地址、子网掩码、广播地址等
  • 示例——设置接口(网卡)配置参数
    • ifconfig eth0 10.22.1.103 netmask 255.255.255.0
    • 功能:设置网卡 eth0 的IP地址为 10.22.1.103、掩码为255.255.255.0
    • 说明:eth0 是系统中第1块以太网卡的名称,eth1是系统中第2块以太网卡的名称,以此类推。 Io 是环回测试网卡的名称
  • 示例——禁用某块网卡
    • ifconfig eth0 down
    • 功能:禁用网卡 eth0
    • 说明:此时再用不带参数的ifconfig命令是不能显示 eth0 的信息,需要加上参数 -a 才可显示被禁用的网卡信息
  • 示例——激活某张网卡
    • ifconfig eth0 up
    • 功能:激活网卡 eth0

帮助命令

  • man
  • 示例——查看指定命令的帮助
    • man rpm
    • 功能:查看 rpm 命令的帮助手册
    • 说明:按q键退出man环境
  • 示例——查询指定关键字的所有分类
    • man -a chroot
    • 功能:查看关于chroot的所有分类帮助手册
  • 示例——查询特定分类的帮助
    • man 5 named.conf

定时任务命令

  • crontab
  • 示例——查看任务列表
    • crontab -l
    • 功能:查看crontab的任务列表
  • 示例——编辑任务列表
    • crontab -e
    • 功能:利用参数 -e 可以进入crontab的编辑环境,可以设置任务列表
    • 说明:crontab任务列表的格式
    • 分 时 日 月 星期 命令
    • 10 2 * /root/bin/mybackup.sh
    • 含义:每天的凌晨2:10 执行 /root/bin/mybackup.sh程序
  • 使用 crontab 之前首先得确保服务是开启的
    • service crond status 查看状态
    • service crond start 开启服务
  • 监控执行 tail -f /var/log/cron
    • 如果发现 cron 文件为空,那服务可能没有开启
    • service rsyslog status 查看状态
    • service rsyslog start 开启服务
  • 如果rsyslog没有开启,还可以通过邮件查看
    • tail -f /var/spool/mail/root
    • linux 系统邮件功能:/var/spool/mail/root 如果写不进去,可能root文件内容过多,删除以下就好

反引号命令

1
kill `cat /var/run/xinetd.pid`
  • 功能:杀掉xinetd进程

  • 说明:该命令行由两个命令组成,首先要执行的是反引号内的命令,这里解释一下文件/var/run/ xinetd.pid中存放的是 xinetd的进程号,cat的执行结果就是显示该文件的内容,即进程号;然后,再执行kill命令来杀掉相应的进程。


时间日期

  • date命令
  • 示例——显示时间日期
    • date
    • 功能:显示系统当前的时间日期。
  • date命令的参数很多
  • date +%y
  • 示例——设置时间日期
    • date -s"20060901 13:41"
    • 功能:将系统的日期设置为2006年9月1日,时间设置为13:41。

显示磁盘空间情况

  • df 命令
  • 示例一一显示文件系统使用磁盘空间的情况
    • df
    • 功能:显示系统中每个文件系统使用磁盘空间的情況。
  • 示例——以习惯的阅读方式显示文件系统使用磁盘空间的情况

    • df -h
    • 功能:加上参数-h,则可以按照人们习惯的阅读方法来显示系统中每个文件系统使用磁盘空间的情况
    • 文件系统 容量 已用 可用 已用% 挂载点
  • du命令

  • 示例——显示指定目录中每个文件占用的磁盘空间的大小
    • du /etc
    • 功能:显示出/etc目录中每个文件占用磁盘空间的大小
  • 示例——显示指定目录总共占用的磁盘空间大小
    • du -sh /etc
    • 功能:参数-s表示汇总,本例的功能为按照人们习惯的阅读方法显示/etc目录中所用文件总共占用的磁盘空间大小。

管道 |

  • 管道示例—— 一级管道
    • ls -l | grep "^1"
    • 功能:以长格式显示当前目录下的符号连接文件。该命令行首先执行 ls -l,并把其结果当作grep “^l”命令的输入文件,其中 “^1” 表示以1开头。
  • 管道示例—— 多级管道
    • ls -la | grep "^1" | wc -l

输出重定向

  • 示例——覆盖方式
    • sort -r a.txt > b.txt
    • 功能:把a.txt文件按行逆序排序并重定向输出到文件b.txt中;若b.txt已存在,则覆盖掉原内容,若不存在,则创建之。
  • 示例——追加方式
    • sort -r a.txt >> b.txt
    • 功能:”>>”的功能是按追加方式进行输出重定向;若b.txt已存在,则在该文件末尾追加新内容,若不存在,则创建之。

输入重定向

  • 示例—— “<”

    • more < /etc/httpd/conf/httpd.conf
    • 功能:上述命令与 more /etc/httpd/conf/httpd.conf 的结果是一样。
    • 说明:很多命令与more一样可以使用输入重定向符,也可以不用,如cat、wc、less等。
  • 示例—— “<<”

    1
    2
    3
    4
    cat <<! >a.txt
    > hello
    > world
    > !
    • 功能:将 “!”之间的内容重定向到a.txt文件中去,不包括 “!”。
    • 说明:这是一个组合使用输入输出重定向的例子,其中 “!” 是定界符,其它字符也可以充当定界符。
    • 注意:”!” 与后面的 “>” 之间至少要有一个空格。这是一种非常经典的用法,可以用在she‖编程环境中。

vi 编辑器

ⅵ编辑器是 Linux和Unix上最基本的文本编辑器,工作在字符模式下。由于不需要图形界面,vi是效率很高的文本编辑器。尽管在 Linux上也有很多图形界面的编辑器可用,但vi在系统和服务器管理中的功能是那些图形编辑器所无法比拟的。

vimtutor 查看文档

vi 有三种工作方式:命令模式 (Command mode) ,输入模式 (Insert mode) 和 底线命令模式 (Last line mode)

image-20220129164752774

命令模式

  • 光标移动

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    n -  上移n行
    n + 下移n行

    h 向左移动
    l 向右
    k 向上
    j 向下
    0 行首
    $ 行尾
    gg 文件首
    G 尾行
  • 删除(也是剪切)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    x	删除光标处的单个字符
    X 删除光标前的单个字符
    dd 删除光标所在行
    dw 删除当前字符至单词尾的所有字符,包括空格
    de 删除当前字符至单词尾的所有字符,不包括空格
    d$ 删除当前字符至行尾的所有字符
    d^ 删除当前字符至行首的所有字符
    J 删除行尾的换行符,相当于合并当前行和下一行

    可以配合数字n使用:
    n x 从当前光标开始连续删除n个字符
    n dd 从当前行开始连续删除n行
  • 复制

    1
    2
    3
    yy    复制当前行
    n yy 从当前开始连续复制 n 行,包括当前行
    v进入视图模式->移动光标选择字符->y复制
  • 粘贴

    1
    2
    p   粘贴在当前行的下方或当前光标后面
    n p 在当前行的下方连续粘贴 n 遍
  • 翻页

    1
    2
    3
    4
    ctrl+f		向前翻整页
    ctrl+b 向后翻整页
    ctrl+u 向前翻半页
    ctrl+d 向后翻半页
  • 撤销:u

  • 恢复:ctrl+r

  • 缩进:向后 >> 向前 <<

  • 保存退出ZZ

  • 跳转至man帮助文档,shift+k,跳转到指定页数n+shift+k

  • [+d 显示宏

  • % 括号跳转

  • 输入r,从光标开始写入字符覆盖

末行模式

  • 显示/隐藏行号

    • :set number 显示行号

    • :set nonumber 隐藏行号

  • 跳行

    • :n 跳到第n行
  • 退出

    • :q 退出
    • :w 存盘
    • :wq 存盘并退出
    • :q! 不保存退出
  • 执行shell命令

    • 如::!ls:!pwd
  • 查找

    1
    2
    3
    4
    5
    6
    7
    /字符串 ENTER  	  向后查找指定的字符串
    / ENTER 向后查找上一次查找的内容
    ?字符串 向前查找字符串
    ? 向后查找上一次查找的内容

    n 查找方向的下一个字符串
    N 查找方向反向的下一个字符串
  • 替换:

    1
    2
    3
    4
    s/jack/luck   将当前行的首个jack替换成luck
    s/jack/luck/g 替换当前行所有jack
    %s/jack/luck/g 全文替换
    27,30s/jack/luck/g 27到30行替换
  • 分屏:

    1
    2
    3
    4
    5
    6
    sp    水平分屏
    vsp 垂直分屏
    vsp test 分屏打开test文件
    ctrl+ww 切换分屏
    qall 关闭所有分屏
    q 关闭当前光标所在分屏

输入模式

1
2
3
4
5
6
7
8
9
10
11
i	当前光标前插入
I 当前行首插入
a 当前光标后插入
A 当前行末插入
o 当前行下面插入新行,插入
O 当前行上面插入新行,插入
s 删除光标后单个字符,插入
S 删除当前行,插入
cw 删除当前光标至所在单词尾部的字符,进入插入状态
c$ 删除当前光标至行尾的字符,进入插入状态
c^ 删除当前光标之前至行首的字符,进入插入转态

vim打造IDE

  • 系统级配置文件目录:/etc/vim/vimrc
  • 用户级配置文件目录:~/.vim/vimrc

vi配置文件

/etc/vimrc/etc/vim/vimrc 所有用户的配置

设置默认显示行号

  1. 拷贝/etc/vimrc至当前用户家目录下~/.vimrc
  2. 追加set number

设置TAB缩进

默认8空格

在.vimrc中关于tab的设置:

1
2
3
4
5
6
7
8
9
set expandtab     //将tab扩展成空格
set noexpandtab //将tab不扩展成空格
set ts=4 //或set tabstop=4,ts是tabstop的缩写,设tab为4个空格,默认是8个空格
set softtabstop=4 //表示在编辑模式的时候按退格键的时候退回缩进的长度,当使用expandtab时特别有用
set shiftwidth=4 //每一级缩进是4个空格

set cindent //针对C语言自动缩进。
set autoindent //表示自动缩进
set smarttab //根据文件中其他地方的缩进空格个数来确定一个tab是多少个空格

Linux文件系统权限

文件系统

文件系统用来存放和管理所有系统使用的文件和数据,其载体是软盘或硬盘分区。一个软盘或硬盘分区在作为文件系统使用时,必须进行初始化,并将如何组织文件的数据结构写到这些介质上,这个过程就是建立文件系统过程。

Linux的文件系统是树形结构,所有的文件和目录都是树上的节点,树的根就是整个文件系统的最顶层目录,即根目录。文件连接到目录,目录再连接到上一层目录,所有的文件和目录最终都归结到根目录,形成整个文件系统。

Linux使用一个统一的接口支持多种文件系统,每种文件系统都有各自的格式和特征(如文件名长度、最大文件大小等)。目前, Linux支持的文件系统类型MINIX、EXT、EXT2、EXT3、proc、hpfs、nfs、 isofs、 msdos fat、vfat、ntfs、umsdos、 xiafs 及 sysv 等。 Red Hat Linux默认的文件系统是 ext3。

第一个专门为 Linux设计的文件系统被称为扩展文件系统( Extended File System)或EXT。它出现于1992年4月,但性能不太好。1993年扩展文件系统第二版ext2被设计出来并添加 Linux中。ext2是一个强大的可扩展文件系统,被认为是当时最成功的 Linux文件系统。

ext3文件系统的特性

  • 可用性
    • 除非发生硬件故障,即使非法关机,ext3也不需要文件系统校验
  • 数据完整性

    • ext3文件系统在非法关机是,数据完整性能得到可靠的保障
  • 速度

    • 尽管ext3写入数据的次数多于ext2,但是ext3常常快于ext2
  • 简易转换

    • ext可以容易地不经格式化把ext2转换为ext3系统,体现了可靠的日志文件系统的优越性

Linux的文件系统结构

image-20220129213503119

  • /home 用户的主目录,比如说有个用户叫wang,那他的主目录就是 /home/wang
  • /lib 这个目录里存放着系统最基本的动态链接共享库,其作用类似于 Windows 里的 .dll文件。几乎所有的应用程序都需要用到这些共享库。
  • /mnt 这个目录是空的,系统提供这个目录是让用户临时挂载别的文件系统。
  • /proc 这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访可这个目录来获取系统信息
  • /root 系统管理员,超级权限者的用户主目录
  • /sbin s 就是Super User的意思,也就是说这里存放的是一些系统管理员使用的系统管理程序
  • /tmp 用来存放一些临时文件的地方
  • /usr 这是个最庞大的目录,我们要用到的很多应用程序和文件几乎都存放在这个目录下。
  • /var 这个目录中存放着经常变动的文件,为了保持/usr的相对稳定,那些经常被修改的目录可以放在这个目录下。系统的日志文件就在/var/log目录中。

常见文件所在目录

  • hosts /etc
  • 全局profile /etc
  • 日志文件 /var/log/message
  • 用户环境变量 ~/.bash_profile或者~/.profile
  • 用户文件 /etc/passwd
  • 组对应文件 /etc/group

文件名与文件类型

文件名是一个文件的标识。 Red Hat Linux系统中的文件名的命名规则与 Windows系统基本相同。它同样是由字母、数字、下划线、圆点等组成,最长不能超过255个字符。在 Red Hat Linux系统中,没有像 Windows系统那样明显的扩展名,但它对字母大小写是严格区分的。

Linux有四种基本文件系统类型:

  • 普通文件:如文本文件、C语言源代码、Shel脚本、二进制的可执行文件等。
  • 目录文件:包括文件名、子目录名及其指针。它是 Linux储存文件名的唯一地方。
  • 链接文件:它是一个文件的第二个名字,这是针对多用户共享同一文件而产生的文件。
  • 特殊文件:Linux的一些设备如磁盘、终端、打印机等都在文件系统中表示出来,这类文件就是特殊文件,常放在/dev目录内。
1
2
3
4
5
6
7
8
9
10
11
12
13
[user1@server1 ~]$ ls -l
drwxrwxr-x 2 user1 user1 4096 Aug 17 09:10 abc

- :普通文件
d :目录文件,在Linux中目录也是文件,不仅如此,实际上在Linux中任何设备也可以被当作文件处理
l :符号连接文件
b :快设备文件
如硬盘的设备文件/dev/hda,其中字母a表示第一块,h表示IDE类型的硬盘,SCSI类型的硬盘用s表示
分区也有相对应的设备文件,如/dev/sdb3,表示第2块SCSI硬盘上的第三个分区
U盘也采用SCSI硬盘的设备文件名来命名
c :表示字符设备文件,如/dev/tty1
p :表示管道文件
s :表示套接字文件
只有普通文件,目录文件,软连接三种占磁盘空间。其它四种文件均是伪文件,不占磁盘空间

文件权限

Linux文件有三种典型的权限 rwx

  • r(读权限 4)
  • w(写权限 2),
  • x(执行权限 1)

示例说明:

1
2
3
4
5
6
7
8
9
10
[user1@server1 ~]$ ls -l
drwxrwxr-x 2 user1 user1 4096 Aug 17 09:10 abc

在长格式输出中文件类型的后面有9位权限位,实际上这是针对不同用户而设定的,如下所示。

属主的权限 属组的权限 其他用户的权限
rwx rwx r-x
4+2+1=7 4+2+1=7 4+0+1=5

所以abc这个文件夹(d 表明abc是文件夹)的权限就是775

修改权限

  • chmod命令

    1
    chmod [who] operator [permission] filename
  • who的含义:

    1
    2
    3
    4
    u  文件属主权限
    g 同组用户权限
    o 其他用户权限
    a 所有用户权限(文件属主、同组用户、其他用户),默认值
  • operator 的含义:

    1
    2
    3
    +	增加权限,原权限基础上增加指定权限
    - 取消权限,原权限基础上去掉指定权限
    = 设定权限,会覆盖原权限
  • permission 的含义:

    • r 读权限
    • w 写权限
    • x 执行权限

示例:

1
2
3
4
5
6
7
8
9
10
11
[root@CentOS8 ~]# ls -l myfile
-rwxr-xr-x. 1 root root 225 1月 29 17:20 myfile
[root@CentOS8 ~]# chmod -x myfile
[root@CentOS8 ~]# ls -l myfile
-rw-r--r--. 1 root root 225 1月 29 17:20 myfile
[root@CentOS8 ~]# chmod u+x myfile
[root@CentOS8 ~]# ls -l myfile
-rwxr--r--. 1 root root 225 1月 29 17:20 myfile

[root@CentOS8 ~]# chmod g-w,o=x host.conf
[root@CentOS8 ~]# chmod 764 host.conf

文件属主和修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
查看属主

[root@CentOS8 ~]# ls -al test
total 8
drwxr-xr-x 2 oracle dba 256 Mar 05 15:09 .
drwxr-xr-x 5 oracle dba 4096 Mar 05 15:02 ..
-rwxr-xr-x 1 oracle dba 0 Mar 05 15:09 1.sh

test文件夹属主为 oracle:dba

修改属主

若把test文件属主修改为 ta4:dba,命令如下
[root@CentOS8 ~]# chown ta4:dba test

若把test文件夹所有文件以及文件夹属主修改为 ta4:dba,命令如下
[root@CentOS8 ~]# chown -R ta4:dba test
-R 表示递归,即可以深入到指定目录中的每一层

Linux用户和用户组


用户和用户组

Linux用户只有两个等级:root非root

Linux中还有一部分用户,如: apachemysqlnobodyftp等,这些也都是非root用户,即普通用户。 Linux的权限实际是上不同用户所能访问的文件的不同产生的假象。而这些假象的造成,还要涉及到另外一个概念:用户组

一个用户至少要属于个用户组
一个用户可以属于多个用户组

  • Linux采用组来组织和管理用户

  • 在 Linux中每个用户有唯一的用户标识符UID,该UID是一个无符号整数

  • 每个用户也必须至少属于一个组,也有组标识符GID.

  • 其中UD与GID独立编号。

    1
    2
    3
    UID  0      root用户
    UID 1~999 占坑用户,即一些无法登录的用户
    UID >=1000 正常的可登录用户

创建用户账号

useradd 命令

示例一:创建用户

  • [root@CentOS8 ~]# useradd user1

  • 功能:创建一个用户user1,同时在 /etc/passwd文件和 /etc/shadow 文件增加一行,并自动为用户创建相应的主目录:/home/user1

  • 说明:/etc/passwd 文件记录了系统中每个用户的用户名、UID号、GID号、主目录、shell等信息
  • 注意:用户的口令原来也存放在此文件中,现在为了保证安全采用了影子口令文件 /etc/shadow 来保存每个用户的口令。

示例二:创建用户账号并设置相应属性值

  • [root@CentOS8 ~]# useradd -u 600 -g mygroup1 -G mygroup2 -d /home/student1 s1
    • 功能:创建用户s1,参数:
    • -u 指定 UID号 为 600
    • -g 指定 用户的主要组 为 mygroup1
    • -G 指定 用户的附加组 为 mygroup2,每个用户可以有多个附加组
    • -d 指定 用户的主目录 为 /home/student1

adduser 命令

删除用户账号

userdel 命令

示例一:删除用户

  • [root@CentOS8 ~]# userdel user1
  • 功能:删除指定用户user1

示例二:删除用户并删除主目录

  • [root@CentOS8 ~]# userdel -r user1
  • 功能:删除指定用户user1,同时删除其主目录

deluser 命令

创建组账号

groupadd 命令

示例一:创建组账号

  • [root@CentOS8 ~]# groupadd mygroup1
  • 功能:创建一个新组mygroup1,其中GID号为已存在GID号的下一个顺序编号
  • 说明:创建一个组的同时会在 /etc/group 文件中为改组增加相应的一行,用来记录该组的名称、GID号及成员等信息

示例二:创建组账号并设置其GID号

  • [root@CentOS8 ~]# groupadd -g 500 mygroup2
  • 功能:创建一个新组mygroup2,并指定其GID号为5000
  • -g 用来设置新组的GID号

删除用户组

groupdel 命令

  • [root@CentOS8 ~]# groupdel mygroup2
  • 功能:删除指定的组
  • 注意:当某个组是某现有用户的主要组时,则不能被删除

改变口令

passwd命令

  • 普通用户只能修改自己的密码,root用户可以修改所有用户的密码
  • 密码长度需要 >= 8,且不能太简单,不然修改或设置失败

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@CentOS8 ~]# useradd test1			# 增加用户 user1
[root@CentOS8 ~]# passwd test1 # 用root身份设置test1的密码
更改用户 test1 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@CentOS8 ~]# su - test1 # 切换成 test1 用户登录
[test1@CentOS8 ~]$ passwd # 使用test1身份修改自身密码
更改用户 test1 的密码 。
Current password:
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

禁止和恢复用户登录

passwd命令

  • 参数 -l 可以给指定的用户加锁,禁止该用户登录

  • 注意:root 身份下仍能登录 su - username,但用户不能直接登录了

    1
    2
    3
    [root@CentOS8 ~]# passwd -l test1
    锁定用户 test1 的密码 。
    passwd: 操作成功
  • 参数 -u 可以给指定的用户解锁,恢复用户登录

    1
    2
    3
    [root@CentOS8 ~]# passwd -u test1
    解锁用户 test1 的密码。
    passwd: 操作成功

删除用户口令

passwd命令

  • 参数 -d 可以删除指定用户的口令,只有root用户可以使用

    1
    2
    3
    [root@CentOS8 ~]# passwd -d test1
    清除用户的密码 test1。
    passwd: 操作成功

显示用户信息

id命令

  • 格式 id username

  • 显示用户的UID、GID及所属的组信息

    1
    2
    3
    4
    [root@CentOS8 ~]# id root
    uid=0(root) gid=0(root) 组=0(root)
    [root@CentOS8 ~]# id test1
    uid=1001(test1) gid=1001(test1) 组=1001(test1)

修改用户

usermod

usermod -aG wheel user_name 将用户user_name添加到Wheel组中,Wheel组中的用户具有root权限,即使用sudo

Linux进程管理


查看进程命令

ps 命令
  • 示例一:不带参数

    1
    2
    3
    4
    5
    [root@CentOS8 ~]# ps
    PID TTY TIME CMD
    2367 pts/0 00:00:00 bash
    2413 pts/0 00:00:00 ps
    [root@CentOS8 ~]#
  • 示例二:查看所有运行的进程,包括后台进程

    • -a 所有进程,会话引导进程和与终端无关进程除外
    • -u 显示用户
    • -x 包括不占用控制台的进程
    1
    2
    3
    4
    5
    6
    [root@CentOS8 ~]# ps -aux
    USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
    root 1 0.7 0.7 175500 13704 ? Ss 17:27 0:02 /usr/lib/systemd/systemd --switched
    root 2 0.0 0.0 0 0 ? S 17:27 0:00 [kthreadd]
    root 3 0.0 0.0 0 0 ? I< 17:27 0:00 [rcu_gp]
    省略....
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    USER 	所属用户
    PID 进程ID
    %CPU 占用CPU百分比
    %MEM 占用内存百分比
    VSZ 虚拟内存占用大小
    RSS 实际内存占用大小
    TTY 终端类型
    STAT 进程状态
    START 进程启动时刻
    TIME 进程运行时长
    COMMAND 启动进程的命令
  • 示例三:查看所有运行的进程,包括后台进程,显示每个进程的父进程号

    1
    2
    3
    4
    5
    6
    [root@CentOS8 ~]# ps -ef
    UID PID PPID C STIME TTY TIME CMD
    root 1 0 0 17:27 ? 00:00:02 /usr/lib/systemd/systemd --switched-root --system
    root 2 0 0 17:27 ? 00:00:00 [kthreadd]
    root 3 2 0 17:27 ? 00:00:00 [rcu_gp]
    省略....
  • 示例四:ps ajx

    1
    PPID  PID  PGID  SID  TTY  TPGID  STAT  UID  TIME   COMMAND
top 命令
  • 动态地显示系统中的进程,ctrl+c退出

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [root@CentOS8 ~]# top
    top - 17:44:26 up 16 min, 1 user, load average: 0.00, 0.00, 0.00
    Tasks: 216 total, 1 running, 215 sleeping, 0 stopped, 0 zombie
    %Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.2 si, 0.0 st
    MiB Mem : 1790.0 total, 651.4 free, 563.8 used, 574.8 buff/cache
    MiB Swap: 4096.0 total, 4096.0 free, 0.0 used. 1064.3 avail Mem

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    940 root 20 0 366260 12004 10220 S 0.3 0.7 0:01.38 vmtoolsd
    2522 root 20 0 65752 5200 4292 R 0.3 0.3 0:00.08 top
    省略。。。

杀掉指定进程

kill 命令

  • 示例一:杀掉指定进程

    • 功能:kill 命令可以杀掉一个进程,普通用户只能杀掉自己的进程
    • 说明:一般在执行kill命令前,先用pspstree来查询一下将要被杀掉的进程的进程号
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [root@CentOS8 ~]# ps
    PID TTY TIME CMD
    2367 pts/0 00:00:00 bash
    2696 pts/0 00:00:00 ps
    [root@CentOS8 ~]# ps -ef|grep bash
    root 957 1 0 17:27 ? 00:00:00 /bin/bash /usr/sbin/ksmtuned
    root 2367 2361 0 17:31 pts/0 00:00:00 -bash
    root 2698 2367 0 18:01 pts/0 00:00:00 grep --color=auto bash
    [root@CentOS8 ~]# kill 957
    [root@CentOS8 ~]# ps -ef|grep bash
    root 2367 2361 0 17:31 pts/0 00:00:00 -bash
    root 2710 2367 0 18:02 pts/0 00:00:00 grep --color=auto bash
    [root@CentOS8 ~]#
  • 示例二:强制杀掉指定进程

    • [root@CentOS8 ~]# kill -9 3029
    • 功能:强制终止3029号进程的运行,其中参数-9代表强制的意思
    • 说明:实际上kill命令是向该进程发送信号,该进程收到信号后决定是否停止运行,有些进程必须要收到参数9才终止运行
    • kill -l 命令了解有关信号的情况
  • kill -l 列出所有信号

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
    6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
    11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
    16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
    21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
    26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
    31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
    38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
    43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
    48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
    53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
    58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
    63) SIGRTMAX-1 64) SIGRTMAX

Linux软件包管理

软件包管理

与Windows安装各种应用程序相似,在linux下也可以安装各种需要的应用程序,通常称为软件包。目前,在linux系统下常见的软件包管理工具为RPM

rpm — Redhat Package Management

软件包文件名中 i386, noarch 等含义

  • i386.rpm 适用于 80386及以上的cpu
  • i596.rpm 适用于 pentium及以上cpu
  • i686.rpm 适用于 pentium pro及以上cpu
  • noarch.rpm 指该软件包与硬件平台无关
  • src.rpm 软件包源码

rpm命令

  • 示例一:查询系统中安装的软件包

    • [root@CentOS8 ~]# rpm -qa
    • 功能:查询系统中安装的软件包列表
    • -q是 查询
    • -a是 所有的
  • 示例二:查询软件包中 文件清单

    • [root@CentOS8 ~]# rpm -ql php
    • 功能:查询已安装的软件包php中的文件列表
    • -l 是 列出指定软件包中的文件
  • 示例三:卸载指定的软件包

    • [root@CentOS8 ~]# rpm -e php
    • 功能:卸载已安装的软件包php
    • -e是 卸载
    • 说明:执行上述命令是,采用的身份是不同的,普通用户只能执行查询操作
  • 示例四:安装软件包

    • [root@CentOS8 ~]# rpm -ivh php-4.3.9-3.1-i386.rpm
    • 功能:安装软件包php
    • -i 是 安装
    • -v 是 显示处理过程
    • -h 是 显示#表示进度
  • 示例五:忽略依赖关系安装软件包

    • [root@CentOS8 ~]# rpm -ivh --nodeps php-4.3.9-3.1-i386.rpm
    • 功能:安装软件包php时,忽略与其它软件包的依赖关系
    • --nodeps 表示 忽略依赖关系
    • 说明:在安装或卸载软件时经常会遇到提示 ”该软件包与某某软件包存在依赖关系“,只有加上参数 --nodeps忽略掉依赖关系才能进行安装或卸载
  • rpm管理

  • 安装:

  • 通过源代码安装软件包

    • rpmbuild --rebuild software-version.src.rpm
    • rpm -ivh /usr/src/redhat/RPMS/i386/software-version.i386.rpm
  • 升级:

    • rpm -U software-version.i386.rpm
    • rpm -Uvh software-version.i386.rpm
    • rpm --force -Uvh software-version.i386.rpm
  • 删除:
    • rpm -e software
  • 查询:
    • rpm -qi software
    • rpm -qpi software-version.i386.rpm
    • rpm -qf /dir/file
    • rpm -ql software
    • rpm -qpl software-version.i386.rpm

Shell编程

Bash

Shell是用户与Linux操作系统沟通的桥梁

Linux的Shell种类众多,这里的是bash,也就是Bourne Again Shell

  • 由于易用和免费,bash在日常工作中被广泛使用
  • bash是大多数Linux系统默认的Shell

Shell执行方式

a.sh

  • 保证脚本具有执行权限并且在环境变量PATH中有(.),这样在执行的时候会从当前目录查找

./a.sh

  • 保证这个脚本具有执行权限

bash a.sh

  • 直接可以执行,甚至这个脚本文件中的第一行都可以不引用/bin/bash,它是将hello.sh作为参数传给 sh(bash) 命令执行的

后台模式运行脚本

在脚本后面加一个 &

  • tesh.sh &
  • 在后台运行,但是当前会话窗口关闭之后这个脚本也会停止运行

nohup命令

  • 不间断的运行命令,忽略所有挂断(SIGHUP)信号

nohup tesh.sh &

  • nohup命令将进程和终端分开,所以关闭当前会话窗口不会影响这个进程的执行
  • nohup会在当前执行的目录生成一个nohup.out日志文件

标准输入输出

标准输入、输出、错误可以使用文件描述符 0、1、2 引用

  • ls >file 或者 ls 1>file(ls >>file)
  • ls >file 2>&1
  • ls > /dev/null,把输出信息重定向到无底洞

使用重定向可以把信息转换到其他位置

变量

  • 变量不需要声明,初始化不需要指定类型

  • 变量命名

    • 不能使用程序中关键字(保留字)
    • 只能使用数字、字母和下划线,且不能以数字开头
    • 建议命令要通俗易懂
  • 显示变量值使用 echo $变量名 或者 ${变量名}
    • echo $JAVA_HOME
    • echo ${JAVA_HOME}

本地变量

  • 只对当前shell进程有效,对当前进程的子进程和其他shell进程无效
  • 定义: VAR_NAME=VALUE
  • 变量引用:${VAR_NAME}
  • 取消变量:unset VAR_NAME

环境变量

  • 自定义的环境变量对当前shell进程及其子shell进程有效,对其它的shell进程无效
  • 定义:export VAR_NAME=VALUE
  • 对所有shell进程都有效需要配置到配置文件中
    • vi /etc/profile
    • source /etc/profile

局部变量

  • 在函数中调用,函数执行结束,变量就会消失
  • 对shell脚本中某代码片段有效
  • 定义:local VAR_NAME=VALUE

位置变量

  • $1,$2,...,${10},...
  • test.sh 3 89
    • $0 脚本自身
    • $1 脚本的第一个参数
    • $2 脚本的第二个参数
  • 相当于java中main函数中的args参数,可以获取外部参数

特殊变量

  • $? 接收到上一条命令的返回状态码,返回状态在 0~255 之间
  • $# 脚本执行时,输入的参数的个数
  • $*$@ 输入的参数的具体内容(将输入的参数作为一个多个对象,即是所有参数的一个列表)

Linux退出状态代码

1
2
3
4
5
6
7
8
9
0		命令成功完成
1 通常的未知错误
2 误用shell命令
126 命令无法执行
127 没有找到命令
128 无效的退出参数
128+x 使用Linux信号x的致命错误
130 使用ctrl+c终止的命令
255 规范外的退出命令

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@CentOS8 ~]# cat test.sh
echo "script name is :"$0
n=1
echo "Use \$@ list is: " $@
for temstr in "$@"
do
echo "$n number is "$temstr
let n+=1
done
[root@CentOS8 ~]# ls -l test.sh
-rw-r--r--. 1 root root 124 1月 30 19:45 test.sh
[root@CentOS8 ~]# chmod +x test.sh
[root@CentOS8 ~]# ./test.sh 1 2 3 4 5
script name is :./test.sh
Use $@ list is: 1 2 3 4 5
1 number is 1
2 number is 2
3 number is 3
4 number is 4
5 number is 5
[root@CentOS8 ~]#

for循环

通过使用一个变量去遍历给定列表中的每个元素,在每个变量赋值时执行一次循环体,直至复制完成所有元素退出循环。

  • 格式一

    1
    2
    3
    4
    for ((i=0;i<10;i++))
    do
    ...
    done
  • 格式二

    1
    2
    3
    4
    for i in 0 1 2 3 4 5 8 9
    do
    ...
    done
  • 格式三

    1
    2
    3
    4
    for i in {0..9}
    do
    ...
    done

while/until循环

适用于循环次数未知,或不便用for直接生成较大的列表时

  • 格式

    1
    2
    3
    while 测试条件;do
    循环体
    done
  • 测试条件为真,进入循环;测试条件为假,退出循环

  • until 循环和 while 循环格式一致,但是和 while 循环的意思相反,测试条件为假,进入循环;测试条件为真,退出循环。


if判断

  • 单分支

    1
    2
    3
    if 测试条件; then
    选择分支
    fi
  • 双分支

    1
    2
    3
    4
    5
    if 测试条件; then
    选择分支1
    else
    选择分支2
    fi

循环控制命令

break 命令

在处理过程中跳出循环的一种简单方法,可以使用 break 命令退出任何类型的循环,包括 while 循环和 until 循环

  • 跳出单循环
  • 跳出内循环
    • 使用多循环时 break 自动跳出当前所在的循环,注意,当内循环被 break 命令终止,外循环会继续执行
  • 跳出外循环

处于内循环但需要终止外循环,break 命令后面需要指定参数

  • break n
  • n 表面要跳出的循环等级,默认为1,跳出当前循环,n=2,停止外面一层循环

continue命令

提前停止当前循环内命令,而不完全终止循环的方法,这就需要在循环内设置shell不执行命令的条件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@CentOS8 ~]# nano test2.sh
for i in {0..5}
do
if [ $i -eq 2 ]; then
continue
fi
echo $i
done
[root@CentOS8 ~]# chmod +x test2.sh
[root@CentOS8 ~]# ./test2.sh
0
1
3
4
5
[root@CentOS8 ~]#

自定义函数

1
2
3
function 函数名() {
...
}
  • 引用自定义函数文件时,使用 source func.sh

  • 有利于代码的重用性

  • 函数传递参数

  • 函数的返回值,只能是数字

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@CentOS8 ~]# nano test3.sh
#/bin/bash
function test() { # 定义函数
echo "param is $1" # 输出参数
return 99 # 返回99
}
test hello # 调用函数,参数是hello
echo $? # 输出函数返回的状态码,99

[root@CentOS8 ~]# ls -l test3.sh
-rw-r--r--. 1 root root 81 1月 30 20:43 test3.sh
[root@CentOS8 ~]# chmod +x test3.sh
[root@CentOS8 ~]# ./test3.sh
param is hello
99
[root@CentOS8 ~]#

Shell样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# !/bin/bash
d=`date +%H`
if [ $d -ge 0 -a $d -lt 7 ]; then
tag=1
elif [ $d -ge 7 -a $d -lt 12 ]; then
tag=2
elif [ $d -ge 12 -a $d -lt 18 ]; then
tag=3
else
tag=4
fi

case $tag in
1)
echo "Good morning"
;;
2)
echo "Morning"
;;
3)
echo "Good Afternoon"
;;
4)
echo "Good Evening"
;;
*)
echo "Scrip Error"
;;
esac


[root@CentOS8 ~]# chmod +x test1.sh
[root@CentOS8 ~]# ./test1.sh
Good Evening

问题

创建用户问题

Ubuntu创建用户时,默认不会创建家目录

image-20220329122538336

使用useradd -D查看该命令的默认设置

1
2
3
4
5
6
7
8
useradd -D
GROUP=100 # 默认的群组
HOME=/home # 默认家目录所在目录
INACTIVE=-1 # 口令失效日,在shadow的第7栏
EXPIRE= # 账号失效日,在shadow的第8栏
SHELL=/bin/sh # 默认的shell
SKEL=/etc/skel # 家目录里面的内容,从这个目录拷贝过去的
CREATE_MAIL_SPOOL=no # 是否创建邮件信箱
  • /etc/default/useradd 文件可以更改这些默认值

1、使用useradd 创建用户时可以加上-m来强制创建家目录

1
useradd -m username

2、也可以修改useradd的默认设置,让他默认创建家目录

1
2
3
vi /etc/login.defs
在后面加上一行
CREATE_HOME yes

Unable to locate package xxx

1
sudo apt-get update

命令补充

tree

  • tree dirname 将dirname下的文件以目录树的形式展现,包括子目录
  • 不带参数默认当前目录

可能需要安装sudo apt-get tree

od

查看二进制文件信息

  • -t 指定数据的显示格式
    • c ASCII字符
    • d 有浮点十进制数
    • f 浮点数
    • o 八进制数
    • u 无符号十进制数
    • x 十六进制数

chgrp

修改文件所有组 chgrp groupname filename

  • chgrp yang text

相近命令chown

free

显示系统中的内存空闲情况

1
2
3
4
5
6
7
8
9
[root@CentOS8 ~]# free
total used free shared buff/cache available
Mem: 1832972 576388 667956 10616 588628 1090860
Swap: 4194300 0 4194300
[root@CentOS8 ~]# free -h
total used free shared buff/cache available
Mem: 1.7Gi 562Mi 652Mi 10Mi 574Mi 1.0Gi
Swap: 4.0Gi 0B 4.0Gi

env

查看环境变量

Linux系统下环境变量: key=value1:value2:value3

ping

ping www.baidu.com -c 4 是否能上网

nslookup

查看域名对应的ip

file

查看文件类型

如:file myppmyapp: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=fd62a801dc8e73582184ccf1ec2f0e9f492ab33e, for GNU/Linux 3.2.0, not stripped

stat

查看文件的状态

image-20220528154743300

strace

跟踪系统调用和信号

strace + 可执行文件 查看该可执行文件执行过程中使用的系统调用和接收的信号

image-20220605120200873

Ubuntu软件安装

在线安装

apt-get

  • 安装sudo apt-get install tree
  • 移除sudo apt-get remove tree
  • 更新sudo apt-get update 更新软件列表
  • 清理所有软件安装包sudo apt-get clean /var/cache/apt/archives.deb的文件

aptitude

  • 安装sudo aptitude install tree
  • 重新安装sudo aptitude reinstall tree
  • 更新sudo apt-get update
  • 移除sudo aptitude remove tree
  • 显示状态sudo aptitude show tree

deb包安装

  • 安装sudo dpkg -i xxx.deb
  • 删除sudo dpkg -r xxx

源码安装

查看附带的README文件查看安装步骤

  1. 解压缩源代码包
  2. 进入到安装目录:cd dir
  3. 检测文件是否缺失,创建Makefile,检测编译环境:./configure
  4. 编译源码,生成库和可执行文件:make
  5. 把库和可执行程序,安装到系统目录下:sudo make install
  6. 删除和卸载软件:sudo make distclean

补充

磁盘命名

image-20220522150209246

安装中文包

1
2
3
dnf install glibc-langpack-zh.x86_64
echo LANG=zh_CN.UTF-8 > /etc/locale.conf
source /etc/locale.conf

查看linux系统

uname -a 显示电脑以及操作系统的相关信息

cat /proc/version 显示正在运行的内核版本

cat /etc/issue 显示的是发行版本信息

lsb_release -a 适用于所有版本的linux

image-20221022105705897

赋予sudo权限

visudo 命令修改的是/etc/sudoers文件,是一个只读文件,直接vi /etc/sudoers无法修改

image-20221022114436794

执行visudocat /etc/sudoers查看/etc/sudoers文件内容

image-20221022115041438

1
2
3
4
5
root ALL=(ALL) ALL
用户名 被管理主机的地址=(可使用的身份) 授权命令 (绝对路径)

%wheel ALL=(ALL) ALL
%组名 被管理主机的地址=(可使用的身份) 授权命令 (绝对路径)

将想要赋予root权限的用户添加到文件中,sudo -l 查看可用的sudo命令

还有一个更简单的方法:usermod -aG wheel 用户名

参考:系统命令sudo权限 - 知乎 (zhihu.com)linux wheel用户组,Linux中的Wheel组的作用_嗨嗨嗨夏天的博客-CSDN博客

欢迎关注我的其它发布渠道