文章目录
初级Shell命令
查看当前用户基本信息
finger <username>
命令别名
-
查看当前shell可以别名
alias -p
-
创建用户别名
eg: alias li='ls -li'
- alias属于shell内建命令,默认情况下,一个别名仅在它所被定义的shell进程才有效
- type <shell command> 可以查看命令是否是内建命令(相对于shell而言,shell自带的为内建,系统命令/bin,/usr/bin等为外建命令)
- 使用外建命令会调用子shell,需要创建子shell环境,速度慢
查看磁盘空间
- 查看某个设备上面还有多少磁盘空间(查看的是已挂载磁盘的使用情况)
h表示按照用户易读的形式显示df -h
- 查看当前目录各文件大小,并按照降序排列
du -sh * | sort -nr
- du表示查看当前目录文件大小,-s表示显示每个输出参数的统计信息-h表示按照用户易读方式输出
- * 表示对当前目录下的每个目录文件都统计
- sort表示对上面目录大小排序,-n表示当作数字排序,-r表示降序排列
过滤文件数据
- 搜索过滤数据
grep [options pattern] [file] eg: grep [A-Z] -n file1.txt (在file1.txt中查找包含A-Z字符的行,-n表示显示行号) grep H -v file1.txt (-v表示反向搜索,在file1.txt中查找不包含H的行) grep H -c file1.txt (-c表示统计包含字符H的总行数)
压缩数据
-
GNU 压缩工具 gzip
- 压缩
gzip
- 查看压缩文件
gzcat
- 解压文件
gunzip
- 可以使用通配符 * 实现批量压缩
- 压缩
实现数据归档 - tar
- tar 实现数据归档
-
创建归档文件
tar -cvf test.tar test/ test2/
- 上面命令创建了名为test.tar的归档文件,含有test和test2目录内容
- -c 创建一个新的tar归档文件
- -v 处理时候显示文件信息
- -f 输出结果到文件或设备
-
列出文件test.tar内容(不提取内容)
tar -tf test.tar
- -t 表示列出tar归档文件内容
-
提取test.tar归档文件内容
tar -xvf test.tar
- -x 表示从已有归档文件提取文件
-
从.tgz压缩文件提取(.tgz指的是被gzip压缩过的tar文件)
tar -zxvf filename.tgz
- -z 表示把输出重定向给gzip命令来解压缩内容
- -z 表示把输出重定向给gzip命令来解压缩内容
-
查看进程信息
- 查看进程信息(Unix风格的ps命令)
ps -ef ps -l ps --forest
- -e 表示查看所有进程
- -f 表示显示完整格式信息
- -l 可以获得更多信息
- –forest 可以按父shell和子shell层级展示各进程使用的cmd
- 实时监测进程信息
top
- 结束进程1(根据pid结束进程)
kill -9 <pid> (pid表示进程号) kill -s KILL <pid>
- 上面两者等价
- 结束进程2(可以根据进程名结束进程)
eg: killall http*
- 上例表示结束所有以http开头的进程
- 上例表示结束所有以http开头的进程
挂载设备相关命令
- 查看当前系统挂载设备列表
mount
- 输出结果中,每行表示一个设备挂载信息,如下:
- 媒体设备文件名 on 媒体设备挂载到虚拟目录的挂载点 文件系统类型 已挂载媒体的访问状态
eg: /dev/sda1 on /boot type ext3 (rw)
- 为当前设备以新的权限挂载到 / 虚拟目录
mount –o remount,rw /
- -o 表示给文件系统添加特定的选项
- 这种方式通常用于忘记密码进入recovery mode 修改密码使用,因为recovery mode中,默认挂载方式是只读权限,需要通过这种方式重新以读写权限方式挂载到 / 上,然后修改密码
- 从 Linux系统上移除一个可移动设备时,不能直接从系统移除,而应先卸载
umount [directory | device] eg: umount /home/rich/mnt
将任务放到后台模式运行
- 在shell 命令后加 ‘&’ 就可以进入后台命令运行
<shell command> & eg: sleep 3000&
- sleep 3000表示休眠3000秒,后面的&表示后台运行
- 查看后台运行的程序
jobs jobs -l eg result: [1]+ 2369 Running sleep 3000&
- [1] 表示作业号
- Runing表示进程正在执行
- Done表示进程执行完毕
- 最后显示运行的cmd
- -l 能够显示进程(作业)的PID
Linux 环境变量
全局变量与局部变量
全局变量
```
全局环境变量对于shell会话和所有生成的子shell都是可见的。局部变量则只对创建它们的shell可见
```
* 查看所有全局变量
```
env
printenv
```
* 查看特定局部变量(以HOME为例)
```
printenv HOME
echo $HOME
ls $HOME #变量如果是目录可以直接使用
```
局部变量
局部环境变量只能在定义它们的进程中可见
设置用户自定义变量
设置局部用户自定义变量
echo $my_variable # 定义变量
my_variable=Hello # 赋值
echo $my_variable # 查看变量
- 离开当前shell,定义的局部变量就不可被访问
- 如果要给变量赋一个含有空格的字符串值,必须用单引号来界定字符串的首和尾。
- 所有的系统环境变量名均使用大写字母,这是bash shell的标准惯例。如果是你自己创建的局部变量或是shell脚本,请使用小写字母
- 变量名、等号和值之间没有空格,这一点非常重要。如果在赋值表达式中加上了空格,bash shell就会把值当成 一个单独的命令
设置全局变量
var='Hello world' #给变量赋值
export var #声明为全局变量
echo $var #查看全局变量
- 子shell中不能修改父shell中定义的全局变量(修改值只在子shell有效)
删除环境变量
unset var #删除变量var,注意不需要写$
- 在子进程中删除了一个全局环境变量,这只对子进程有效。该全局环境变量在父进程中依然可用
设置PATH环境变量
当你在shell命令行界面中输入一个外部命令时,shell必须搜索系统来找到对应的程序。PATH环境变量定义了用于进行命令和程序查找的目录
- 添加搜索目录
PATH=$PATH:/home/zhangw
- 对PATH变量的修改只能持续到退出或重启系统
bash shell 的启动方式
在你登入Linux系统启动一个bash shell时,默认情况下bash会在几个文件中查找命令。这些文件叫作**启动文件或环境文件
-
启动bash shell 的三种方式
- 登陆时作为默认登录shell
- 作为非登录shell的交互式shell
- 作为运行脚本的非交互shell
-
登陆时作为默认登录shell
1、当你登录Linux系统时,bash shell会作为登录shell启动。登录shell会从5个不同的启动文件里读取命令: 2、/etc/profile文件是系统上默认的bash shell的主启动文件。系统上的每个用户登录时都会执行这个启动文件。
-
/etc/profile
- /etc/profile文件是bash shell默认的的主启动文件。只要你登录了Linux系统,bash就会执行/etc/profile启动文件中的命令。
- /etc/profile文件是bash shell默认的的主启动文件。只要你登录了Linux系统,bash就会执行/etc/profile启动文件中的命令。
-
下面的启动文件都起着同一个作用,提供一个用户专属的启动文件来定义该用户所用到的环境变量。大多数Linux发行版只用这四个启动文件中的一到两个
- $HOME/.bash_profile
- $HOME/.bashrc
- $HOME/.bash_login
- $HOME/.profile
-
-
作为非登录shell的交互式shell
- 如果你的bash shell不是登录系统时启动的(比如是在命令行提示符下敲入bash时启动),那么你启动的shell叫作交互式shell。交互式shell不会像登录shell一样运行,但它依然提供了命令行提示符来输入命令。
- 如果bash是作为交互式shell启动的,它就不会访问/etc/profile文件,只会检查用户HOME目录中的.bashrc文件。
-
非交互式shell
- 系统执行shell脚本时用的就是这种shell。不同的地方在于它没有命令行提示符
- 当你在系统上运行脚本时,也许希望能够运行一些特定启动的命令
- 为了处理这种情况,bash shell提供了BASH_ENV环境变量。当shell启动一个非交互式shell进程时,它会检查这个环境变量来查看要执行的启动文件。如果有指定的文件,shell会执行该文件里的命令,这通常包括shell脚本变量设置。
- 这个环境变量在默认情况下并未设置,此时shell脚本可以使用继承自父shell导出过的变量
- 举例来说,如果父shell是登录shell,在/etc/profile、/etc profile.d/*.sh和$HOME/.bashrc文件中设置并导出了变量,用于执行脚本的子shell就能够继承这些变量。
- 由父shell设置但并未导出的变量都是局部变量。子shell无法继承局部变量。
环境变量持久化
- 在大多数发行版中,存储个人用户永久性bash shell变量的地方是$HOME/.bashrc文件。这一点适用于所有类型的shell进程
- Linux系统中所有用户都需要使用的变量,最好不要放在/etc/profile文件,因为升级发行版这个文件也会随之更新,最好是在/etc/profile.d目录中创建一个以.sh结尾的文件。把所有新的或修改过的全局环境变量设置放在这个文件中
Linux文件权限
Linux的安全性
/etc/passwd文件
Linux系统使用一个专门的文件来将用户的登录名匹配到对应的UID值。这个文件就是
/etc/passwd文件,它包含了一些与用户有关的信息:
登录用户名
用户密码
用户账户的UID(数字形式)
用户账户的组ID(GID,数字形式)
用户账户的文本描述(备注字段)
用户HOME目录的位置
用户的默认shell
- root用户账户是Linux系统的管理员,固定分配给它的UID是0
- Linux为系统账户预留了500以下的UID值。有些服务甚至要用特定的UID才能正常工作
- 普通用户创建账户时,大多数Linux系统会从500开始,将第一个可用UID分配给这个账户(并非所有的Linux发行版都是这样)
- /etc/passwd文件中的密码字段都被设置成了x,这并不是说所有的用户账户都用相同的密码,绝大多数Linux系统都将用户密码保存在另一个单独的文件中(叫作shadow文件,位置在/etc/shadow)。只有特定的程序(比如登录程序)才能访问这个文件。
- /etc/shadow文件可以随意编辑(root用户),但是不推荐这样做,可能会导致用户无法登录。推荐用标准的Linux用户管理工具管理用户。
/etc/shadow文件
/etc/shadow文件为系统上的每个用户账户都保存了一条记录,如下:
rich:$1$.FfcK0ns$f1UgiyHQ25wrB/hykCn020:11627:0:99999:7:::
添加新用户
- 查看新用户默认设置
useradd -D eg: # useradd -D GROUP=100 # 默认组 HOME=/home # 默认目录 INACTIVE=-1 EXPIRE= #账户过期时间,以及账户密码过期后会不会被禁用。默认为空未设置过期时间 SHELL=/bin/bash #默认shell SKEL=/etc/skel # 新用户默认配置存放目录(有.bashrc等文件),新用户会从/etc/skel拷贝一份放到新用户目录下 CREATE_MAIL_SPOOL=yes
- 修改系统默认值
useradd -D -s /bin/bash 可以在-D选项后跟上一个指定的值来修改系统默认的新用户设置: 参数 描述 -b default_home 更改默认的创建用户HOME目录的位置 -e expiration_date 更改默认的新账户的过期日期 -f inactive 更改默认的新用户从密码过期到账户被禁用的天数 -g group 更改默认的组名称或GID -s shell 更改默认的登录shell
- 创建用户
useradd -m <username> 默认情况下,useradd命令不会创建HOME目录,但是-m命令行选项会使其创建HOME目录。 你能在此例中看到,useradd命令创建了新HOME目录,并将/etc/skel目录中的文件复制了过来。 -d 可以设置不同于用户名的用户目录: sudo useradd -m test3 -d /home/test3_dir
删除用户
- 默认情况下,userdel命令会只删除/etc/passwd文件中的用户信息,而不会删除系统中属于该账户的任何文件
- 如果加上-r参数,userdel会删除用户的HOME目录以及邮件目录。然而,系统上仍可能存有已删除用户的其他文件。这在有些环境中会造成问题。
- 在删除用户的HOME目录之前一定要检查清楚!你永远不知道用户是否在其HOME目录下存放了其他用户或其他程序要使用的重要文件
userdel -r test
修改用户
- 修改密码 passwd
sudo passwd <username>
接着根据提示输入密码
sudo passwd -e <username> 强制用户下次登录修改密码
- chpasswd 可以批量修改密码
- chpasswd命令能从
标准输入自动读取登录名和密码对(由冒号分割)列表,给密码加密,然后为用户账户设置。你也可以用重定向命令来将含有userid:passwd对的文件重定向给该命令
- chpasswd命令能从
chpasswd < users.txt
- 修改备注信息
sudo chfn <username>
- 全能命令usermod
usermod [options] <gid|gname> <username>
eg:
usermod -g 0 test #设置test的默认用户组为root所在的用户组
usermod -u 1008 test #更改test的UID为1008
usermod -aG my_group test #把test追加到my_group用户组
<br>
Linux用户组
每个用户组有唯一的GID,每个组还有唯一的组名
和UID一样,GID在分配时也采用了特定的格式。系统账户用的组通常会分配低于500的GID值,而用户组的GID则会从500开始分配
/etc/group文件有4个字段:
组名
组密码
GID
属于该组的用户列表
查看系统所有用户组
sudo cat /etc/group
sudo tail /etc/group
- 你会发现,在列表中,有些组并没有列出用户。这并不是说这些组没有成员,当一个用户在/etc/passwd文件中指定某个组作为默认组时,用户账户不会作为该组成员再出现在/etc/group文件中 。通过usermod -G <GID> <username>可以添加。
创建用户属组
sudo groupadd <group_name> # 创建用户组,默认没有用户被分配到该组
sudo usermod -G <group_name> <username> #添加用户组
eg :
sudo usermod -G shared test # 把test加入shared用户组
- 如果更改了已登录系统账户所属的用户组,该用户必须登出系统后再登录,组关系的更
改才能生效 - -G 选项则将该组添加到用户的属组的列表里,不会影响默认组。
修改用户属组
sudo groupmod -n sharing shared # 修改用户组名为 sharing
sudo groupmod -g <GID> sharing # 修改用户组GID
- 修改组名时,GID和组成员不会变,只有组名改变。由于所有的安全权限都是基于GID的,你可以随意改变组名而不会影响文件的安全性。
增加、删除用户属组
gpasswd [option] group
eg:
sudo gpasswd -a test sharing #把test添加到sharing用户组
sudo gpasswd -d test sharing #把test从sharing组中删除
理解用户权限
- 默认文件权限
umask 查看系统默认文件权限掩码,例如我的机器是0002,第一位为粘着位表示特殊性质
剩下的002为掩码:
对文件来说,全权限为 666,减去掩码,最终创建文件默认权限为664
即 110,110,100 -> rw-,rw-,r--
对目录来说,全权限为 777,减去掩码。最终创建的目录默认权限为775
即 111,111,101 -> rwx,rwx,r-x
三组二进制分别表示该文件的 属主、同组用户、不同组其他用户对该文件的权限
-代表文件
d代表目录
l代表链接
c代表字符型设备
b代表块设备
n代表网络设备
之后有3组三字符的编码。每一组定义了3种访问权限:
r代表对象是可读的
w代表对象是可写的
x代表对象是可执行的
若没有某种权限,在该权限位会出现单破折线
对象的属主
对象的属组
系统其他用户
修改文件权限
- 通过八进制模式修改权限
chmod [options] mode
eg:
chmod 760 a.txt # 这里没有加入options,optins可以通过 man chmod 查看
chmod -R 760 test/ #递归的给test/及其子目录(文件)添加权限
- 通过符号模式修改权限
chmod [options] [ugoa] [[+-=]][rwxXstugo]
chmod 和 [options]同上八进制模式
其中 [ugoa] [[+-=]][rwxXstugo]:
第一部分 [ugoa]:
u 文件所属用户
g 文件用户所属组
o 非该文件用户所属组的其他用户组
a 代表上述所有
第二部分 +-=:
+ 表示现有基础上增加权限
- 现有基础上移除权限
= 将权限值设置为后面的值
第三部分:
r 读权限
w 写权限
x 执行权限
X 如果对象是目录或者它已有执行权限,赋予执行权限
s 运行时重新设置UID或GID
t 保留文件或目录
u 将权限设置跟属主一样
g 将权限设置为跟属组一样
o 将权限设置为跟其他用户一样
最常用的就是rwx
eg:
chmod ug+x a.sh #给a.sh的属主和属组添加执行权限(x)
chmod u+rwx b.txt #给b.txt的属主添加读写执行权限
chmod o-x b.txt #给b.txt的其他组用户移除执行权限
chmod -R u+w test/ #递归的给test/及其子目录(文件)属主添加写权限
chmod o=r a.txt #把a.txt的其他组用户权限设置为只读
改变文件用户属组
-
chown命令
chown options owner[.group] file #[]内部表示可选项 common options: -R 递归改变子目录和文件的属组、属主 -h 改变该文件的所有符号链接文件的所属关系(部分系统支持) eg: chown test a.txt #更改a.txt文件的属主为test chown test.zhangw a.txt #更改a.txt文件的属主为test,同时更改其属组为zhangw chown .sharing a.txt #只更改a.txt的属组为sharing不更改属主 chown test. newfile #系统采用和用户登录名匹配的组名,可以只用一个条目就改变二者。
- 如果你的Linux系统采用和用户登录名匹配的组名,可以只用一个条目就改变二者
- 只有root用户能够改变文件的属主。任何属主都可以改变文件的属组,但前提是属主必须是原属组和目标属组的成员。
-
chgrp 更改文件、目录的默认属组
chgrp <group> <newfile> #更改newfile的默认属组为group eg: chgrp sharing newfile #更改newfile的默认属组为sharing
共享文件
```
mkdir testdir #创建一个共享目录,使目录里的新文件都能沿用目录的属组,只需将该目录的SGID位置位。
chgrp shared testdir #更改目录的默认属组为shared
chmod g+s testdir #设置目录属组组ID(SGID)
umask 002 #所有组成员都需把他们的umask值设置成文件对属组成员可写
```
- 要创建一个共享目录,使目录里的新文件都能沿用目录的属组,只需将该目录的SGID位置位
- 设置SGID:对文件来说,程序会以文件属组的权限运行;对目录来说,目录中创建的新文件会以目录的默认属组作为默认属组。
- 新文件会沿用目录的属组,而不是用户的默认属组。现在shared组的所有用户都能访问这个文件了