[华为云在线课程][Linux常用命令及Shell编程][学习笔记][下]

举报
John2021 发表于 2022/08/17 05:00:07 2022/08/17
【摘要】 5.Linux用户及用户组 5.1.用户及用户组Linux用户只有两个级别:root和非root。Linux中还有一部分用户,如:apache、mysql、nobody、ftp等,这些也都是非root用户,即普通用户。Linux权限实际上是不同用户所能访问的文件的不同产生的假象。这些假象的造成,要涉及另一个概念:用户组。一个用户至少要属于一个用户组。一个用户可以属于多个用户组。Linux采...

5.Linux用户及用户组

5.1.用户及用户组

  • Linux用户只有两个级别:root和非root。
  • Linux中还有一部分用户,如:apache、mysql、nobody、ftp等,这些也都是非root用户,即普通用户。Linux权限实际上是不同用户所能访问的文件的不同产生的假象。这些假象的造成,要涉及另一个概念:用户组。
    • 一个用户至少要属于一个用户组。
    • 一个用户可以属于多个用户组。
  • Linux采用组来组织和管理用户
  • 在Linux中每个用户有唯一的用户标识符UID,该UID是一个无符号整数。
  • 每个用户也必须至少属于一个组,也有组标识符GID
  • 其中UID与GID独立编号:
    • UID 0 root用户
    • UID 1-999是占坑用户,即一些无法登录的用户
    • UID 1000以上是正常可登录用户

5.2.创建用户账号

  • useradd命令
  • useradd示例一 - 创建用户账号
    [root@localhost ~]# useradd user1
    
    • 功能:创建一个用户user1,同时在/etc/passwd和/etc/shadow文件增加一行,并自动为用户创建相应的主目录:/home/user1。
    • 说明:/etc/passwd文件记录了系统中每个用户的用户名、UID号、GID号、主目录、shell等信息。
    • 注意:用户的口令原来也存放在此文件中,现在为了保证安全采用了影子口令文件/etc/shadow来保存每个用户的口令。
  • useradd示例二 - 创建用户账号并设置相应属性值
    [root@localhost ~]# userdel -u 600 -g mygroup1 -G mygroup2 -d /home/student1 s1
    
    • 功能:创建用户s1,其中参数
    • -u 指定UID为600;
    • -g 指定用户的主要组为mygroup1
    • -G 指定用户的附加组为mygroup2,每个用户可以有多个附加组
    • -d 指定用户的主目录为/home/student1

5.3.删除用户帐号

  • userdel命令
  • userdel示例一 - 删除用户
    [root@localhost ~]# userdel user1
    
    • 功能:删除指定用户user1。
  • userdel示例二 - 删除用户的同时删除其主目录
    [root@localhost ~]# userdel -r user1
    
    • 功能:删除指定用户同时删除其主目录。

5.4.创建组账号

  • groupadd命令
  • groupadd示例一 - 创建组账号
    [root@localhost ~]# groupadd mygroup2
    
    • 功能:创建一个新的组,GID号为现有GID的下一个顺序编号。
    • 说明:创建一个组的同时会在/etc/group文件中为该组增加相应的一行,用来记录该组的名称、GID和成员等信息。
  • groupadd示例二 - 创建组账号并设置GID号
    [root@localhost ~]# groupadd -g 5000 mygroup2
    
    • 功能:创建一个新组,并指定GID号为5000,其中-g用来设置用户的主要组,每个用户都有一个主要组。

5.5.删除组

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

5.6.改变口令

  • passwd命令
    [root@localhost ~]# passwd
    Changing password for user root.
    New password: 
    BAD PASSWORD: The password is shorter than 8 characters
    Retype new password: 
    passwd: all authentication tokens updated successfully.
    
    • 功能:普通用户只可以修改自己的口令。

5.7.禁止用户登录

  • passwd示例 - 禁止用户登录
    [root@localhost ~]# passwd -l hello
    Locking password for user hello.
    passwd: Success
    
    • 功能:参数 -l 可以给指定用户加锁,禁止用户登录。

5.8.恢复用户登录

  • passwd示例 - 恢复用户登录
    [root@localhost ~]# passwd -u hello
    
    • 功能:参数-u可以给指定用户解锁,恢复用户登录

5.9.删除用户口令

  • password示例 - 删除用户口令
    [root@localhost ~]# passwd -d hello
    Removing password for user hello.
    passwd: Success
    
    • 功能:参数-d可以删除指定的用户口令,登录无需密码。

5.10.显示用户信息

  • id命令
    [root@localhost ~]# id hello
    uid=1000(hello) gid=1000(hello) groups=1000(hello)
    
    • 功能:显示用户UID、GID及所属组信息。

