时,会判断右边的文件存不存在,如果存在的话就先删除,然后创建一个新的文件,不存在的话则直接创建。_sh">
当前位置:   article > 正文

linux总结(标准输出到重定向文件+Shell variable+Linux 用户和组管理)_shell 标准输出到文件

shell 标准输出到文件

课堂作业


第七章


标准输出到重定向文件

  • 标准输入:由键盘输入

  • 标准输出:输出到屏幕

  • 标准错误:输出到屏幕

[zqm@haojing ~]$ find /etc -name passwd //绝对匹配;在window操作系统中是模糊匹配

find: ‘/etc/grub.d’: Permission denied

find: ‘/etc/pki/CA/private’: Permission denied

find: ‘/etc/pki/rsyslog’: Permission denied

/etc/pam.d/passwd //正确信息 标准输出stdout

/etc/passwd //正确信息

find: ‘/etc/selinux/targeted/active’: Permission denied //错误信息 标准错误stderr

find: ‘/etc/selinux/final’: Permission denied //错误信息

find: ‘/etc/dhcp’: Permission denied

find: ‘/etc/lvm/archive’: Permission denied

[zqm@haojing ~]$find /etc -name passwd >passwd.stdout //没有上面绝对查找出来的的文件

find: ‘/etc/grub.d’: Permission denied

find: ‘/etc/pki/CA/private’: Permission denied

find: ‘/etc/pki/rsyslog’: Permission denied

find: ‘/etc/selinux/targeted/active’: Permission denied

find: ‘/etc/selinux/final’: Permission denied

find: ‘/etc/dhcp’: Permission denied

[zqm@haojing ~]$ cat passwd.stdout //将文件存放到passwd。stdout中

/etc/pam.d/passwd

/etc/passwd

[zqm@haojing ~]$ find /etc -name passwd >>passwd.stdout // >>追加符号

find: ‘/etc/grub.d’: Permission denied

find: ‘/etc/pki/CA/private’: Permission denied

find: ‘/etc/pki/rsyslog’: Permission denied

find: ‘/etc/selinux/targeted/active’: Permission denied

find: ‘/etc/selinux/final’: Permission denied

find: ‘/etc/dhcp’: Permission denied

[zqm@haojing ~]$ cat passwd.stdout //追加结果

/etc/pam.d/passwd

/etc/passwd

/etc/pam.d/passwd

/etc/passwd

  • file不存在,则创建

  • file存在,则覆盖其内容

 如果只是想追加内容而不是覆盖原有内容,则可以使用追加符号 >>

> filename 把标准输出重定向到新文件中

1>filename 同上

>>filename 把标准输出追加到文件中

1>>filename 同上

2>filename 把标准错误重定向到新文件中

2>>filename 把标准错误追加到新文件中

使用>或者>>对输出进行重定向。符号的左边表示文件描述符,如果没有的话表示1,也就是标准输出,符号的右边可以是一个文件,也可以是一个输出设备。

当使用>时,会判断右边的文件存不存在,如果存在的话就先删除,然后创建一个新的文件,不存在的话则直接创建。但是当使用>>进行追加时,则不会删除原来已经存在的文件。

[zqm@haojing ~]$ ls /dev/null

/dev/null

[zqm@haojing ~]$ file /dev/null

/dev/null: character special

[zqm@haojing ~]$ cat /dev/null

[zqm@haojing ~]$ find /etc -name passwd 2> /dev/null

/etc/pam.d/passwd

/etc/passwd

[zqm@haojing ~]$ cat /dev/null

/dev/null代表linux的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称“黑洞”。那么执行了>/dev/null之后,标准输出的内容就会不再存在,没有任何地方能够找到输出的内容。

[zqm@haojing lab]$ touch file1

[zqm@haojing lab]$ > filer2 //可以创建空文件

[zqm@haojing lab]$ ls

file1 filer2

[zqm@haojing lab]$ >> file3 //追加也可以实现

[zqm@haojing lab]$ ls

file1 file3 filer2

# 创建一个空文件testfile

> testfile

>> testfile

[zqm@haojing lab]$ find /etc -name passwd &> passwd.all //正确和错误的都在同一个文件夹

[zqm@haojing lab]$ cat passwd.all

find: ‘/etc/grub.d’: Permission denied

find: ‘/etc/pki/CA/private’: Permission denied

find: ‘/etc/pki/rsyslog’: Permission denied

/etc/pam.d/passwd

/etc/passwd

find: ‘/etc/selinux/targeted/active’: Permission denied

find: ‘/etc/selinux/final’: Permission denied

find: ‘/etc/dhcp’: Permission denied

find: ‘/etc/lvm/archive’: Permission denied

find: ‘/etc/lvm/backup’: Permission denied

# 将错误信息正确信息覆盖写入到相同文件

[zqm@haojing lab]$ find /etc -name'passwd' &>passwd.all

# 将错误信息正确信息追加写入到相同文件

[zqm@haojing lab]$ find /etc -name'passwd' &>>passwd.all

标准输出重定向到程序

管道符(|)实现,将上一个命令的输出作为标准输入传递给下一个命令。(可以起到过滤作用)

[zqm@haojing lab]$ mandb

