说明:以下内容为个人学习Linux与Shell的笔记整理,现整理成文章分享给大家,希望能够给各位读者带来帮助。内容上若有不完善的地方,欢迎读者留言指出,笔者会尽快勘正,谢谢!
linux
linux基础与常用命令
- Linux 目录结构
目录名 | 目录的作用 |
---|---|
/bin/ | 存放系统命令的目录,普通用户和超级用户都可以执行 |
/sbin/ | 存放系统命令的目录,只有超级用户才可以执行 |
/sbin/ | 存放系统命令的目录,只有超级用户才可以执行 |
/boot/ | 系统启动目录,保存了与系统启动相关的文件 |
/dev/ | 设备文件保存位置 |
/etc/ | 配置文件保存位置。/etc/shells 保存了本机支持的shell |
/mnt/ | 挂载目录 |
/proc/ | 虚拟文件系统,该目录中的数据并不保存在硬盘上,而是保存到内存中。主要保存系统的内核,进程,外部设备状态和网络状态等 |
- stat 查看文件详细信息如:大小,块,权限,访问时间,修改时间,创建时间等
-
more 命令打开一个用来查看文件内容的交互界面,可以识别一些交互指令。
- 空格键:向下翻页
- b:向上翻页
- 回车键:向下滚动一行
- /字符串:搜索指定的字符串
- q:退出。
-
less 相较于more命令可以向上游览文件也可以向上搜索,查看之前不会加载全文。
- -N :显示行号
- -e :文件显示结束后,自动离开
- -s :显示连续空行为一行
- -m :显示百分比
-
head :显示文件开头的命令
- -n 行数:从文件头开始,显示指定的行数
-
tail :显示文件结尾的命令
- -n 行数:从文件尾开始,显示指定的行数
- -f :显示文件新增的内容
-
ln命令:在文件之间建立链接
- -s : 建立软链接文件,若不指定则建立硬链接文件。
- -f : 强制。如果目标文件已经存在,则删除文件再重新建立链接文件。
- 软链接类似于快捷方式,硬链接是同一个文件的另一个名称。
-
系统命令查找命令
- whereis命令:在查找二进制命令的同时,查找帮助文档的位置
- which命令 : 在查找二进制命令的同时,如果这个命令有别名,还可以找到别名命令。
-
locate命令:按照文件名搜索普通文件的命令。
- 优点:按照数据库搜索,搜索速度快,消耗资源小
- 缺点:只能按照文件名来搜索文件,而不能执行更复杂的搜索
-
locate [选项] 匹配符
* -i 忽略大小写 * -c 不输出文件名,仅计算找到的文件数量 * -r 使用正则表达式
-
find:在系统中搜索符合添加的文件名,用法:find 目录 选项 [-exec/-ok] command {} ;
- -exec execute执行,直接执行后面的command,不用询问是否执行
- -ok 执行后面的command会询问Y/N
- {} 表示要执行的命令的参数即为找到的文件,命令末尾必须以 ; 结尾分号不能少
- -name 按照文件名称查找
- -perm 按照权限查找:-perm 755
- -prune 使用此选项可以使find命令不在当前指定的目录中查找】
-
-type 查找某一类型的文件
1. type的选项 2. b 块设备文件 3. d 目录 4. c 字符设备文件 5. f 普通文件 6. p 管道文件 7. l 符号链接文件
- -amin n 查找系统中最后n分钟访问的文件
- -atime n 查找系统中最后n个24小时{即n天前}访问的文件
- -cmin n 查找系统中最后n分钟被改变文件状态的文件
- -ctime n 查找系统中最后n个24小时{即n天前}被改变文件状态的文件
- -mmin n 查找系统中最后n分钟被改变文件数据的文件
- -mtime n 查找系统中最后n个24小时{即n天前}被改变文件数据的文件
-
zip与unzip压缩解压缩zip格式文件。
-
zip [选项] 压缩包名 源文件或源目录
* -r :压缩目录
-
unzip [选项] 压缩包名
* -d :指定解压缩位置
-
-
gzip和gunzip压缩解压缩gz格式文件
-
gzip [选项] 源文件。压缩但不打包文件。
* -c 将压缩数据输出到标准输出中,可以用于保留源文件 * -d 解压缩 * -r 压缩目录
- gunzip 解压缩文件或目录 gzip -d 或者 gunzip
-
bzip2和bunzip2压缩解压缩bz2格式文件
-
bzip [选项] 源文件:压缩率比zip格式更高。
- -d 解压缩
- -k 压缩时,保留源文件
- -v 显示压缩的详细信息
- bunzip2 解压缩文件或目录 bunzip2 -d 或者 bunzip
-
-
tar打包解包tar格式文件
-
tar 打包不压缩内容 tar [选项] [-f 压缩包名] 源文件或目录
* -c :打包 * -f :指定压缩包的文件名 * -v :显示打包文件过程
-
tar 解打包命令 tar [选项] 压缩包
* -x :解打包 * -f :指定解包的文件名 * -v :显示解包文件过程 * -t :不解包,只查看包中有哪些文件
-
tar直接打包压缩解压缩 .tar.gz 和 .tar.bz2格式文件 tar [选项] 压缩包 源文件或目录
1. -z :支持压缩和解压缩 .tar.gz 格式文件 2. -j :支持压缩和解压缩 .tar.bz2 格式文件
-
-
配置IP地址
- 使用setup工具
- 手工编辑配置文件 /etc/sysconfig/network-scripts/ifcfg-eth0
修改以后重载网络服务配置 service network restart
- ifconfig命令查看IP地址的信息。
-
netstat命令查看网络状态,既可以看到本机开启的端口,也可以看到有哪些客户端在进行连接。netstat [选项]
- -a :列出所有网络状态,包括socket程序
- -c :秒数:指定每隔几秒刷一次网络状态
- -t :显示使用TCP协议端口的连接状况。
- -u :显示使用UDP协议端口的连接状况。
- -l :仅显示处于监听状态的连接。
- -r :显示路由表。
- -p :显示PID和程序名。
- -n :使用IP和端口显示,不使用域名与服务名。
- wall命令:给所有登陆用户发送消息,包括自己。
- w命令:显示系统中正在登陆的用户的信息,并可以看到用户正在进行的操作。该命令查看的痕迹日志是/var/run/utmp。
- last命令:查看系统所有登陆过的用户的信息。包括正在登陆的用户和之前登陆的用户。该命令查看的痕迹日志是/var/log/wtmp。
- lastlog命令:查看系统中所有用户的最后一次登陆时间。该命令查看的痕迹日志是/var/log/lastlog。
- lastb命令:查看错误登陆的信息。该命令查看的痕迹日志是/var/log/btmp。
shell
shell基本命令
-
echo:
- -n:取消输出后行末的换行符号
-
-e:支持反斜线控制的字符转换
- echo -e "a":输出警告声
- echo -e "e[1;31m abcd e[0m":输出带颜色的信息
-
bash执行方法:
- 给bash文件添加执行权限,然后通过绝对路径来执行
- 给bash文件添加执行权限,然后通过相对路径来执行
- 通过 bash命令来执行bash文件
-
history:历史命令
- -c:清空历史命令
- -w:把系统缓存中的历史命令写入文件中,默认的历史命令保存文件:~/.bash_history中。(在用户注销时,系统会默认将历史命令写入文件中)
- /etc/profile里设置了历史文件命令保存的条数
-
历史命令调用:
- !n 重复第n条历史命令
- !! 重复执行上一条命令
- !字串 重复执行最后一条命令以该字符串为开头的命令
- !$ 重复上一条命令的最后的参数
-
命令别名
- alias 查询命令别名
- alias 别名=‘原命令’
- 别名永久生效:写入~/bashrc
-
命令执行优先级
- 使用绝对路径或相对路径
- 别名
- Bash的内部命令
- $PATH环境变量定义的目录去查找
- source:使shell读入指定的Shell程序文件并依次执行文件中的所有语句。(.)点命令,只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。
-
Bash常用快捷键
- ctrl+A:光标移动到命令行开头
- ctrl+E:光标移动到命令行结尾
- ctrl+U:删除或剪切光标之前的命令
- ctrl+K:删除或剪切光标之后的命令
- ctrl+Y:粘贴
- ctrl+R:在历史命令中搜索
-
重定向
- > 正确输出
- >>正确输出追加
- 2> 错误输出
- 2>> 错误输出追加
- < 输入重定向
- << 输入重定向,指定一个分界符号
9.多命令执行符号
多命令执行符号 | 格式 | 作用 |
---|---|---|
: | 命令1:命令2 | 多个命令顺序执行,命令之间没有任何逻辑联系 |
&& | 命令1 && 命令2 | 当命令1正确执行,命令2才会执行,当命令1不正确执行,则命令2不会执行 |
ll | 命令1 ll 命令2 | 当命令1正确执行,命令2不会执行,当命令1不正确执行,则命令2才会执行 |
-
wc统计文本行数 字数 字符数
- -c显示字符的个数
- -w显示单词的个数
- -l显示文件文本的行数
-
grep:grep [选项] "搜索内容" 文件名
- -A 数字:列出符合条件的行,并列出后续的n行
- -B 数字:列出符合条件的行,并列出前面的n行
- -C 数字:列出符合添加的行,并列出前面后续的n行
- -c :统计找到符合条件的字符串的次数
- -i :忽略大小写
- -n :输出行号
- -v :反向查找
- --color=auto 搜索出的关键字用颜色显示
-
find:在系统中搜索符合添加的文件名,用法:find 目录 选项 [-exec/-ok] command {} ;
- -exec execute执行,直接执行后面的command,不用询问是否执行
- -ok 执行后面的command会询问Y/N
- {} 表示要执行的命令的参数即为找到的文件,命令末尾必须以 ; 结尾分号不能少
- -name 按照文件名称查找
- -perm 按照权限查找:-perm 755
- -prune 使用此选项可以使find命令不在当前指定的目录中查找】
-
-type 查找某一类型的文件
1. type的选项 2. b 块设备文件 3. d 目录 4. c 字符设备文件 5. f 普通文件 6. p 管道文件 7. l 符号链接文件
- -amin n 查找系统中最后n分钟访问的文件
- -atime n 查找系统中最后n个24小时{即n天前}访问的文件
- -cmin n 查找系统中最后n分钟被改变文件状态的文件
- -ctime n 查找系统中最后n个24小时{即n天前}被改变文件状态的文件
- -mmin n 查找系统中最后n分钟被改变文件数据的文件
- -mtime n 查找系统中最后n个24小时{即n天前}被改变文件数据的文件
- Bash中的特殊符号
符号 | 作用 |
---|---|
‘’ | 单引号,在单引号中的所有特殊符号都没有特殊含义,例如$ |
"" | 双引号,在双引号中,$,`,\具有特殊功能 |
${} | 和双引号一样 |
`` | 反引号,反引号括起来的是系统命令,在Bash中会先执行它 |
$() | 和反引号一样 |
$(()) | 括号里的内容要进行数学运算 |
$[] | 括号里的内容要进行数学运算 |
() | 用于执行一系列的shell命令,在子bash中执行 |
{} | 用于执行一系列的shell命令,在该bash中执行 |
[] | 用于变量测试 |
# | #开头的行代表注释 |
$ | 用于调用变量的值 |
\ | 转义符,跟在后的特殊符号将失去特殊含义,变为普通字符 |
- pstree:查看系统进程树
-
Bash的变量和运算符
- Bash中变量的默认类型都是字符串类型,若要进行数值运算,则必须指定变量类型为数值型
- 变量用等号连接值,等号两边不能加空格,若值字符串有空格,用单引号或双引号包括。
- 变量的叠加:test="$demo"1234或test=${demo}1234
-
变量分类
- 用户自定义的变量,只在当前shell中生效
- 环境变量:保存了和系统操作环境相关的数据,便于与命令区分,一般环境变量为大写。可以在子shell中生效
- 位置参数变量:主要用于向脚本当中传递参数或数据
- 预定义便变量:是Bash中已经定义好的变量,变量名不能自定义,作用也是固定的。
-
set:设置当前所使用 shell 的执行方式,同时也可以用来设置或显示 shell 变量的值。set [选项]
- set -u 当执行时使用到未定义过的变量,则显示错误信息
- set -x 在执行命令之前,会先将命令输出一次
- set 查看变量的值,也可以查看用于自定义的命令
- unset 删除变量名,unset -v 删除变量 unset -f 删除函数
-
PS1变量:命令提示符设置
- d 显示日期
- h 显示简写的主机名
- t 显示24小时制时间,格式”HH:MM:SS“
- u 显示当前用户名
- v 显示Bash版本的信息
- # 执行的第几个命令
- w 显示当前所在目录的完整名称
- $ 示符,root显示#,普通用户显示$
- LANG 语系变量,定义了Linux系统的主语系环境。locale 可以查询当前系统支持的语系。
- 位置参数变量
位置参数变量 | 作用 |
---|---|
$n | n为数字,$0代表命令本身,$1-$9代表第一个到第九个参数,十个以上的参数需要用大括号包含,如${10} |
$* | 这个变量代表命令行中所有的参数,$* 把所有的参数看成一个整体 |
$@ | 这个变量也代表命令行中所有的参数,$@把每个参数区分对待 |
$# | 这个变量也代表命令行中所有参数的个数 |
- 预定义变量
预定义变量 | 作用 |
---|---|
$? | 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一次命令正确执行 |
$$ | 当前进程的进程号(PID) |
$! | 后台运行的最后一个进程的进程号 |
-
接收键盘输入 read [选项] [变量名]
- -p "提示信息" :在等待read输入时,输出提升信息
- -t 秒数:read命令一直等待用户输入,使用此选项可以指定等待时间
- -n 字符数:read命令只接受指定的字符数,就会执行
- -s 隐藏输入的数据,适用于机密信息的输入
-
数值运算方法
-
使用declare声明变量类型,**declare +/- 变量名
- -:给变量设定类型属性
- +:取消变量的类型属性
- -a:将变量声明为数组类型
- -i:将变量声明为整数类型
- -r:将变量声明为只读变量。
- -x:将变量声明为环境变量
- -p:显示指定变量的被声明的类型
-
使用expr命令或let命令
- dd=$(expr $aa + $bb) +号两边必须有空格
- dd=let $a+$b
-
$(())或\$[] 括号里的内容要进行数学运算
- dd=$(($aa+$bb))
-
- export 可新增,修改或删除环境变量,供后续执行的程序使用。export 的效力仅限于该次登陆操作。最终还是使用declare -x 实现。
- 变量测试与内容置换
变量置换方式 | 变量y没有设置 | 变量y为空值 | 变量y有值 |
---|---|---|---|
x=${y-新值} | x=新值 | x为空 | x=$y |
x=${y:-新值} | x=新值 | x=新值 | x=$y |
x=${y+新值} | x为空 | x=新值 | x=新值 |
x=${y:+新值} | x为空 | x为空 | x=新值 |
x=${y=新值} | x=新值 y=新值 | x为空,y值不变 | x=$y,y值不变 |
x=${y:=新值} | x=新值 y=新值 | x=新值,y=新值 | x=$y,y值不变 |
x=${y?新值} | 新值输出到标准错误输出 | x为空 | x=$y |
x=${y:?新值} | 新值输出到标准错误输出 | 新值输出到标准错误输出 | x=$y |
-
登录时相关的环境变量配置文件
-
配置文件
- /etc/profile
- /etc/profile.d/*.sh
- ~/.bash_profile
- ~/.bashrc
- /etc/bashrc
-
启动过程
- 正常登录文件顺序加载过程
-
![image](https://user-gold-cdn.xitu.io/2020/5/13/1720dfd95914133f?w=979&h=330&f=png&s=17284)
* 不正常启动(su命令切换用户)
![image](https://user-gold-cdn.xitu.io/2020/5/13/1720dfd95a7b14c7?w=839&h=421&f=png&s=17723)
-
其他配置文件
- 注销时生效的配置文件:用户退出登录时,会调用~/.bash_logout,这个文件默认没有写入任何内容
- Shell登录信息:/etc/issue是Linux系统开机启动时在命令行界面弹出的欢迎语句文件,/etc/issue.net是ssh远程登录时在命令行界面弹出的欢迎语句文件。
-
定义Bash的快捷键
- stty -a 查询所有的快捷键
- stty 关键字 快捷键 更改快捷键
字符串处理
-
grep
- -n 打印行号
- -v 不包括,反向过滤
- -E 使用扩展的正则表达式
- -i 忽略大小写
- -c 统计文中出现的次数
- -A 打印匹配行后N行
- -B 打印匹配行前N行
- -C 打印匹配行前后N行
-
cut 列提取命令 **cut [选项] 文件名
- -f 列号 :提取第几列,可以提供多个列,列号之间用逗号隔开。
- -d 分隔符:按照指定分隔符分割列,默认使用制表符作为分隔符。
- -c 通过字符范围来进行字段提取。“n-”表示提取从第n个字符到行尾,“n-m”:从第n个字符
-
printf 格式化输出 prinf ‘输出类型 输出格式’ 输出内容
-
输出类型
- %ns:输出字符串 n是数字代表输出几个字符
- %ni:输出整数,n是数字代表输出几个数字
- %m.nf:输出浮点数。m和n是数字,代表输出的整数位数和小数位数
-
输出格式
- a:输出警告音
- f:清空屏幕
- n:换行
- r:回车
-
-
awk对输入文件中的每一行都执行这个脚本: awk '条件1{动作1} 条件2{动作2} 条件3{动作3}' 文件名。awk 先读取一行,然后再执行每一个动作条件。
- -F 指定分隔符,可使用正则表达式。分割后的第N个字段存放到$N中。$0代表整行,NF记录了字段数量,NR记录了行数,RS记录了分隔符。
- BEGIN和END模块,在处理输入文件之前会执行BEGIN模块。处理输入文件之后会执行END模块。**awk ‘BEGIN {} {} END{}’
-
正则表达式
- awk ‘/regex/{动作}’用来匹配行。
- awk '$N ~ /regex/ {动作}' 或wk '$N !~ /regex/,用来匹配每一行的字段,判断符合或者不符合正则条件。
- awk条件支持 > < >= <= == !=等运算符。
- if-else 语句
awk ‘$2 > 6{n=n+1;pay=pay+$2+$3} END { if(n>0) print n,"total pay is",pay else print "no employees" }’
- while语句
awk ' { i=1 while(i<=$3){ i=i+1; } } END { print i } '
- for语句
awk ' { for(i=1;i<=$3;i=i+1) printf("\t",i) } '
- awk支持数组,内置函数。
-
sed:用来对数据进行选取,替换,删除和新增的命令,命令格式:sed [选项] ‘[动作]’ 文件名
-
选项
- -n :sed命令会把所有的数据都输出,此选项只会把sed处理的行输出。
- -e :运行执行多个动作,各个动作直接用 ; 分割 sed [选项] -e ‘动作1 ;动作2’
- -i :sed命令对文件的的处理默认重新输出而不会修改文件内容,该选项会将处理后的内容写回文件
-
动作
- a :追加,在指定行后添加一行或多行 sed '1,3a newContent' filePath :在第 1~3行后面各新增内容。
- i :插入,在指定行前添加一行或多行 sed '1,3i newContent' filePath :在第 1~3行前面各新增内容。
- d :删除,删除指定行 sed ‘1,4d’ filePath :删除1~4行的内容。
- p :打印,打印指定的行。
- c :行替换,将指定行替换为指定内容 sed ‘1,4c newContent’ filePath :将1~4行的内容替换为指定内容。
- s :字符串替换,结合正则表达式,将字符串替换成另一个字符串。 sed ‘1,3s/regex/new/g’ :将1~3行中的符合正则表达式的字符串替换为new,g代表1~3行内符合正则表达式的都替换,可将g改为数字n,代表仅替换第k个符合条件的字符串。
-
-
sort 排序命令 **sort [选项] 文件名
- -f :忽略大小写
- -b :忽略每行前的空白部分
- -n :以数值型进行排序,默认使用字符串类型
- -r :反向排序
- -u :删除重复的行
- -t :指定分割符对每一行进行分割,默认使用制表符,
- -k :-k 3,7 配合-t分割后,选择第3~7个字段进行排序。
-
uniq 用来取消重复行,类似于 sort -u uniq [选项] 文件名
- -i 忽略大小写
-
wc 统计命令 wc [选项] 文件名
- -l :只统计行数
- -w :只统计单词数
- -m :只统计字符数
-
条件判断,格式: test 选项 值 或者 [ 选项 值 ]
- 按照文件类型进行判断
| 测试选项 | 作用|
| --- | --- |
| -b 文件 | 判断该文件是否存在,且是否为块设备文件|
| -c 文件 | 判断该文件是否存在,且是否为字符设备文件|
| -d 文件 | 判断该文件是否存在,且是否为目录文件|
| -e 文件 | 判断该文件是否存在,|
| -f 文件 | 判断该文件是否存在,且是否为普通文件|
| -L 文件 | 判断该文件是否存在,且是否为符号链接文件|
| -p 文件 | 判断该文件是否存在,且是否为管道文件|
| -s 文件 | 判断该文件是否存在,且是否为非空|
| -S 文件 | 判断该文件是否存在,且是为套接字文件|
示例:[ -f ip.txt ] && echo ”is file“||echo ”not a file。
2. 按照文件权限进行判断
| 测试选项 | 作用 |
| --- | --- |
| -r 文件 | 判断该文件是否存在,且是否该文件有读权限|
| -w 文件 | 判断该文件是否存在,且是否该文件有写权限|
| -x 文件 | 判断该文件是否存在,且是否该文件有执行权限|
| -u 文件 | 判断该文件是否存在,且是否该文件拥有SUID权限|
| -g 文件 | 判断该文件是否存在,且是否该文件拥有SGID权限|
| -k 文件 | 判断该文件是否存在,且是否该文件拥有SBit权限|
3. 两个文件之间比较
| 测试选项 | 作用|
| --- | --- |
|文件1 -nt 文件2 | 判断该文件1的修改时间是否比文件2的新。|
|文件1 -ot 文件2| 判断该文件1的修改时间是否比文件2的旧。|
|文件1 -ef 文件2| 判断该文件1和文件2的Inode号一致。可以用来判断两个文件是否是同一个文件|
4. 两个整数之间的比较
| 测试选项 | 作用 |
| --- | --- |
|整数1 -eq 整数1 | 判断整数1是否和整数2相等|
|整数1 -ne 整数2| 判断整数1是否和整数2不相等|
|整数1 -gt 整数2| 判断整数1是否大于整数2|
|整数1 -lt 整数2| 判断整数1是否小于整数2|
|整数1 -ge 整数2| 判断整数1是否大于等于整数2|
|整数1 -le 整数2| 判断整数1是否小于等于整数2|
5. 字符串判断
| 测试选项 | 作用|
| --- | --- |
|-z 字符串 | 判断字符串是否为空|
|-n 字符串| 判断字符串是否为非空|
|字符串1 == 字符串2|判断字符串1和字符串2是否相等|
|字符串1 != 字符串2|判断字符串1和字符串2是否不相等|
6. 多重条件判断
| 测试选项 | 作用|示例|
| --- | --- | -- |
|判断1 -a 判断2 | 逻辑与|[-n $"aa" -a $"aa" -gt 23 ]|
|判断1 -o 判断2 | 逻辑或|[-n $"aa" -o $"aa" -gt 23]|
|!判断2 | 逻辑非|[! -n $"aa" ]|
流程控制
-
if 条件判断
- 单分支if条件语句
if [ 条件判断式 ];then 程序 fi if [ 条件判断式 ] then 程序 fi
- 双分支if条件语句
if [ 条件判断式 ] then 条件成立时执行的语句 else 条件不成立时执行的语句 fi
3. 多分支if条件语句
```bash
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi
```
- 多分支case条件语句
case $variable in
"value1")
echo "变量值等于value1"
;;
"value2")
echo "变量值等于value2“
;;
"value3")
echo ”变量值等于value3“
;;
*)
echo "都不符合”
;;
esac
- for循环语法格式
for i in 值1 值2 值3 ···
do
程序
done
for ((初始值;循环控制条件;变量变化))
do
程序
done
- while循环语法格式
while [ 条件表达式 ]
do
程序
done
- until循环:一旦条件成立则终止循环。
until [ 条件判断式 ]
do
程序
done
- 函数
function 函数名 () {
程序
}
-
特殊流程控制语句。
- exit语句。shell脚本里的exit语句是用来退出当前脚本的。 exit [返回值] ,返回值可以通过$?来查询这个返回值。
- break语句:结束当前循环,从整个循环流程中跳出。
- continue语句:结束当前单次循环,继续下一次循环。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。