6.Linux进程管理

6.1.查看进程命令

  • ps命令
  • ps命令示例一 - 不带参数
    [root@localhost ~]# ps
    PID TTY          TIME CMD
    2070 pts/1    00:00:00 bash
    2187 pts/1    00:00:00 ps
    
    • 功能:查询在当前控制台上运行的进程。
  • ps命令示例二 - 查看所有进程
    [root@localhost ~]# ps -aux
    
    • 功能:查询系统中所有运行的进程,包括后台进程,其中参数a表示所有进程,参数x包括不占用控制台的进程,参数u表示用户。
  • ps命令示例三 - 查看所有进程
    [root@localhost ~]# ps -ef
    
    • 功能:查询系统中所有运行的进程,包括后台进程,而且可以显示出每个进程的父进程号。

6.2.top命令

- 功能:动态显示系统中的进程。

6.3.free命令

- 功能:显示出系统中的内存空闲情况。

6.4.杀掉指定进程

  • kill命令示例一 - 杀掉指定进程
    [root@localhost ~]# kill 3029
    
    • 功能:kill命令可以杀掉一个进程,当然普通用户只能杀掉自己的进程。
    • 说明:上述命令中3029是进程号;一般在执行kill命令之前,先用ps或pstree查询一下将要被杀掉的进程的进程号。
  • kill命令示例二 - 强制杀掉指定进程
    [root@localhost ~]# kill -9 3029
    
    • 功能:强制终止3029号进程的运行,参数-9表示强制。
    • 说明:实际上kill命令是向该进程发送信号,该进程接到信号后决定是否停止运行,有些守护进程必须要收到参数9才可终止运行。

7.Linux软件包管理

7.1.软件包管理

  • Linux也能和Windows那样安装各种应用程序,通常称为软件包。目前,在Linux系统下常见的软件包管理工具为RPM。
  • rpm --RedHat Package Management
  • 软件包文件名中i386,noarch等含义
    • i386.rpm 适用于80386及以上CPU
    • i586.rpm 适用于Pentium及以上CPU
    • i686.rpm 适用于Pentium Pro及以上CPU
    • noarch.rpm 该软件包与硬件平台无关
    • src.rpm 软件包源代码

7.2.查询系统中已安装软件包

  • rpm命令
  • rpm命令示例一 - 查询系统中安装的软件包
    [root@localhost ~]# rpm -qa
    
    • 功能:查询系统中安装的软件包列表,其中参数-q的功能是"查询",参数-a的功能是"所有的"。
  • rpm命令示例二 - 查询软件包中文件清单
    [root@localhost ~]# rpm -ql php
    
    • 功能:查询已安装的软件包php中的文件列表,参数-l的功能是"列出指定软件包中的文件"。
  • rpm命令示例三 - 卸载指定的软件包
    [root@localhost ~]# rpm -e php
    
    • 功能:卸载已安装的软件包php,参数-e是卸载。
    • 说明:请注意执行上述命令时,采用的身份是不同的,普通用户只能执行查询操作。
  • rpm命令示例四 - 安装软件包
    [root@localhost ~]# rpm -ivh 软件包.rpm
    
    • 功能:安装软件包
    • 参数 -i 表示安装
    • 参数 -v 表示显示处理过程
    • 参数 -h 功能是显示 # 来表示进度
  • rpm命令示例五 - 忽略依赖关系安装软件包
    [root@localhost ~]# rpm -ivh --nodeps 软件包.rpm
    
    • 功能:安装软件包时忽略与其他软件包的依赖关系,参数–nodeps表示忽略依赖关系。
    • 说明:在安装或卸载软件时经常会遇到提示"该软件包存在依赖关系",只有加上参数–nodeps忽略掉依赖关系才能进行安装或卸载。

7.3.通过源代码安装软件包

  • rpm管理
  • 安装:
  • 通过源代码安装软件包
    • rpmbuild --rebuild software-version.src.rpm
    • rpm -ivh /usr/src/redhat/RPMS/i386/software-version.i386.rpm

7.4.rpm管理常用命令

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

8.Shell编程应用

8.1.shell是什么

  • shell是用户与Linux系统沟通的桥梁。
  • Linux的shell种类众多,这里学习的是bash,也就是Bourne again shell。
    • 由于易用和免费,bash在日常工作中被广泛使用。
    • bash是大多数Linux系统默认的shell。

8.2.shell执行的常用方式

  • a.sh
    • 这样的话需要保证脚本具有执行权限并且在环境变量PATH中有(.),这样在执行的时候会从当前目录查找。
  • ./a.sh
    • 只要保证这个脚本具有执行权限即可。
  • bash a.sh
    • 直接可以执行,甚至这个脚本文件中的第一行都可以不引入/bin/bash,是将hell.sh作为参数传给sh(bash)命令来执行。