[zqm@haojing lab]$ man-k ext4 >ext4.man //搜索所有ext4手册,并报错到ext4.man文件中

[zqm@haojing lab]$ cat ext4.man

debugfs (8) - ext2/ext3/ext4 file system debugger

dumpe2fs (8) - dump ext2/ext3/ext4 filesystem i...

e2fsck (8) - check a Linux ext2/ext3/ext4 fil...

e2image (8) - Save critical ext2/ext3/ext4 fil...

e2label (8) - Change the label on an ext2/ext3...

e2undo (8) - Replay an undo log for an ext2/e...

e4defrag (8) - online defragmenter for ext4 fil...

ext4 (5) - the fourth extended file system

[zqm@haojing lab]$ grep resize ext4.man //过滤ext4.man文件中含有resize的行

resize2fs (8) - ext2/ext3/ext4 file system resizer

[zqm@haojing lab]$ grep resize ext4.man

resize2fs (8) - ext2/ext3/ext4 file system resizer

[zqm@haojing lab]$ man -k ext4 | grep resize

resize2fs (8) - ext2/ext3/ext4 file system resizer

[zqm@haojing lab]$ man -k ext4 | grep mke2fs

mke2fs (8) - create an ext2/ext3/ext4 filesystem

[zqm@haojing lab]$ man -k ext4 | grep fsck

e2fsck (8) - check a Linux ext2/ext3/ext4 fil...

fsck.ext2 (8) - check a Linux ext2/ext3/ext4 fil...

fsck.ext3 (8) - check a Linux ext2/ext3/ext4 fil...

fsck.ext4 (8) - check a Linux ext2/ext3/ext4 fil...

[zqm@haojing lab]$ man -k ext4 | grep fsck | grep fsck.ext4 //可以进一步过滤

fsck.ext4 (8) - check a Linux ext2/ext3/ext4 fil...

[zqm@haojing lab]$ ip a |grep 10.1.8

inet 10.1.8.88/24 brd 10.1.8.255 scope global noprefixroute ens32

tee 命令

tee 命令作用,接收管道传递过来的stdin,并继续作为stdout输出。

tee命令覆盖保存到文件

[zqm@haojing lab]$ find /etc -name 'passwd' 2>/dev/null | tee passwd.list

/etc/pam.d/passwd

/etc/passwd

[zqm@haojing lab]$ cat passwd.list

/etc/pam.d/passwd

/etc/passwd

[zqm@haojing lab]$ find /etc -name passwd 2> passwd.stderr |tee passwd.list

/etc/pam.d/passwd

/etc/passwd

[zqm@haojing lab]$ cat passwd.list

/etc/pam.d/passwd

/etc/passwd

存到三个文件

[zqm@haojing lab]$ find /etc -name passwd 2> passwd.stderr |tee passwd1 | tee passwd2 |tee passwd3

/etc/pam.d/passwd

/etc/passwd

[zqm@haojing lab]$ cat passwd[123]

/etc/pam.d/passwd

/etc/passwd

/etc/pam.d/passwd

/etc/passwd

/etc/pam.d/passwd

/etc/passwd

标准输入重定向给程序

cat打印字符串

[zqm@haojing ~]$ cat passwd.stdout

/etc/pam.d/passwd

/etc/passwd

/etc/pam.d/passwd

/etc/passwd

[zqm@haojing ~]$ cat <passwd.stdout

/etc/pam.d/passwd

/etc/passwd

/etc/pam.d/passwd

/etc/passwd

[zqm@haojing ~]$ cat

hello // 键盘输入hello后回车

hello //屏幕上显示hello

判定一个命令是否接收标准输入:最简单的方式就是将文件内容作为标准输入重定向给程序。

思考:如何一次性将多行内容写入到文件中?

# 方法1:使用引号

[zqm@haojing lab]$ echo 'hello word

> hello python

> hello linux' >multi.lines.txt

[zqm@haojing lab]$ cat multi.lines.txt

hello word

hello python

hello linux

[zqm@haojing lab]$ echo 'hello word> hello python> hello linux' > multi_lines.txt

[zqm@haojing lab]$ cat multi_lines.txt

hello word> hello python> hello linux

# 方法2:使用cat重定向

[zqm@haojing lab]$ cat > multi_lines.txt <<EOF

> hello word

> hello python

> hello linux

> EOF

[zqm@haojing lab]$ cat multi_lines.txt

hello word

hello python

hello linux

第八章 Shell variable


变量定义和查看

变量用于保存字符串值,便于后续引用,变量值存储在当前会话内存中。

变量名只能包含:

  • 字母

  • 数字

  • 下划线

==注意:== 变量名不能以数字开头。

shell中变量的类型,一般不需要明确指明。

变量定义

[zqm@haojing lab]$ var1=key1

标准格式如下

[zqm@haojing lab]$ declare var1=key1

使用$引用变量值

[zqm@haojing lab]$ echo $var1

key1

[zqm@haojing lab]$ first_name=facai

[zqm@haojing lab]$ last_name=zhang

[zqm@haojing lab]$ echo $last_name $first_name

zhang facai

使用多个空格,效果一样

[zqm@haojing lab]$ echo $last_name $first_name

