心麾浪 发表于 昨天 21:33

第二周

第二周作业

1. 总结通配符,管道,重定向,并且结合示例,添加注释信息
2. 总结linux用户和用户组相关知识点以及常见的操作命令,添加注释信息
3. 总结文件权限管理相关的知识点,包括权限位,特殊权限和ACL,添加详细的注释和解释
4. 总结文件时间戳的用法
5. 总结find和xargs的用法
6. 总结几种压缩工具的使用方法1. 通配符

符号说明*匹配任意字符, 0个或任意个?匹配任意单个字符, 有且只能有一个匹配指定单个字符序列, 生成指定范围的序列1.1 * 使用方式

# 匹配所以以.conf结尾的文件
# ll /etc/*.conf | head -n 5
-rw-r--r--. 1 root root 1370 Apr 27 18:59 /etc/chrony.conf
-rw-r--r--. 1 root root117 Jun 11 23:25 /etc/dracut.conf
-rw-r--r--. 1 root root    9 Jun 232020 /etc/host.conf
-rw-r--r--. 1 root root 8979 Jun 15 12:47 /etc/kdump.conf
-rw-r--r--. 1 root root880 Jun 25 03:52 /etc/krb5.conf

# 列出所有包含"d"的文件
# ls *d*
anaconda-ks.cfgdemo.sh

# 干掉Linux, 或者删除指定目录下的所有文件
# rm -rf /*1.2 ? 使用方式

# 查找固定长度的文件名
# ll /var/log/???.log
-rw-r--r-- 1 root root 246581 Jul3 11:29 /var/log/dnf.log
# ll /var/log/???????.log
-rw-r--r-- 1 root root 42004 Jul3 11:29 /var/log/dnf.rpm.log

# 查找第二个字符为b的文件, 列出的结果不符合, 可能是匹配到的是个目录, 可以搭配echo输出
# ls /etc/?b*
session.confsession.dsystem.confsystem.d
# echo/etc/?b*
/etc/dbus-1

# -d查看目录本身
# ls -d /etc/?b*
/etc/dbus-11.3 [] 使用方式

# 查看所有以y开头的文件, []当作一个可以定制化的?来使用即可
# ll /usr/bin/*
-rwxr-xr-x1 root root 32064 May2 16:31 /usr/bin/yes
lrwxrwxrwx. 1 root root   8 May 162022 /usr/bin/ypdomainname -> hostname
lrwxrwxrwx1 root root   5 May4 11:12 /usr/bin/yum -> dnf-3

# 列出bcd任意一个字符开头的文件
# ll /usr/bin/*

# 列出a-z任意一个字符开头的文件
# ll /usr/bin/*1.4 {} 使用方式

# {}的主要作用, 是用来生成一个序列
# echo {1..9}
1 2 3 4 5 6 7 8 9

# 序列是可以拼接的
# echo {1..9}.txt
1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt

# touch {1..9}.txt, 实际上执行的就是 touch 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt
# touch {1..9}.txt
# ls .txt
1.txt2.txt3.txt4.txt5.txt6.txt7.txt8.txt9.txt

# 指定步长, 即每次迭代时的数量, 默认为1
# echo {1..9..2}
1 3 5 7 92. 管道

管道的作用: 将管道符前面命令的标准输出, 当作管道符后面命令的标准输入, 没有标准输出/命令不能从标准输入读取数据也可以使用管道, 只是没有连接的意义
# mkdir test创建一个目录, 成功了是没有输出的, 虽然cat能够从标准输入读取数据, 但是没有数据执行就没有意义
# mkdir test| cat

# echo有输出, 但是ls不支持从标准输入读取数据, 列出的还是当前目录, 而不是指定的内容, 因此也是没有意义的
# echo 1.txt | ls
1.txt2.txt3.txt4.txt5.txt6.txt7.txt8.txt9.txtanaconda-ks.cfgdemo.shnohup.outroot@11.0.0.3testxxx.txt

# 通过ls查看, 发现输出的内容都是在同一行
# ls .txt
1.txt2.txt3.txt4.txt5.txt