8.3.后台模式运行脚本

  • 在脚本后面加一个&
    • test.sh &
      • 说明:这样的话虽可以在后台运行,但是当前会话窗口关闭之后这个脚本也会停止运行。
  • nohup命令
    • 不间断的运行命令,忽略所有挂断(SIGHUP)信号
  • 使用nohup test.sh &
    • nohup命令将进程和终端分开,所以关闭当前会话窗口不会影响这个进程的执行。
    • nohup会在当前执行的目录生成一个nohup.out日志文件。

8.4.标准输入、输出、错误、重定向`

  • 标准输入、输出、错误可以使用文件描述符0、1、2引用
    • ls >file 或者 ls 1>file (ls >> file)
    • ls >file 2>&1
    • ls > /dev/null(把输出信息重定向到无底洞)
    • 例如:***** su -cbpapp -c “monitor_crontab.sh” >/dev/null 2>&1,标准输出和标准错误都重定向到了/dev/null
  • 使用重定向可以把信息转换到其他位置

8.5.变量

  • 变量不需要声明,初始化不需要指定类型
  • 变量命名
    • 不能使用程序中的关键字(保留字)
    • 只能使用数字、字母、下划线,且不能以数字开头
    • 建议命令要通俗易懂
  • 显示变量值使用echo命令,加上 变量名,也可以使用 变量名,也可以使用 {变量名}
    • 例如:echo $JAVA_HOME
    • echo ${JAVA_HOME}

8.6.变量分类

8.6.1.本地变量

  • 只对当前shell进程有效的,对当前进程的子进程和其他shell进程无效。
  • 定义:VAR_NAME=VALUE
  • 变量引用:${VAR_NAME}
  • 取消变量:unset VAR_NAME
  • 相当于Java中的私有变量(private),只能当前类使用,子类和其他类不能使用。

8.6.2.环境变量

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

8.6.3.局部变量

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

8.6.4.位置变量

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

8.6.5.特殊变量

  • $?:接收上一条命令的返回状态码

  • $#:脚本执行时,输入的参数的个数

  • :或者 *:或者 @:输入的参数的具体内容(将输入的参数作为一个多个对象,即是所有参数的一个列表)

    代码 描述
    0 命令成功完成
    1 通常的未知错误
    2 误用shell命令
    126 命令无法执行
    127 没有找到命令
    128 无效的退出参数
    128+x 使用Linux信号x的致命错误
    130 使用ctrl+c终止的命令
    255 规范外的退出状态

8.7.for循环

  • 通过使用一个变量去遍历给定列表中的每个元素,在每次变量赋值时执行一次循环体,直至赋值完成所有元素退出循环
  • 格式一
    for((i=0;i<10;i++))
    do
    ...
    done
    
  • 格式二
    for i in 0 1 2 4 5 8 9
    do
    ...
    done
    
  • 格式三
    for i in {0..9}
    do
    ...
    done
    

8.8.while/until循环

  • 适用于循环次数未知,或不便用for直接生成较大的列表时。
  • 格式
    while 测试条件;do
        循环体
    done
    
  • 如果测试条件为真,则进入循环,测试条件为假,则退出循环。
  • until循环的格式和while循环的格式一致,但是和while循环的意思相反,如果测试条件为假,则进入循环,推出条件为测试条件为真。

8.9.if判断

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

8.10.循环控制命令 - break

  • break命令是在处理过程中跳出循环的一种简单方法,可以使用break命令退出任何类型的循环,包括while循环和until循环
    • 跳出单循环
    • 跳出内循环
      • 使用多循环时break命令自动终止你所在的最里面的循环,注意,当内循环被break命令终止,外循环会继续执行。
    • 跳出外循环
  • 有时处于内循环但需要停止外循环,break命令后面就需要指定一个参数了
    • break n
    • n表明要跳出的循环级别,默认情况下,n是1,代表跳出当前循环,如果将n设置为2,break命令将停止外循环的下一级循环。

8.11.循环控制命令 - continue

  • continue命令是一种提前停止循环内的命令,而不完全终止循环的方法,这就需要在循环内设置shell不执行命令的条件。
    #!/bin/bash
    for((i=0;i<10;i++))
    do
    if [ $i -eq 2 ]
    then
    continue
    fi
    echo $i
    done
    

8.12.自定义函数

function 函数名(){
    ...
}
  • 引用自定义函数文件时,使用source func.sh
  • 有利于代码的重用性
  • 函数传递参数
  • 函数的返回值,只能是数字
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。