Linux基础
完成作业:
第二周
1、总结cp、move命令的用法(要求列出源及目标各种情况的表格)
利用cp(copy)命令可以实现文件或目录的复制
格式:
cp [option]...[-T] SOURCE DEST
cp [option]...SOURCE DIRECTORY
cp [option]...-t DIRECTORY SOURCE...
-
-i 如果目标已存在,覆盖前提示是否覆盖
-
-n 不覆盖,主要两者顺序
-
-r,-R 递归复制目录及内部的所有内容
-
-a 归档,相当于-dR --preserv=all,常用于备份功能
-
-d --no-dereference --preserv=links 不复制原文件,只复制连接名
-
--preserv[=ATTR_LIST]
mode:权限
ownership:属主属组
timestamp:
links
xattr
context
all
- -p 等同--preserv=mode,ownership,timestamp
- -v --verbose
- -f --force
- -u --update 只复制源比目标更新文件或目标不存在的文件
- -b 目标存在,覆盖前先备份,默认形式为filename~,只保留最近的一个备份
- --backup=numbered 目标存在,覆盖前先备份加数字后缀,形式为filename.~#~,可以保留多个版本
| 源/目标 | 不存在 | 存在且为文件 | 存在且为目录 |
|---|---|---|---|
| 一个文件 | 新建DEST,并将SRC中内容填充至DEST中 | 将SRC中的内容覆盖至DEST中 注意数据丢失风险!建议用-i选项 | 在DEST下新建与源文件同名的文件,并将SRC中内容填充至新文件中 |
| 多个文件 | 提示错误 | 提示错误 | 在DEST下新建与原文件同名的文件,并将源文件内容复制进新文件中 |
| 目录须使用-r选项 | 创建指定DEST同名目录,复制SRC目录中所有文件只DEST下 | 提示错误 | 在DEST下新建与原目录同名的目录,并将SRC中内容复制至新目录中 |
mv命令移动和重命名文件
同一分区移动数据,速度很快,数据位置没有变化
不同分区移动数据,速度相对慢,数据位置发生了变化
格式:
mv [option]...[-T] SOURCE DEST
mv [option]...SOURCE DIRECTORY
mv [option]...-t DIRECTORY SOURCE...
常用选项
- -i 交互式
- -f 强制
- -b 目标存在,覆盖前先备份
利用rename可以批量修改文件名
格式:
rename [options] <expression> <replacement> <file>...
范例:
#为所有的conf文件加上.bak后缀:
rename 'conf' 'conf.bak' f*
#去掉所有的bak后缀:
rename '.bak' ' ' *.bak
2、总结IO重定向的类别和区别
标准输入和输出
程序:指令+数据
打开的文件都有一个fd:file descriptor(文件描述符)
Linux给程序提供三种I/O设备
- 标准输入(STDIN) -0 默认接受来自终端窗口的输入
- 标准输出(STDOUT)-1 默认输出到终端窗口
- 标准错误(STDERR)-2 默认输出到终端窗口
通常我们在linux下看到的*控制台(console)*是由几个设备完成的。分别是/dev/ttyN(其中tty0就是/dev/console,tty1,tty2就是不同的*虚拟终端*(virtual console))。通常使用热键ctrl+alt+Fn来在这些虚拟终端之间进行切换。所有的这些tty设备都是由linux/drivers/char/console.c和vt.c对应。*/dev/pts*是*远程登陆*(telnet,ssh等)后创建的控制台设备文件所在的目录。由于可能有好几千个用户登陆,所以/dev/pts其实是动态生成的,不象其他设备文件是构建系统时就已经产生的硬盘节点(如果未使用devfs)
范例:文件描述符
[root@southseal ~]# ll /dev/std*
lrwxrwxrwx 1 root root 15 Apr 29 09:23 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Apr 29 09:23 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Apr 29 09:23 /dev/stdout -> /proc/self/fd/1
[root@southseal ~]# ll /proc/self/fd/*
ls: cannot access '/proc/self/fd/255': No such file or directory
lrwx------ 1 root root 64 Apr 29 09:28 /proc/self/fd/0 -> /dev/pts/0
lrwx------ 1 root root 64 Apr 29 09:28 /proc/self/fd/1 -> /dev/pts/0
lrwx------ 1 root root 64 Apr 29 09:28 /proc/self/fd/2 -> /dev/pts/0
lr-x------ 1 root root 64 Apr 29 09:28 /proc/self/fd/3 -> /var/lib/sss/mc/passwd
lrwx------ 1 root root 64 Apr 29 09:28 /proc/self/fd/4 -> 'socket:[42991]'
lr-x------ 1 root root 64 Apr 29 09:28 /proc/self/fd/5 -> /var/lib/sss/mc/group
I/O重定向redirect
I/O重定向:将默认的输入,输出或错误对应的设备改变,指向新的目标
标准输出和错误重定向
STDOUT和STDERR可以被重定向到指定文件,而非默认的当前终端
格式:
命令 操作符号 文件名
支持操作符号包括:
1> 或 > 把STDOUT重定向到文件
2> 把STDERR重定向到文件
&> 把标准输出和错误都重定向
>& 和上面功能一样,建议使用上面方式
以上如果文件已存在,文件内容会被覆盖
set -C 禁止将内容覆盖已有文件,但可追加,利用 >| 仍可强制覆盖
set +C 允许覆盖,默认
追加
\>> 可以在原有内容基础上,追加内容
把输出和错误重新定向追加到文件
>> 追加标准输出重定向至文件
2>> 追加标准错误重定向至文件
标准输出和错误输出各自定向至不同位置
COMMAND > /path/to/file.out 2> /path/to/error.out
合并标准输出和错误输出为同一个数据流进行重定向
&> 覆盖重定向
&>> 追加重定向
COMMAND > /path/to/file.out 2>&1 (顺序很重要)
COMMAND >> /path/to/file.out 2>&1
合并多个程序
(CMD1;CMD2......)或者{CMD1;CMD2;...;}合并多个程序的STDOUT
范例:标准输出重定向
[root@southseal ~]# ls > /dev/pts/0 #将ls命令输出重定向到/dev/pts/0虚拟终端上
anaconda-ks.cfg Downloads Music Templates windows.txt
Desktop initial-setup-ks.cfg Pictures Videos win.txt
Documents linux.txt Public windows1.txt
[root@southseal ~]# ls /data > /dev/pts/0 #将ls /data命令输出重定向到/dev/pts/0虚拟终端上;/dev/pts/0 表示当前虚拟终端
backup conf f1.txt~ f1.txt.~2~ f3.txt rootdir1
backup2021-04-22 f1.txt f1.txt.~1~ f2.txt rootdir rootdir2
范例:标准错误重定向
[root@southseal ~]# rm /data/f1.log 2> /data/all.log
[root@southseal ~]# cat /data/all.log
rm: cannot remove '/data/f1.log': No such file or directory
范例:合并多个命令的结果至一个文件中
[root@southseal ~]# ( cal 2009 ; cal 2020 )> all.txt
[root@southseal ~]# { ls;hostname; } > /data/all.log
范例:清除大文件
[root@southseal ~]# cat /dev/null > /data/all.log
范例:分别重定向
[root@southseal ~]# ls /data/ /xxx > stdout.log 2> stderr.log
范例:将标准输出和错误都重定向到同一个文件
[root@southseal ~]# ls /data /xxx > /data/all.log 2>&1
[root@southseal ~]# ls /data /xxx 2> /data/all.log 1>&2
[root@southseal ~]# ls /data /xxx &> /data/all.log
[root@southseal ~]# ls /data /xxx 2>&1 /data/all.log
[root@southseal ~]# ls /data /xxx 2>&1 > /data/all.log1
ls: cannot access '/xxx': No such file or directory
3、将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中
tr命令:转换和删除字符
tr [OPTION]... SET1 [SET2]
选项:
-d --delete:删除所有属于第一字符集的字符
-s --squeeze-repeats:把连续重复的字符以单独一个字符表示,即去重
-t --truncate-set1:将第一个字符集对应字符转化为第二字符集对应的字符
-c -C --complement:取字符集的补集
\NNN character with octal value NNN (1 to 3 octal digits)
\\ backslash
\a audible BEL
\b backspace
\f form feed
\n new line
\r return
\t horizontal tab
\v vertical tab
[:alnum:] 字母和数字
[:alpha:] 字母
[:blank:] 空格或制表符
[:cntrl:] 控制(非打印)字符
[:digit:] 数字
[:graph:] 图形字符
[:lower:] 小写字母
[:print:] 可打印字符
[:punct:] 标点符号
[:space:] 空白字符
[:upper:] 大写字母
[:xdigit:] 十六进制字符
[root@localhost ~]# cat /etc/issue | tr 'a-z' 'A-Z' > /tmp/issue.out
[root@localhost ~]# cat /tmp/issue.out
\S
KERNEL \R ON AN \M
4、请总结描述用户和组管理类命令的使用方法并完成以下练习:
用户和组管理命令
用户管理命令
-
useradd
-
usermod
-
userdel
组账号维护命令
- groupadd
- groupmod
- groupdel
用户创建
useradd命令可以创建新的Linux用户
useradd [options] LOGIN
常见选项
-u UID
-o 配合-u选项,不检测UID的唯一性
-g GID 指明用户所属基本组,可为组名,也可以GID
-c "COMMENT" 用户的注释信息
-d HOME_DIR 以指定的路径(不存在)为家目录
-s SHELL 指明用户的默认shell程序,可用列表在/etc/shells文件中
-G GROUP1[,GROUP2,...] 为用户指明附加组,组需事先存在
-N 不创建私有组做主组,使用users组做主组
-r 创建系统用户Centos6之前ID<500 Centos7以后ID<1000
-m 创建家目录,用于系统用户
-M 不创建家目录,用于非系统用户
-p 指定加密码的密码
范例:
useradd -r -u 48 -g apache -s /sbin/nologin -d /var/www -c "Apache" apache
useradd命令默认值设定由/etc/default/useradd定义
[root@southseal ~]# cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1 #对应/etc/shadow文件第7列,即用户密码过期的宽限度
EXPIRE= #对应/etc/shadow文件第8列,即用户账号的有效期
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
显示或更改默认设置
useradd -D
useradd -D -s SHELL
useradd -D -b BASE_DIR
useradd -D -g GROUPB
新建用户的相关文件
- /etc/default/useradd
- /etc/skel/*
- /etc/login.defs
批量创建用户
newusers passwd 格式文件
批量修改用户口令
echo username:passwd | chpasswd
用户属性修改
usermod命令可以修改用户属性
格式:
usermod [OPTION] login
常见选项
-u UID:新UID
-g GID:新主组
-G GROUP1[,GTOUP2,...[,GROUP]]:新附加组,原来的附加组将会被覆盖,若保留原有,则要同时使用-a选项
-s SHELL:新的默认SHELL
-c 'COMMENT':新的注释信息
-d HOME:新家目录不会自动创建,若要创建新家目录并移动源家数据,同时使用-m选项
-l login_name:新的名字
-L:lock指定用户,在/etc/shadow密码栏的增加!
-U:unlock指定用户,将/etc/shadow密码栏的!去掉
-e YYYY-MM-DD:指明用户账号过期日期
-f INACTIVE:设定非活动期限,即宽限期
删除用户
userdel 可删除Linux用户
格式:
userdel [OPTION] ... Login
常见选项:
-f,--forec 强制
-r,--remove 删除用户家目录和邮箱
查看用户相关的ID信息
id命令可以查看用户的UID,GID等信息
id [OPTION]...[USER]
常见选项:
-u:显示UID
-g:显示GID
-G:显示用户所属的组的ID
-n:显示名称,需配置ugG使用
创建组
groupadd实现创建组
格式:
groupadd [OPTION]...group_name
常见选项:
-g GID指明GID号:[GID_MIN,GID_MAX]
-r 创建系统组,CentOS 6 之前ID<500,Centos 7之前ID<1000
范例:
groupadd -g 48 -r apache
修改组
groupmod组属性修改
格式:
groupmod [OPTION]... group
常见选项:
-n group_name:新名字
-g GID:新的GID
组删除
groupdel可以删除组
格式:
groupdel [OPTIONS] GROUP
常见选项:
-f,--force 强制删除,即使是用户的主组也强制删除
更改和查看组成员
groupmems [options] [action]
常见选项:
-g,--group groupname #更改为指定组(只有root)
-a,--add username #指定用户加入组
-d,--delete username #从组中删除用户
-p,--purge #从组中清除所有成员
-l,--list #显示组成员列表
groups可查看用户组关系
格式:
#查看用户所属组列表
groups [OPTION].[USERNAME]...
(1)、创建组distro,其GID为2019;
[root@southseal ~]# groupadd -g 2019 distro
[root@southseal ~]# cat /etc/group |grep distro
distro:x:2019:
(2)、创建用户mandriva, 其ID号为1005;基本组为distro;
[root@southseal ~]# useradd mandriva -u 1005 -g distro
[root@southseal ~]# id mandriva
uid=1005(mandriva) gid=2019(distro) groups=2019(distro)
(3)、创建用户mageia,其ID号为1100,家目录为/home/linux;
[root@southseal ~]# useradd mageia -u 1100 -d /home/linux
[root@southseal ~]# id mageia
uid=1100(mageia) gid=1100(mageia) groups=1100(mageia)
[root@southseal linux]# su mageia
[mageia@southseal ~]$ pwd
/home/linux
(4)、给用户mageia添加密码,密码为mageedu,并设置用户密码7天后过期
#两条命令如果同时写入密码不会写入系统
[root@southseal linux]# echo "mageedu" | passwd --stdin -x 7 mageia
[root@southseal linux]# cat /etc/shadow |grep mageia #密码没有写入系统
mageia:!!:18759:0:7:7:::
#分开写功能正常实现
[root@southseal linux]# passwd -x 7 mageia
[root@southseal linux]# echo "mageedu" | passwd --stdin mageia
Changing password for user mageia.
passwd: all authentication tokens updated successfully.
[root@southseal linux]# cat /etc/shadow |grep mageia
mageia:$6$fStq1Oe5LiRoV0Q/$UrClgVBIx4h.eP27ZXkOq.RDY170eTyDk32h9OJ5Zf2gbVuSo9Zv/Y.0.cxwdMUTr3tgLfVJF2b5JIGF8E4aZ0:18759:0:7:7:::
(5)、删除mandriva,但保留其家目录;
[root@southseal ~]# cd /home/
[root@southseal home]# ls
mandriva
[root@southseal home]# userdel -f mandriva
[root@southseal home]# ls
mandriva
(6)、创建用户slackware,其ID号为2002,基本组为distro,附加组peguin;
[root@southseal ~]# groupadd peguin
[root@southseal ~]# useradd slackware -u 2002 -g distro -G peguin
[root@southseal ~]# id slackware
uid=2002(slackware) gid=2019(distro) groups=2019(distro),2020(peguin)
(7)、修改slackware的默认shell为/bin/tcsh;
[root@southseal home]# usermod slackware -s /bin/tcsh
[root@southseal home]# cat /etc/passwd |grep slackware
slackware:x:2002:2019::/home/slackware:/bin/tcsh
(8)、为用户slackware新增附加组admins,并设置不可登陆。
[root@southseal ~]# groupadd admins;usermod slackware -aG admins -L
[root@southseal ~]# id slackware
uid=2002(slackware) gid=2019(distro) groups=2019(distro),2020(peguin),2021(admins)
[root@southseal ~]# cat /etc/shadow |grep slackware
slackware:!!:18759:0:99999:7:::
(9)、创建用户user1、user2、user3。在/data/下创建目录test
[root@southseal ~]# cat username.file
user1:x:1200:1200::/home/user1:/bin/bash
user2:x:1201:1201::/home/user2:/bin/bash
user3:x:1202:1202::/home/user3:/bin/bash
[root@southseal ~]# newusers username.file
[root@southseal ~]# cat /etc/passwd | grep ^user
user1:x:1200:1200::/home/user1:/bin/bash
user2:x:1201:1201::/home/user2:/bin/bash
user3:x:1202:1202::/home/user3:/bin/bash
[root@southseal ~]# mkdir -p /data/test
[root@southseal ~]# ll -d /data/test
drwxr-xr-x 2 root root 6 May 12 13:56 /data/test
(1)、设置目录/data/test属主、属组为user1
[root@southseal ~]# chown user1:user1 /data/test
[root@southseal ~]# ll -d /data/test
drwxr-xr-x 2 user1 user1 6 May 12 13:56 /data/test
(2)、在目录属主、属组不变的情况下,user2对test及其子目录有读写权限
[root@southseal ~]# setfacl -m u:user2:rw /data/test
[root@southseal ~]# getfacl /data/test
getfacl: Removing leading '/' from absolute path names
# file: data/test
# owner: user1
# group: user1
user::rwx
user:user2:rw-
group::r-x
mask::rwx
other::r-x
(3)、user1在/data/test目录下创建文件a1.sh, a2.sh, a3.sh, a4.sh,设置所有用户都不可删除1.sh,2.sh文件。
[root@southseal ~]# su - user1
[user1@southseal ~]$ touch /data/test/a{1..4}.sh
[user1@southseal ~]$ ll /data/test/
total 0
-rw-rw-r-- 1 user1 user1 0 May 12 14:24 a1.sh
-rw-rw-r-- 1 user1 user1 0 May 12 14:24 a2.sh
-rw-rw-r-- 1 user1 user1 0 May 12 14:24 a3.sh
-rw-rw-r-- 1 user1 user1 0 May 12 14:24 a4.sh
[user1@southseal ~]$ chattr -i /data/test/a{1,2}.sh
[user1@southseal ~]$ lsattr /data/test/a{1,2}.sh
-------------------- /data/test/a1.sh
-------------------- /data/test/a2.sh
(4)、清理/data/test目录及其下所有文件的acl权限
[root@southseal user1]# setfacl -R -b /data/test
[root@southseal user1]# getfacl /data/test
getfacl: Removing leading '/' from absolute path names
# file: data/test
# owner: user1
# group: user1
user::rwx
group::r-x
other::r-x
[root@southseal user1]# ll -d /data/test
drwxr-xr-x 2 user1 user1 58 May 12 14:24 /data/tes