# 管道交给cat -A, 可以发现, ls的内容, 每个都是独立的行, 而不是单纯的展示出来的一行空格分割
# ls .txt | cat -A
1.txt$
2.txt$
3.txt$
4.txt$
5.txt$3. 重定向

重定向: 默认的重定向, 是输出到终端的, 可以通过> | >>的方式, 改变数据的流量, 常见的就是到文件, 而不是输出到终端.
3.1 追加与覆盖

# >: 覆盖
# >>: 追加
# echo 123 >> 1.txt

# 追加重定向, 会在最后新加行
# cat 1.txt
123
123

# 直接清空原文件内容, 在写入新内容
# echo 456 > 1.txt
# cat 1.txt
456

# 快速清空文件的方式
# cp /etc/passwd ./; > passwd
# cat passwd3.2 标准输出

# 1>, 1>> | >, >>: 标准输出重定向, 1为标准输出, 默认值

# 1.txt存在, 则是一个标准输出, 输出的内容重定向到2.txt
# ls 1.txt > 2.txt
# cat 2.txt
1.txt

# 11.txt不存在, ls找不到文件会提示错误信息, 这个属于标准错误, 不会被标准输出捕获
# ls 11.txt > 2.txt
ls: cannot access '11.txt': No such file or directory

# 没有标准输出, 就是空, 等同于执行了>2.txt, 会清空2.txt原有的内容
# cat 2.txt3.3 标准错误

# 2>, 2>>: 标准错误重定向, 指的是程序执行时的一些错误输出, 不一定是程序报错, 只是命令内部逻辑认为是一个错误信息

# 1.txt存在, 则输出标准错误, 2>只会捕获标准错误
# ls 1.txt 2> 2.txt
1.txt

# 11.txt不存在, 是一个标准错误, 被2>重定向到2.txt, 不会在输出到屏幕
# ls 11.txt 2> 2.txt
# cat 2.txt
ls: cannot access '11.txt': No such file or directory3.4 标准输入

# <<< "哈哈哈": 标准输入, 可以直接输出字符串
# < file: 标准输入, 需要一个文件
# cat <<< "哈哈哈"
哈哈哈
# cat < 1.txt
mkdir: cannot create directory ‘test/’: File exists4. 用户相关

4.1 用户分类

1. 管理员: 默认为root用户, uid为0, 实际上, Linux就是以uid来判定用户身份的, 0就是管理员
2. 系统用户: uid通常为1-999, 这类用户通常是运行各种服务使用的用户, 例如sshd, mysql, nginx等
3. 普通用户: uid为1000+, 默认创建出来的用户, 就是依次递增的
4.2 用户相关文件

1. /etc/passwd: 记录用户的基本信息, 用户名称, uid, gid, 登录所使用的shell等
2. /etc/shadow: 记录用户的密码信息
3. /etc/group|/etc/gshadow: 组相关信息
4.3 创建普通用户

创建普通用户, 不建议指定uid/gid, 按照默认自动增长即可, 尽可能的保证每个用户的uid和gid都是样的, 方便与管理, 而不是uid10086, gid 10000这样杂乱无章的
# curl有一个比较特殊的地方, 建立连接的信息会被认为是标准错误, 在正常请求完成后会被隐藏起来, 这也就导致, 不管是> 或 2>, 都无法将所有的信息都屏蔽掉
# curlhttp://11.0.0.1/
你好, 世界
# curlhttp://11.0.0.1/ > /dev/null
% Total    % Received % XferdAverage Speed   Time    Time   TimeCurrent
                                 DloadUpload   Total   Spent    LeftSpeed
100    15100    15    0   015000      0 --:--:-- --:--:-- --:--:-- 15000
# curlhttp://11.0.0.1/ 2> /dev/null
你好, 世界

# 将标准错误和标准输出全部全定向方式1: 标准输出到/dev/null, 标准错误到标准输出, 链条式重定向
# curlhttp://11.0.0.1/ > /dev/null2>&1