zhang facai

使用引号保留多个空格(两个更美观)

[zqm@haojing lab]$ echo "$first_name $last_name"

zhang facai

[zqm@haojing lab]$ echo $last_name_$first_name //字母数字下划线为变量名,所以把他们当成了一个整体,需要用{}限定变量范围

facai

# 使用{}限定变量范围

[zqm@haojing lab]$ echo ${last_name}_$first_name

zhang_facai

变量保存在内存中,重启之后则消失如果需要保留,则将变量保存到配置文件当中

变量范围

  • 局部变量,只在当前shell中生效。

  • 全局变量,在当前shell以及shell子程序都生效。

  • [zqm@haojing lab]$ username=xuran
    [zqm@haojing lab]$ echo $username
    xuran
    [zqm@haojing lab]$ bash
    [zqm@haojing lab]$ echo $username

    [zqm@haojing lab]$ exit
    exit
    [zqm@haojing lab]$ export username //扩大变量范围,到子程序中
    [zqm@haojing lab]$ bash
    [zqm@haojing lab]$ echo $username
    xuran

    [zqm@haojing lab]$ export username=tom
    # 或者
    [zqm@haojing lab]$ username=tom;export username
    [zqm@haojing lab]$ echo $username
    [zqm@haojing lab]$ bash
    [zqm@haojing lab]$ echo $username
    tom

shell环境变量

根据变量是否是用户定义:

  • shell 环境变量:设置shell的运行环境。

  • 用户自定义变量:字面意思,用户自己定义的变量,也就是普通变量。

部分shell环境变量如下:

环境变量名

作用

EDITOR

默认编辑器

HISTFILE

历史文件位置

HISTFILESIZE

历史命令个数

PS1

命令行提示符

LANG

shell环境语言

PATH

命令搜素路径

HOME

当前用户家目录

USER

当前用户

PWD

当前shell路径

PS1 默认:\s-\v$ PS2 默认: >