# 方式2: 新写法, 老系统可能不支持
# curlhttp://11.0.0.1/ &> /dev/null4.4 删除用户

# 创建用户
# useradd zhangfei
# grep zhangfei /etc/passwd
zhangfei:x:1001:1001::/home/zhangfei:/bin/bash

# 默认情况下, 创建一个用户, 会自动创建一个同名的组作为该用户的主组
# id zhangfei
uid=1001(zhangfei) gid=1001(zhangfei) groups=1001(zhangfei)

# 密码设置
# passwd zhangfei
Changing password for user zhangfei.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.

# 登录测试
# ssh zhangfei@127.0.0.1 'whoami'
zhangfei@127.0.0.1's password:
zhangfei

# Rocky创建用户, 默认就会创建家目录, Ubuntu需要显示的指定 -m 才会创建家目录
# ls -A ~zhangfei
.bash_logout.bash_profile.bashrc4.5 创建系统用户

创建方式1: 不推荐s
# 删除用户, 默认情况下, 删除用户, 会保留家目录, 只是把/etc/passwd, /etc/shadow, 还有组的信息删除掉
# ll /home/
drwx------ 2 admin    admin    62 Jun 30 23:12 admin
drwx------ 2 zhangfei zhangfei 62 Jul7 22:21 zhangfei
# userdel admin
# id admin
id: ‘admin’: no such user
# ll /home/
total 0
drwx------ 2   1000   1000 62 Jun 30 23:12 admin
drwx------ 2 zhangfei zhangfei 62 Jul7 22:21 zhangfei

# 加上-r选项, 删除比较彻底
# userdel -r zhangfei
# ll /home/
total 0
drwx------ 2 1000 1000 62 Jun 30 23:12 admin创建方式2: 推荐
# 通过-u选项指定uid, 会有warning提示, 但是不影响创建成功, 但是gid是从1000开始的
# useradd -u 99 liubei
useradd warning: liubei's uid 99 outside of the UID_MIN 1000 and UID_MAX 60000 range.
# id liubei
uid=99(liubei) gid=1000(liubei) groups=1000(liubei)

# -r选项表示创建一个系统用户, 这个时候就不会报错, 并且gid也是1000以内
# useradd -r -u 100 guanyu
# id guanyu
uid=100(guanyu) gid=992(guanyu) groups=992(guanyu)4.6 密码的修改

交互式: 执行命令后, 需要用户输入相关信息才能继续
非交互式: 一条命令搞定, 不需要在执行过程中操作
# 创建一个gid为555的nginx2组
# groupadd -g 555 nginx2

# 创建一个uid为555, gid为555的系统用户nginx2
# useradd -r -u 555 -g 555 nginx2

# uid=gid, 这样看着就舒服多了
# id nginx
uid=996(nginx) gid=993(nginx) groups=993(nginx)5.6 特殊属性

特殊属性对root用户也是有限制的, 不会显式的展示出属性信息, 需要特定的命令查看, 特殊属性:

[*]a: 只允许追加, 不能编辑/删除原有内容
[*]i: 不能修改/删除/重命名
[*]...........................................................................
# Rocky的非交互式修改密码方式, --stdin支持从标准输入中读取数据作为密码, 下面两种方式效果是一样的
# passwd --stdin liubei <<< "123456"
# echo "123456" | passwd --stdin liubei
Changing password for user liubei.
passwd: all authentication tokens updated successfully.
# ssh liubei@127.0.0.1 "whoami"
liubei@127.0.0.1's password:
liubei

# 通用与Rocky/Ubuntu的写法, ubuntu的passwd命令, 是不支持--stdin的
# 方式1: 取巧的写法
# echo -e "12345678\n12345678" | passwd liubei
Changing password for user liubei.
New password: BAD PASSWORD: The password fails the dictionary check - it is too simplistic/systematic
Retype new password: passwd: all authentication tokens updated successfully.
# 方式2: 规范的写法
# echo "liubei:123456" | chpasswd
# ssh liubei@127.0.0.1 "whoami"
liubei@127.0.0.1's password:
liubei
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 第二周