\h 主机名,第一个 `.' 之前的部分 \H 主机名 \n 新行符 \t 当前时间,采用 24小时制的 HH:MM:SS 格式 \T 当前时间,采用 12小时制的 HH:MM:SS 格式 \@ 当前时间,采用 12小时制上午/下午 (am/pm) 格式 \A 当前时间,采用 24小时制上午/下午格式 \u 当前用户的用户名 the username of the current user \w 当前工作目录 \W 当前工作目录的基本部分 $ 如果有效 UID 是 0,就是 #, 其他情况下是 $

[zqm@haojing ~]$ echo $PS1

[\u@\h \W]\$

[zqm@haojing ~]$ PS1='[\u@\h \w \t]\$ '

[zqm@haojing ~ 20:37:18]$

[zqm@haojing ~ 20:39:03]$ bash

[zqm@haojing ~]$ export EDITOR=vim

[zqm@haojing ~]$ crontab -e

* * * * * * * * * //变颜色

[zqm@haojing ~]$ LANG=zh_CN.utf-8

[zqm@haojing ~]$ date

2023年 03月 23日 星期四 20:43:24 CST

[zqm@haojing ~]$ ls

dhcpd.conf home mytmp passwd.stdout profile.sh

etc lab passwd passwd.stout

[zqm@haojing ~]$ find /etc -name passwd

find: ‘/etc/grub.d’: 权限不够

find: ‘/etc/pki/CA/private’: 权限不够

find: ‘/etc/pki/rsyslog’: 权限不够

/etc/pam.d/passwd

/etc/passwd

find: ‘/etc/selinux/targeted/active’: 权限不够

find: ‘/etc/selinux/final’: 权限不够

find: ‘/etc/dhcp’: 权限不够

find: ‘/etc/lvm/archive’: 权限不够

find: ‘/etc/lvm/backup’: 权限不够

find: ‘/etc/lvm/cache’: 权限不够

[root@haojing ~]# which ls

alias ls='ls --color=auto'

/usr/bin/ls

[root@haojing ~]# echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

[root@haojing ~]# mv /usr/bin/ls .

[root@haojing ~]# ls

bash: ls: command not found...

Similar command is: 'lz'

[root@haojing ~]# mkdir bin

[root@haojing ~]# mv ls bin

[root@haojing ~]# which ls

alias ls='ls --color=auto'

/root/bin/ls

[root@haojing ~]# ls

anaconda-ks.cfg bin initial-setup-ks.cfg

[root@haojing ~]#

变量持久化保存

  • login shell 启动的时候,会加载一下配置文件中配置

  • /etc/profie,限定所有用户

  • ~/.bash_profile,只限定特定用户

  • ~/.bashrc,只限定特定用户

  • /etc/bashrc,限定所有用户

  • nologin shell启动的时候,会按以下顺序加载配置文件中配置

  • ~/.bashrc,只限定特定用户

  • /etc/bashrc,限定所有用户

[zqm@haojing ~]$ vim .bashrc

[zqm@haojing ~]$ bash //此处的bash相当于下面一条命令

hello word

[zqm@haojing ~]$ source .bashrc

hello word

[zqm@haojing ~]$ cat .bashrc

echo hello word

Source global definitions

if [ -f /etc/bashrc ]; then

. /etc/bashrc

fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:

# export SYSTEMD_PAGER=

# User specific aliases and functions

[zqm@haojing ~]$ . .bashrc //.相当关于source

hello word

bash还会读取 /etc/profile ~/.bash profile ~/.bash login ~/.profile

用vi修改文件,保存文件时,提示没有修改该文件的权限“E45: ‘readonly’ option is set (add ! to override)”的解决方法:

1.按Esc键

2.输入 :set noreadonly

3.然后就能正常保存了,你可以输入 :wq 来保存文件了。

[zqm@haojing ~]$ vim .bashrc

[zqm@haojing ~]$ vim .profile

[zqm@haojing ~]$ vim .bashrc_profile

[zqm@haojing ~]$ vim .bash_profile

[zqm@haojing ~]$ bash

.bashrc

[zqm@haojing ~]$ exit

exit

[zqm@haojing ~]$ su - zqm

Password:

Last login: Thu Mar 23 21:30:19 CST 2023 from 10.1.8.1 on pts/1

.bash_profile

.bashrc

常见 LANG代码:

  • 英语:en_US.utf8

  • 简体中文:zh_CN.utf8

  • 繁体中文:zh_TW.utf8

命令替换

格式如下:

  • $(COMMAND)

  • `COMMAND`

[zqm@haojing ~]$ echo Today is Tuesday.

Today is Tuesday.

[zqm@haojing ~]$ echo Today is $(date +%A).

Today is Thursday.

[zqm@haojing ~]$ echo Welcome $USER to L //$后面必须大写

Welcome zqm to L

[zqm@haojing ~]$ echo Welcome $user to L

Welcome to L

保留字符字面含义

许多字符在bash中有特殊的意义,忽略这些含义,使用引号和转义字符。

  • \,取消后面单个字符的特殊含义。

  • 双引号(""),压缩shell扩展含义,不压缩命令替换、变量替换和转义字符。

  • 单引号(''),可以压缩单引号内部的所有字符含义。

  • [zqm@haojing ~]$ echo $PATH
    /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/zqm/.local/bin:/home/zqm/bin
    [zqm@haojing ~]$ echo \PATH
    PATH
    [zqm@haojing ~]$ echo \$PATH
    $PATH
    [zqm@haojing ~]$ echo *** Welcome to $user to L ***
    dhcpd.conf etc file-20230323 home lab mytmp passwd passwd.stdout passwd.stout profile.sh Welcome to to L dhcpd.conf etc file-20230323 home lab mytmp passwd passwd.stdout passwd.stout profile.sh
    [zqm@haojing ~]$ echo " *** Welcome to $user to L ***" //双引号可以压缩扩展字符,不压缩命令替换、变量替换和转义字符。
    *** Welcome to to L ***
    [zqm@haojing ~]$ echo " *** Welcome to $user to $(hostname) ***"
    *** Welcome to to haojing.com ***
    [zqm@haojing ~]$ echo ' *** Welcome to $user to $(hostname) ***' //单引号保持原样输出
    *** Welcome to $user to $(hostname) ***

思考:

# 下面命令的输出

[laoma@haojing ~]$ echo \\\

# 最终输出一个 \ 符号

[zqm@haojing ~]$ echo \\

\

[zqm@haojing ~]$ echo \\\\

\\

[zqm@haojing ~]$ echo '\\\'

\\\

# 下面命令的输出

[laoma@haojing ~]$ echo 'Let\'s go'

> '

Let\s go

[zqm@haojing ~]$ echo Let's go.

> '

Lets go.

[zqm@haojing ~]$ echo Let\'s go.

Let's go.

# 使用 echo 一次性在文件中输入多行字符串

[laoma@haojing ~]$ echo "hello 1

hello 2

hello 3"> hello.txt

[laoma@haojing ~]$ cat hello.txt

hello 1

hello 2

hello 3

9. Linux 用户和组管理


用户和组概念

在内部,系统通过分配给它们的唯一标识号,用户ID或UID来区分用户帐户。

用户帐户主要有三种类型:

  • superuser:用于管理系统,用户名称为root,UID为0,对系统具有完全访问权限。

  • system users:系统具有系统用户帐户,由提供支持服务的进程使用。 这些进程或守护进程通常不需要以超级用户身份运行。 它们是非特权帐户,用户保护自己文件和其他资源。系统用户帐户不用于交互方式登录系统。

  • regular users:大多数用户拥有常规用户帐户,用于日常工作。

用户账户

/etc/passwd 文件保存操作系统登录用户信息。每行包含一个登录用户信息,以冒号分隔七个域。

  • name:用户登录名

  • password:用户密码,以x表示

  • UID:用户ID

  • GID:用户主组ID

  • GECOS:用户描述信息,通常为用户的真实姓名

  • directory:用户主目录,启动shell时的工作目录,默认位于/home/username

  • shell:用户打开终端时运行的程序,默认是/bin/bash。

对于system user,它的shell是/sbin/nologin。

组账户

组是用户的集合,组中用户集成组权限。与用户一样,组具有组名称以使其更易于使用。系统通过分配给它们的唯一标识号,组ID或GID来区分组。

/etc/group 文件保存操作系统组信息。每行包含一个组信息,以冒号分隔4个域。

  • group_name:组名称

  • password:组密码,用x表示

  • GID:组ID,唯一表示组

  • user_list:作为补充的成员

组的类型:

  • 主要组每个用户只有一个主要组,/etc/passwd文件中的GID编号定义。 默认情况下,用户创建的新文件组所有者为用户的主要组。通常,在创建新的常规用户时,会创建一个与该用户同名的新组。该组用作新用户的主要组,该用户是此用户专用组的唯一成员,有助于简化文件权限管理。

  • 补充组用户还可以拥有补充组。 补充组的成员资格由/etc/group文件确定。 根据用户的任何组是否具有访问权限,授予用户访问权限的权限。例如,如果用户user01具有主要组user01和补充组wheel和webadmin,则该用户可以读取这三个组中任何一个组可读的文件。

whoami 命令

查看当前终端中登录的用户。

[zqm@haojing ~]$ whoami

zqm

who 和 w 命令

查看当前系统中所有终端上登录的用户,以及用户登录的时间。

[zqm@haojing ~]$ tty

/dev/pts/1

[zqm@haojing ~]$ who

zqm :0 2023-03-23 06:43 (:0)

zqm pts/0 2023-03-23 20:42 (10.1.8.1)

zqm pts/1 2023-03-23 23:07 (10.1.8.1)

root pts/2 2023-03-23 21:43 (10.1.8.1)

users 命令

查看当前系统中所有终端上登录的用户名。

[zqm@haojing ~]$ users

root zqm zqm zqm

useradd 命令

作用:创建用户

# 用户1

[root@haojing ~]# useradd user01

[root@haojing ~]# grep user01 /etc/passwd

user01:x:1003:1003::/home/user01:/bin/bash

[root@haojing ~]# useradd user01

[root@haojing ~]# grep user01 /etc/passwd

user01:x:1001:1001::/home/user01:/bin/bash

[root@haojing ~]# ls /home

user01 zqm

[user01@haojing ~]$ id user01

uid=1001(user01) gid=1001(user01) groups=1001(user01)

[root@haojing ~]# useradd user02 -d /opt/user02 -u 1012 -c 'hello user 2' -s /bin/tmux -g root -G wheel

[root@haojing ~]# grep user0 /etc/passwd

user01:x:1001:1001::/home/user01:/bin/bash

user02:x:1012:0:hello user 2:/opt/user02:/bin/tmux

[root@haojing ~]# su - user02

su: failed to execute /bin/tmux: No such file or directory

# 用户2

[root@haojing ~]# useradd -u 8888 -d /opt/user02 -c "user for software manager" -g wheel -s /sbin/nolgin user02

useradd: user 'user02' already exists

[root@haojing ~]# grep user02 /etc/passwd

user02:x:1012:0:hello user 2:/opt/user02:/bin/tmux

[root@haojing ~]# ls -d /opt/user02/

/opt/user02/

新用户家目录中的文件来源于/etc/skel/目录。

创建用户的时候,用户属性默认参数配置在/etc/login.defs文件。

usermod 命令

作用:修改用户属性。

[root@haojing ~]# usermod user02 -u 1008 -md /home/user02 -s /bin/bash

[root@haojing ~]# grep user02 /etc/passwd

user02:x:1008:0:hello user 2:/home/user02:/bin/bash

[root@haojing ~]# ls -d /home/user02/

/home/user02/

[root@haojing ~]# su - user02

Last login: Thu Mar 23 23:42:22 CST 2023 on pts/0

[user02@haojing ~]$

# 添加补充组,如果没有-a选项,则代表将补充组设置为user01,原先的补充组就被覆盖了。

[root@haojing ~]# usermod -aG user01 user02

[root@haojing ~]# id user02

uid=1008(user02) gid=0(root) groups=0(root),10(wheel),1001(user01)

userdel 命令

# 正常删除

[root@haojing ~]# useradd user03

[root@haojing ~]# id user03

uid=1009(user03) gid=1009(user03) groups=1009(user03)

[root@haojing ~]# userdel -r user03

[root@haojing ~]# id user03

id: user03: no such user

# 强制删除

[root@haojing ~]# userdel -fr user02

本地组管理

groupadd 命令

[root@haojing ~]# groupadd binstall

[root@haojing ~]# groupadd oinstall

[root@haojing ~]# groupadd dba

[root@haojing ~]# groupadd oper

[root@haojing ~]# groupadd oper /etc/group // 验证

binstall:x:1002:

oinstall:x:1003:

dba:x:1004:

oper:x:1005:

[root@haojing ~]# cat /etc/group |tail -3

oinstall:x:1003:

dba:x:1004:

oper:x:1005:

groupadd后为组名,-g后面为组id

[root@haojing ~]# useradd -g oinstall -G dba,oper oracle

[root@haojing ~]# cat /etc/group |tail -3

oinstall:x:1003:

dba:x:1004:oracle

oper:x:1005:oracle

groupmod 命令

# 修改组名称

groupmod --new-name admins admin

# 修改组id

groupmod -g 2002 admins

# 验证

grep '^admin' /etc/group

[root@haojing ~]# groupmod dba --new-name dbas

[root@haojing ~]# id oracle

uid=1009(oracle) gid=1003(oinstall) groups=1003(oinstall),1005(oper),1004(dbas)

groupdel 命令

groupdel sysadmin

grep sysadmin /etc/group

groupmem 命令

[root@haojing ~]# groupmems --help

用法:groupmems [选项] [动作]

选项:

-g, --group groupname 更改组 groupname,而不是用户的组(只 root)

-R, --root CHROOT_DIR chroot 到的目录

动作:

-a, --add username 将用户 username 添加到组成员中

-d, --delete username 从组的成员中删除用户 username

-h, --help 显示此帮助信息并推出

-p, --purge 从组中移除所有成员

-l, --list 列出组中的所有成员

# 添加成员

[root@haojing ~]# groupmems -g root -a oracle

[root@haojing ~]# id oracle

uid=1009(oracle) gid=1003(oinstall) groups=1003(oinstall),0(root),1005(oper),1004(dbas)

# 删除成员

groupmems -g admins -d zqm

groupmems -g admins -l

管理用户密码

密码配置文件

/etc/shadow文件保存操作系统登录用户密码信息。

每行包含一个登录用户信息,以冒号分隔九个域。

[root@haojing ~]# grep zqm /etc/shadow

zqm:$6$PnJAyhn6$a4RbXub5N1LSu9T4wEnxadGkLUCpn6lMA.FmvJhKjmsaUl3v867bHY332kycOREfPgA4Wsb3G/UaI0vQ2BM.b0:19425:0:99999:7:::

解释如下:

  • login name:用户登录名。

  • encrypted password:加密的密码。

  • date of last password change:上一次密码更改日期,以距离1970-1-1过去的天数表示。设置为0,强制用户下次登录时更改密码。

  • minimum password age:最小密码生命周期。设置为0,密码可以随时更改。

  • maximum password age:最大密码生命周期。

  • password warning period:密码过期前,提前多少天告警。设置为0,不提示过期。

  • password inactivity period:密码过期后,非活跃天数,在期间密码仍可以使用。

  • account expiration date:账户过期时间,以距离1970-1-1过去的天数表示。

  • reserved field:保留域。

  • [root@haojing ~]# useradd laowang -p '$6$PnJAyhn6$a4RbXub5N1LSu9T4wEnxadGkLUCpn6lMA.FmvJhKjmsaUl3v867bHY332kycOREfPgA4Wsb3G/UaI0vQ2BM.b0:19425'
    [root@haojing ~]# ssh laowang@localhost
    The authenticity of host 'localhost (::1)' can't be established.
    ECDSA key fingerprint is SHA256:+n9JaGYu2GNaO0R1W58ftIyXH1HwXqU/mBeJDpr/+/k.
    ECDSA key fingerprint is MD5:64:c9:a4:ad:bd:22:5a:c0:2c:d6:85:52:26:e5:89:a6.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
    laowang@localhost's password:

课后作业


第七章课后作业


  1. 在当前目录下创建三个文件:file-1 file-2 file-3

[zqm@haojing lab]$ > file-1

[zqm@haojing lab]$ > file-2

[zqm@haojing lab]$ > file-3

[zqm@haojing lab]$ ls

ext4.man file-2 filer2 passwd1 passwd.all

file1 file3 multi_lines.txt passwd2 passwd.list

file-1 file-3 multi.lines.txt passwd3 passwd.stderr

  1. 你对谈谈你对输出重定向的理解,用示例说明

输出重定向是一种将程序的输出从 stdout 或 stderr 文件描述符(默认显示在终端屏幕上)重定向到指定文件或文件描述符的方法。这样做的目的是将程序的输出保存到文件或发送到其他程序或设备中。输出重定向符号 > 和 >> 分别表示覆盖写和追加写,其中 1 表示 stdout,2 表示 stderr。

将一个命令的输出保存到一个文本文件中:

ls / > file.txt

这个命令将列出根目录下的所有文件和目录,并将其输出重定向到名为 file.txt 的文件中。如果该文件不存在,则创建它,并将输出写入其中。如果该文件已存在,则覆盖原有的内容。

另外一个示例,假设我们想将一个长时间运行的程序的输出保存到日志文件中。可以使用以下命令:

./long_running_program > log.txt 2>&1

在这个命令中,我们将程序的 stdout 输出重定向到 log.txt 文件,而 stderr 输出重定向到 stdout。这样,所有的输出都被捕获到同一个文件中,便于查看和分析。

  1. 谈谈你对管道符(|)的理解,用示例说明

管道符(|)是一种用于连接进程的符号。它将一个进程的输出传输到另一个进程的输入。也就是说,管道符允许我们将多个命令串联在一起,形成一个管道链。

列出某个目录下的所有文件,并按照文件大小排序:

ls -l | sort -n -k 5

这个命令中,ls -l 列出了当前目录下的所有文件,并将输出传递给 sort -n -k 5 ,这个命令会按照文件大小(第 5 列)进行排序。通过使用管道符,我们可以将这两个命令拼接在一起,达到我们想要的效果。

[zqm@haojing lab]$ man -k ext4 | grep fsck | grep fsck.ext4 //可以进一步过滤

fsck.ext4 (8) - check a Linux ext2/ext3/ext4 fil...

[zqm@haojing lab]$ ip a |grep 10.1.8

inet 10.1.8.88/24 brd 10.1.8.255 scope global noprefixroute ens32

管道符的作用是将多个命令串联在一起,实现更复杂的操作。

  1. 谈谈你对tee命令的理解,用示例说明

Tee用于在终端上输出信息,并将其保存到文件中。Tee命令的名字来源于T形管道符(|),因为它的作用就像一个T形管道。

Tee命令可以将终端上的标准输出输出到一个或多个文件中,并将其同时输出到屏幕上。它的语法格式为:

tee [options] [file …]

  1. 将命令的输出保存到文件中:

ls -l | tee file.txt

上述命令将列出当前目录下的文件列表,并将该列表保存到file.txt文件中。

  1. 将命令的输出保存到多个文件中:

ls -l | tee file1.txt file2.txt

上述命令将列出当前目录下的文件列表,并将该列表保存到file1.txt和file2.txt文件中。

  1. 追加输出到文件:

ls -l | tee -a file1.txt

上述命令将列出当前目录下的文件列表,并将该列表追加到file1.txt文件的末尾。

  1. 谈谈你对标准输入重定向的理解,用示例说明

标准输入重定向是可以将标准输入从键盘等默认位置重定向到一个文件或者其他设备中,从而实现读取文本输入数据的方式的改变。可以使用特定的符号“<”来表示标准输入重定向,其语法格式如下:

command < input.txt

其中,command表示要执行的命令,input.txt表示输入文本数据的文件名称,通过将这两者连接起来来实现标准输入重定向。具体来说,当执行该命令时,系统将会从input.txt文件中读取文本数据,然后传递给command命令进行处理。

使用cat命令来实现查看文件内容的操作,我们需要在命令行中手动输入文件名来指定要查看的文件,比如:

cat test.txt

test.txt是要查看的文件的名称。想要从一个文件中读取数据,以便cat命令可以在不需要手动输入的情况下查看这些数据,就可以使用标准输入重定向,比如:

cat < input.txt

input.txt是包含要查看的文本数据的文件,系统将从该文件中读取数据,并将其传递给cat命令进行处理。通过这种方式,我们可以更加方便地处理大量的输入文本数据。

第八章Shell variable


  1. 变量名规范

变量名只能包含:

  • 字母

  • 数字

  • 下划线

==注意:== 变量名不能以数字开头。

shell中变量的类型,一般不需要明确指明。

  1. 变量如何定义和查看,举例说明。

变量定义

[zqm@haojing lab]$ var1=key1

标准格式如下

[zqm@haojing lab]$ declare var1=key1

使用$引用变量值

[zqm@haojing lab]$ echo $var1

key1

[zqm@haojing lab]$ first_name=facai

[zqm@haojing lab]$ last_name=zhang

[zqm@haojing lab]$ echo $last_name $first_name

zhang facai

使用多个空格,效果一样

[zqm@haojing lab]$ echo $last_name $first_name

zhang facai

使用引号保留多个空格(两个更美观)

[zqm@haojing lab]$ echo "$first_name $last_name"

zhang facai

[zqm@haojing lab]$ echo $last_name_$first_name //字母数字下划线为变量名,所以把他们当成了一个整体,需要用{}限定变量范围

facai

# 使用{}限定变量范围

[zqm@haojing lab]$ echo ${last_name}_$first_name

zhang_facai

  1. 如何扩展变量范围,举例说明。

[zqm@haojing lab]$ username=xuran

[zqm@haojing lab]$ echo $username

xuran

[zqm@haojing lab]$ bash

[zqm@haojing lab]$ echo $username

[zqm@haojing lab]$ exit

exit

[zqm@haojing lab]$ export username //扩大变量范围,到子程序中

[zqm@haojing lab]$ bash

[zqm@haojing lab]$ echo $username

xuran

  1. 解释以下环境变量作用,举例说明。

  • EDITOR

  • PS1

  • LANG

  • PATH

环境变量名

作用

EDITOR

默认编辑器

PS1

命令行提示符

LANG

shell环境语言

PATH

命令搜素路径

[zqm@haojing ~]$ echo $PS1

[\u@\h \W]\$

[zqm@haojing ~]$ PS1='[\u@\h \w \t]\$ '

[zqm@haojing ~ 20:37:18]$

[zqm@haojing ~ 20:39:03]$ bash

[zqm@haojing ~]$ export EDITOR=vim

[zqm@haojing ~]$ crontab -e

* * * * * * * * * //变颜色

[zqm@haojing ~]$ LANG=zh_CN.utf-8

[zqm@haojing ~]$ date

2023年 03月 23日 星期四 20:43:24 CST

[zqm@haojing ~]$ ls

dhcpd.conf home mytmp passwd.stdout profile.sh

etc lab passwd passwd.stout

[zqm@haojing ~]$ find /etc -name passwd

find: ‘/etc/grub.d’: 权限不够

find: ‘/etc/pki/CA/private’: 权限不够

find: ‘/etc/pki/rsyslog’: 权限不够

/etc/pam.d/passwd

/etc/passwd

find: ‘/etc/selinux/targeted/active’: 权限不够

find: ‘/etc/selinux/final’: 权限不够

find: ‘/etc/dhcp’: 权限不够

find: ‘/etc/lvm/archive’: 权限不够

find: ‘/etc/lvm/backup’: 权限不够

find: ‘/etc/lvm/cache’: 权限不够

[root@haojing ~]# which ls

alias ls='ls --color=auto'

/usr/bin/ls

[root@haojing ~]# echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

[root@haojing ~]# mv /usr/bin/ls .

[root@haojing ~]# ls

bash: ls: command not found...

Similar command is: 'lz'

[root@haojing ~]# mkdir bin

[root@haojing ~]# mv ls bin

[root@haojing ~]# which ls

alias ls='ls --color=auto'

/root/bin/ls

[root@haojing ~]# ls

anaconda-ks.cfg bin initial-setup-ks.cfg

[root@haojing ~]#

  1. 命令替换作用,举例说明。

格式如下:

  • $(COMMAND)

  • `COMMAND`

[zqm@haojing ~]$ echo Today is Tuesday.

Today is Tuesday.

[zqm@haojing ~]$ echo Today is $(date +%A).

Today is Thursday.

[zqm@haojing ~]$ echo Welcome $USER to L

Welcome zqm to L

[zqm@haojing ~]$ echo Welcome $user to L

Welcome to L

  1. 解释以下符号作用,举例说明。

  • 转义符号(\)

  • 双引号("")

  • 单引号('')

  • \,取消后面单个字符的特殊含义。

  • 双引号(""),压缩shell扩展含义,不压缩命令替换、变量替换和转义字符。

  • 单引号(''),可以压缩单引号内部的所有字符含义。

[zqm@haojing ~]$ echo $PATH

/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/zqm/.local/bin:/home/zqm/bin

[zqm@haojing ~]$ echo \PATH

PATH

[zqm@haojing ~]$ echo \$PATH

$PATH

[zqm@haojing ~]$ echo *** Welcome to $user to L ***

dhcpd.conf etc file-20230323 home lab mytmp passwd passwd.stdout passwd.stout profile.sh Welcome to to L dhcpd.conf etc file-20230323 home lab mytmp passwd passwd.stdout passwd.stout profile.sh

[zqm@haojing ~]$ echo " *** Welcome to $user to L ***" //双引号可以压缩扩展字符,不压缩命令替换、变量替换和转义字符。

*** Welcome to to L ***

[zqm@haojing ~]$ echo " *** Welcome to $user to $(hostname) ***"

*** Welcome to to haojing.com ***

[zqm@haojing ~]$ echo ' *** Welcome to $user to $(hostname) ***' //单引号保持原样输出

*** Welcome to $user to $(hostname) ***

第9章


  1. 哪一项表示在最基本的层面上标识用户的编号?a. 主要用户b. UIDc. GIDd. 用户名

  1. 哪一项表示提供用户命令行提示符的程序?a. 主 shellb. 主目录c. 登录 shelld. 命令名称

  1. 哪一项目或文件表示本地组信息的位置?a. 主目录b. /etc/passwdc. /etc/GIDd. /etc/group

  1. 哪一项目或文件表示用户个人文件的位置?a. 主目录b. 登录 shellc. /etc/passwdd. /etc/group

  1. 哪一项表示在最基本的层面上标识组的编号?a. 主要组b. UIDc. GIDd. groupid

  1. 哪一项目或文件表示本地用户帐户信息的位置?a. 主目录b. /etc/passwdc. /etc/UIDd. /etc/group

  1. /etc/passwd 文件的第四个字段是什么?a. 主目录b. UIDc. 登录 shelld. 主要组

  1. 创建 operator1 用户

  1. 使用id验证 operator1 用户信息

[root@haojing ~]# useradd operator1

[root@haojing ~]# id operator1

uid=1010(operator1) gid=1010(operator1) groups=1010(operator1)

  1. 查看/etc/passwd中对应条目

[root@haojing ~]# grep operator1 /etc/passwd

operator1:x:1010:1010::/home/operator1:/bin/bash

  1. 添加用户laowang,设置密码与laoma用户一致。(不允许使用passwd命令)

[root@haojing ~]# grep zqm /etc/shadow

zqm:$6$PnJAyhn6$a4RbXub5N1LSu9T4wEnxadGkLUCpn6lMA.FmvJhKjmsaUl3v867bHY332kycOREfPgA4Wsb3G/UaI0vQ2BM.b0:19425:0:99999:7:::

[root@haojing ~]# useradd laowang -p '$6$PnJAyhn6$a4RbXub5N1LSu9T4wEnxadGkLUCpn6lMA.FmvJhKjmsaUl3v867bHY332kycOREfPgA4Wsb3G/UaI0vQ2BM.b0:19425'

  1. 设置laowang密码:

  • 首次登录必须修改密码

  • 3天内不允许修改

  • 100天后过期

chage -m 100 laowang

  1. 禁止laowang登录系统,至少使用2种方法。

passwd -l laowang

touch /etc/nologin

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/211952
推荐阅读
相关标签
  

闽ICP备14008679号