0%

Git中文件的状态

Git 有三种状态,

  1. 已提交(committed)
    1. 已提交表示数据已经安全地保存在本地数据库中。
  2. 已修改(modified)
    1. 已修改表示修改了文件,但还没保存到数据库中
  3. 已暂存(staged)
    1. 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

这会让我们的 Git 项目拥有三个阶段:工作区、暂存区以及 Git 目录。

工作区、暂存区以及 Git 目录。

工作区是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。

暂存区是一个文件,保存了下次将要提交的文件列表信息,一般在 Git 仓库目录中。 按照 Git 的术语叫做“索引”,不过一般说法还是叫“暂存区”。

Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,复制的就是这里的数据。

基本的 Git 工作流程如下:

  1. 在工作区中修改文件。
  2. 将你想要下次提交的更改选择性地暂存,这样只会将更改的部分添加到暂存区。
  3. 提交更新,找到暂存区的文件,将快照永久性存储到 Git 目录。

如果 Git 目录中保存着特定版本的文件,就属于 已提交 状态。 如果文件已修改并放入暂存区,就属于 已暂存 状态。 如果自上次检出后,作了修改但还没有放到暂存区域,就是 已修改 状态。

记录每次更新到仓库

现在我们的机器上有了一个 真实项目 的 Git 仓库,并从这个仓库中检出了所有文件的 工作副本。 通常,你会对这些文件做些修改,每当完成了一个阶段的目标,想要将记录下它时,就将它提交到仓库。

请记住,你工作目录下的每一个文件都不外乎这两种状态:已跟踪未跟踪。 已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后, 它们的状态可能是未修改,已修改或已放入暂存区。简而言之,已跟踪的文件就是 Git 已经知道的文件。

工作目录中除已跟踪文件外的其它所有文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有被放入暂存区。 初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态,因为 Git 刚刚检出了它们, 而你尚未编辑过它们。

编辑过某些文件之后,由于自上次提交后你对它们做了修改,Git 将它们标记为已修改文件。 在工作时,你可以选择性地将这些修改过的文件放入暂存区,然后提交所有已暂存的修改,如此反复。

文件的状态变化周期

使用

git status 命令的输出十分详细,但其用语有些繁琐。 Git 有一个选项可以帮你缩短状态命令的输出,这样可以以简洁的方式查看更改。 如果你使用 git status -s 命令或 git status --short 命令,你将得到一种格式更为紧凑的输出。

1
2
3
4
5
6
$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt

新添加的未跟踪文件前面有 ?? 标记,新添加到暂存区中的文件前面有 A 标记,修改过的文件前面有 M 标记。 输出中有两栏,左栏指明了暂存区的状态,右栏指明了工作区的状态。例如,上面的状态报告显示: README 文件在工作区已修改但尚未暂存,而 lib/simplegit.rb 文件已修改且已暂存。 Rakefile 文件已修,暂存后又作了修改,因此该文件的修改中既有已暂存的部分,又有未暂存的部分。

package control

不得不说,sublime是一个神器,并且支持N多扩展和插件。

其中Package Control包管理插件就特别赞。

支持添加/删除/禁用/查找插件的功能。

安装方法参考 https://packagecontrol.io/installation

命令行打开sublime

如果是在默认shell下,

1
sudo ln -s "/Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl" /usr/bin/subl

使用zsh的可以使用以下命令

1
2
3
alias subl="'/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl'"
alias nano="subl"
export EDITOR="subl"

显示CPU架构的有关信息 lscpu

Linux的CPU设备查看器。lscpu命令用来显示cpu的相关信息。
lscpusysfs/proc/cpuinfo收集cpu体系结构信息,命令的输出比较易读 。
命令输出的信息包含cpu数量,线程,核数,socket和Nom-Uniform Memeor Access(NUMA),缓存等等。

官方定义为:

lscpu - display information about the CPU architecture

参数基本用处不大,默认即可,部分参数可以查看offline和online的设备信息。

默认实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ lscpu
Architecture: x86_64 #架构信息
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 64 #逻辑cpu颗数
On-line CPU(s) list: 0-63
Thread(s) per core: 2 #每个核心线程
Core(s) per socket: 16 #每个cpu插槽核数/每颗物理cpu核数
Socket(s): 2 #cpu插槽数
NUMA node(s): 2
Vendor ID: GenuineIntel #cpu厂商ID
CPU family: 6 #cpu系列
Model: 63 #型号
Model name: Intel(R) Xeon(R) CPU E5-2698 v3 @ 2.30GHz
Stepping: 2 #步进
CPU MHz: 1290.335 #cpu主频
BogoMIPS: 4604.47
Virtualization: VT-x #cpu支持的虚拟化技术
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 40960K
NUMA node0 CPU(s): 0-15,32-47
NUMA node1 CPU(s): 16-31,48-63

其中几个概念需要理解清楚,基本比较重要的都有了备注。

其中第一个为CPU(s),这个值为Socket * Core * Thread得出,也就是逻辑的CPU个数。

1
2
3
4
5
CPU(s):                64   #逻辑CPU数
On-line CPU(s) list: 0-63
Thread(s) per core: 2
Core(s) per socket: 16
socket: 2

而其他几个概念为:

  • Socket : 物理上的CPU插槽的数量,也就是物理的实体概念
  • Core:即平常说的单核、多核、四核等,即每个CPU上的核数
  • Thread:每个core上的线程数,即超线程。

lscpu 显示CPU架构的有关信息

Linux的CPU设备查看器。lscpu命令用来显示cpu的相关信息。
lscpusysfs/proc/cpuinfo收集cpu体系结构信息,命令的输出比较易读 。
命令输出的信息包含cpu数量,线程,核数,socket和Nom-Uniform Memeor Access(NUMA),缓存等等。

官方定义为:

lscpu - display information about the CPU architecture

参数基本用处不大,默认即可,部分参数可以查看offline和online的设备信息。

默认实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ lscpu
Architecture: x86_64 #架构信息
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 64 #逻辑cpu颗数
On-line CPU(s) list: 0-63
Thread(s) per core: 2 #每个核心线程
Core(s) per socket: 16 #每个cpu插槽核数/每颗物理cpu核数
Socket(s): 2 #cpu插槽数
NUMA node(s): 2
Vendor ID: GenuineIntel #cpu厂商ID
CPU family: 6 #cpu系列
Model: 63 #型号
Model name: Intel(R) Xeon(R) CPU E5-2698 v3 @ 2.30GHz
Stepping: 2 #步进
CPU MHz: 1290.335 #cpu主频
BogoMIPS: 4604.47
Virtualization: VT-x #cpu支持的虚拟化技术
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 40960K
NUMA node0 CPU(s): 0-15,32-47
NUMA node1 CPU(s): 16-31,48-63

其中几个概念需要理解清楚,基本比较重要的都有了备注。

其中第一个为CPU(s),这个值为Socket * Core * Thread得出,也就是逻辑的CPU个数。

1
2
3
4
5
CPU(s):                64   #逻辑CPU数
On-line CPU(s) list: 0-63
Thread(s) per core: 2
Core(s) per socket: 16
socket: 2

而其他几个概念为:

  • Socket : 物理上的CPU插槽的数量,也就是物理的实体概念
  • Core:即平常说的单核、多核、四核等,即每个CPU上的核数
  • Thread:每个core上的线程数,即超线程。

什么是NUMA node

NUMA体系结构中多了Node的概念,Node是一个逻辑上的概念,这个概念其实是用来解决core的分组的问题。每个node有自己的内部CPU,总线和内存,同时还可以访问其他node内的内存。即Node用来将core分组,每个Node拥有一个对应的本地内存。

node 和socket没有必然的联系,一般是一个socket上的core属于同一个node。

对操作系统来说,其逻辑CPU的数量就是Socket * Core * Thread

CentOS 安装配置zabbix库

安装zabbix库

1
2
3
4
5
6
7
$ sudo rpm -ivh https://repo.zabbix.com/zabbix/5.4/rhel/7/x86_64/zabbix-release-5.4-1.el7.noarch.rpm

# 安装zabbix前端的一些包
$ yum-config-manager --enable rhel-7-server-optional-rpms

# Installation
$ sudo yum install zabbix-server-mysql

新建数据库

新建 zabbix Mysql 数据库及专用账号

1
$ mysql 
1
2
3
4
5
6
7
mysql > CREATE DATABASE zabbix character set utf8 collate utf8_bin;

mysql > GRANT all ON zabbix.* TO 'zabbix'@'%' IDENTIFIED BY 'zabbix';

mysql > flush privileges;

mysql > quit

导入数据

默认情况下,执行下述命令就可以;

1
# zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix

但是我好想没有找到这个压缩文件,所以执行下面的命令:

1
2
3
4
5
$ cd /usr/share/zabbix-mysql/
# 依次导入下列sql表
$ cat schema.sql | mysql -uzabbix -p zabbix
$ cat images.sql | mysql -uzabbix -p zabbix
$ cat data.sql | mysql -uzabbix -p zabbix

配置数据库

1
2
3
4
5
6
7
8
9
$ vim /etc/zabbix/zabbix_server.conf

DBHost=localhost

DBName=zabbix

DBUser=zabbix

DBPassword=zabbix

启动 Zabbix server 进程

1
2
3
$ service zabbix-server start

$ systemctl enable zabbix-server

web UI 安装zabbix

重启一下Httpd 服务后,进入 http://zabbix-server-ip/zabbix 即可web配置,

初始登录信息为Admin/zabbix

安装zabbix agent

安装Zabbix Agent

1
yum install zabbix-agent

编辑Zabbix Agent 配置文件

1
2
3
4
5
6
vim /etc/zabbix/zabbix_agentd.conf

Server=[zabbix server ip]

ServerActive=[zabbix server ip]
Hostname=[ Hostname of client system ]

重启Zabbix Agent

1
2
3
4
5
service zabbix-agent restart

添加开机启动
​```bash
chkconfig zabbix-agent on

Zabbix agent on Zabbix server is unreachable for 5 minutes

checked and found that the ServerActive address is not changed to zabbix-server IP address in configuration file. So we changed it to Zabbix-server IP.

We made the changes in:

1
/etc/zabbix/zabbix_agentd.conf

and restarted the service using:

1
$ sudo service zabbix-agent2 start 

This fixed the issue.

Not able to find zabbix data source in grafana After enabling plugin

It appears as signed on grafana’s plugin panel, but /etc/grafana/grafana.ini needs editing.


[plugins]
allow_loading_unsigned_plugins = alexanderzobnin-zabbix-datasource

zabbix 无法启动server服务器

可以检查日志tailf /var/log/zabbix/zabbix_server.log

ZABBIX 报错连接拒绝(cannot connect to [10050]: [111] Connection refused)

首先还是看一下防火墙等是不是阻断.
然后确认数据库的最大连接数.默认的是256.

1.vim /etc/my.cnf
[mysqld]
max_connections=需要添加的最大连接数

2.vim /etc/systemd/system.conf
DefaultLimitNOFILE=65535
DefaultLimitNPROC=65535

3.重启

systemctl daemon-reload

systemctl restart mysqld.service

查看最大连接数
mysql>show variables like ‘max_connections’;
查看当前连接数
show status like ‘%thread%’;

查看Linux的CPU信息

可以通过命令lscpu来查看

lscpu用于显示CPU的相关信息,该命令主要从sysfs和/proc/cpuinfo收集CPU体系结构信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ lscpu
Architecture: x86_64 # 架构
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 16 # 逻辑CPU颗数
On-line CPU(s) list: 0-15
Thread(s) per core: 2 # 每个核的线程
Core(s) per socket: 4 # 每个CPU插槽的核数
Socket(s): 2 # CPU的插槽数
NUMA node(s): 2
Vendor ID: GenuineIntel # CPU厂商ID
CPU family: 6 # CPU系列
Model: 85 # 型号
Model name: Intel(R) Xeon(R) Gold 5222 CPU @ 3.80GHz
Stepping: 7 # 步进
CPU MHz: 3538.279 # CPU主频
CPU max MHz: 3900.0000
CPU min MHz: 1200.0000
BogoMIPS: 7600.00
Virtualization: VT-x # CPU支持的虚拟化技术
L1d cache: 32K # 一级缓存
L1i cache: 32K # 一级缓存
L2 cache: 1024K # 二级缓存
L3 cache: 16896K # 三级缓存
NUMA node0 CPU(s): 0,2,4,6,8,10,12,14 # Nom-Uniform Memeory Access(NUMA)
NUMA node1 CPU(s): 1,3,5,7,9,11,13,15
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpcid_single intel_ppin ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm mpx rdt_a avx512f avx512dq rdseed adx smap clflushopt clwb intel_pt avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts pku ospke avx512_vnni md_clear flush_l1d arch_capabilities

可以加上参数-p来获取比较容易解析的输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ lscpu -p
# The following is the parsable format, which can be fed to other
# programs. Each different item in every column has an unique ID
# starting from zero.
# CPU,Core,Socket,Node,,L1d,L1i,L2,L3
0,0,0,0,,0,0,0,0
1,1,1,1,,1,1,1,1
2,2,0,0,,2,2,2,0
3,3,1,1,,3,3,3,1
4,4,0,0,,4,4,4,0
5,5,1,1,,5,5,5,1
6,6,0,0,,6,6,6,0
7,7,1,1,,7,7,7,1
8,0,0,0,,0,0,0,0
9,1,1,1,,1,1,1,1
10,2,0,0,,2,2,2,0
11,3,1,1,,3,3,3,1
12,4,0,0,,4,4,4,0
13,5,1,1,,5,5,5,1
14,6,0,0,,6,6,6,0
15,7,1,1,,7,7,7,1

或者直接读取/proc/cpuinfo文件

1
2
3
4
5
6
7
8
9
10
11
# 总核数 = 物理CPU个数 X 每颗物理CPU的核数
# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数

# 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq

# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l

kswapd often uses 100% CPU when swap is in use

如果此时的Mem并没有用很多的话,可能需要执行下面的命令来强制关闭:

1
2
$ killall -9 kswapd
$ echo 1 > /proc/sys/vm/drop_caches

超凡脱俗的 sudo

Linux sudo命令以系统管理者的身份执行指令,也就是说,经由 sudo 所执行的指令就好像是 root 亲自执行。

如果希望可以执行这个命令,需要管理员在文件 /etc/sudoers 中增加权限即可。

官方的定义为:

execute a command as another user

语法

1
$ sudo [ option ] command

参数说明

  • -l--list:显示出自己(执行 sudo 的使用者)的权限
  • -k 将会强迫使用者在下一次执行 sudo 时问密码(不论有没有超过 N 分钟)
  • -b 将要执行的指令放在后台执行
  • -p prompt 可以更改问密码的提示语,其中 %u 会代换为使用者的帐号名称, %h 会显示主机名称
  • -u username/uid 不加此参数,代表要以 root 的身份执行指令,而加了此参数,可以以 username 的身份执行指令(uid 为该 username 的使用者号码)
  • -s 执行环境变数中的 SHELL 所指定的 shell ,或是 /etc/passwd 里所指定的 shell
  • -H 将环境变数中的 HOME (家目录)指定为要变更身份的使用者家目录(如不加 -u 参数就是系统管理者 root
  • command 要以系统管理者身份(或以 -u 更改为其他人)执行的指令

没有sudo权限的用户

如果没有sudo权限,在执行命令的时候还有下面👇的输出:

1
2
3
$ sudo ls
[sudo] password for username:
username is not in the sudoers file. This incident will be reported.

指定用户执行命令

这个的应用场景为,其他用户在登录,而你具有sudo权限,测试可以通过指定用户名来操作。

1
$ sudo -u username ls -l

列出目前sudo的权限

如果不清楚,可以执行那些命令,可以通过参数-l来查看,主要看在sudoer里面的修改。

1
2
3
4
5
6
7
8
9
10
11
$ sudo -l
Password:
Matching Defaults entries for user on localhost:
!visiblepw, always_set_home, match_group_by_gid, env_reset, env_keep="COLORS DISPLAY
HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS
LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",
env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL
LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

User user may run the following commands on localhost:
(ALL) ALL

以root权限执行上一条命令

使用sudo快速统计家目录的使用情况

1
2
3
4
5
6
7
$ sudo sh -c "cd /home ; du -s * | sort -rn "
15013524344 user1
1170974156 user2
139238772 user3
1382673532 user4
41071068 user5
3523056 user6

Linux sudo命令

Linux sudo命令以系统管理者的身份执行指令,也就是说,经由 sudo 所执行的指令就好像是 root 亲自执行。

如果希望可以执行这个命令,需要管理员在文件 /etc/sudoers 中增加权限即可。

官方的定义为:

execute a command as another user

语法

1
$ sudo [ option ] command

参数说明

  • -l--list:显示出自己(执行 sudo 的使用者)的权限
  • -k 将会强迫使用者在下一次执行 sudo 时问密码(不论有没有超过 N 分钟)
  • -b 将要执行的指令放在后台执行
  • -p prompt 可以更改问密码的提示语,其中 %u 会代换为使用者的帐号名称, %h 会显示主机名称
  • -u username/uid 不加此参数,代表要以 root 的身份执行指令,而加了此参数,可以以 username 的身份执行指令(uid 为该 username 的使用者号码)
  • -s 执行环境变数中的 SHELL 所指定的 shell ,或是 /etc/passwd 里所指定的 shell
  • -H 将环境变数中的 HOME (家目录)指定为要变更身份的使用者家目录(如不加 -u 参数就是系统管理者 root
  • command 要以系统管理者身份(或以 -u 更改为其他人)执行的指令

没有sudo权限的用户

如果没有sudo权限,在执行命令的时候还有下面👇的输出:

1
2
3
$ sudo ls
[sudo] password for username:
username is not in the sudoers file. This incident will be reported.

指定用户执行命令

这个的应用场景为,其他用户在登录,而你具有sudo权限,测试可以通过制定用户名来操作。

1
$ sudo -u username ls -l

列出目前sudo的权限

如果不清楚,可以执行那些命令,可以通过参数-l来查看,主要看在sudoer里面的修改。

1
2
3
4
5
6
7
8
9
10
11
$ sudo -l
Password:
Matching Defaults entries for user on localhost:
!visiblepw, always_set_home, match_group_by_gid, env_reset, env_keep="COLORS DISPLAY
HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS
LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",
env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL
LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

User user may run the following commands on localhost:
(ALL) ALL

以root权限执行上一条命令

使用sudo快速统计家目录的使用情况

1
2
3
4
5
6
7
$ sudo sh -c "cd /home ; du -s * | sort -rn "
15013524344 user1
1170974156 user2
139238772 user3
1382673532 user4
41071068 user5
3523056 user6

炫技 - 快速执行上一条命令

第一种方法:在终端输入两个感叹号,然后回车就可以快速地执行上一条命令了。

1
$ !!

在linux下修改权限

1
2
3
4
5
6
7
chmod g+r path/file 加读权限 当前目录
chmod -R g+r path/file 加读权限 当前目录以及子目录
g-r 减读权限
g+w 加写权限
g-w
g+x 加执行权限
g-x

chgrp修改文件所属组

简单使用,将文本test.txt所属组改为gourp1

1
chgrp gourp1 test.txt

2.chown修改文件拥有者
##将test.txt文件所属用户修改为user1

1
chown user1 test.txt

##同时修改test.txt的所属用户和所属组

1
chown user1:group1 test.txt

3.chmod修改文件属性

1
2
3
4
chmod 755 test
chmod u+x test
chmod u-x test
chmod g+x test

4.usrmod修改用户所属组
一般的话只是将当前用户添加到其它组中去

1
usrmod -a -G group1 user1

如果要彻底更改用户所属的组的话使用

1
usrmod -g group1 user1

使用Linux时,需要以一个用户的身份登陆,从而限制一个使用者能够访问的资源;而组则是用来方便组织管理用户。

用户与组

•每个用户拥有一个UserID
•每个用户属于一个主组,属于一个或多个附属组
•每个组拥有一个GroupID
•每个进程以一个用户身份运行,并受该用户可访问的资源限制
•每个可登陆用户有一个指定的SHELL

系统中的文件都有一个所属用户及所属组,用户、组信息保存在以下三个文件中:

1
2
3
4
5
/etc/passwd   用户信息

/etc/shadow 用户密码

/edc/group  组信息

命令id用以显示当前用户的信息,命令passwd可以修改当前用户的密码;以下命令可以显示登陆用户信息:

1
2
3
4
5
whoami   显示当前用户

who 显示当前登陆的用户信息

w 显示登陆用户的详细信息

命令usermod修改一个用户的信息:

usermod 参数 用户名
-l  修改用户名
-u 修改uid
-g 修改用户主组
-G 修改用户附属组
-L 锁定用户
-U 解锁用户

命令userdel用户删除一个用户:

userdel 用户名
userdel -l 用户名 删除用户的同时删除该用户家目录

命令groupadd、groupmod用以创建、修改一个组:
groupadd 组名

groupmod -n 新组名 旧组名
groupmod -g 新组ID 旧组ID

例如:

userdel -r sam

此命令删除用户sam在系统文件(主要是/etc/passwd,/etc/shadow,/etc/group等)中的记录,同时删除用户的主目录。

删除一个组

同样的,我们有时会需要删除一个组,命令groupde用以删除一个组

Linux文件特殊权限:SUID、SGID和SBIT

SUID

当s这个标志出现在 文件所有者的x权限上时,例如文件权限状态“-rwsr-xr-x”,此时就称为 Set UID,简称为SUID的特殊权限。SUID有这样的限制和功能:

(1)SUID权限仅对 二进制程序有效;

(2)执行者对于该程序需要 具有x的可执行权限

(3)本权限仅在 执行该程序的过程中有效;

(4)执行者将具有该程序所有者的权限。

举个例子,在Linux中,所有账号的密码记录在/etc/shadow这个文件中,并且只有root可以读和强制写入这个文件。那么,如果另一个账号vbird需要修改自己的密码,就需要访问/etc/shadow这个文件,但是上面明明说了只有root能访问/etc/shadow这个文件,是不是矛盾?但事实上,vbird是可以修改/etc/shadow这个文件内的密码的,这就是SUID的功能。

通过上述的功能说明,我们知道,

(1)vbird对于/usr/bin/passwd这个程序具有x权限,表明vbird可以执行passwd;

(2)passwd的所有者为root;

(3)vbird执行passwd的过程中会暂时获得root的权限;

(4)/etc/shadow因此可以被vbird所执行的passwd所修改。

但是vbird如果使用cat去读取/etc/shadow这个文件时,是不能读取的。

img

(SUID只能用在文件上,不能用在目录)

SGID

当s标志出现在文件所有者的x权限时称为SUID,那么s出现在用户组的x权限时称为SGID。(U表示user,G表示group)。SGID有如下功能:

(1)SGID对二进制程序有用;

(2)程序执行者对该程序需具备x权限;

(3)执行者在执行过程中会获得该程序用户组的支持。

举个例子,/usr/bin/locate这个程序可以去查询/var/lib/mlocate/mlocate.db这个文件的内容,mlocate.db的权限如下:

-rwx–s–x root slocate /usr/bin/locate

-rw-r—– root slocate /var/lib/mlocate/mlocate.db

若使用vbird这个账号执行locate时,vbird就会获得用户组slocate支持,又由于用户组slocate对mlocate.db具有r权限,所以vbird就可以读取mlocate.db了。

img

除二进制程序外,SGID也可以用目录上。当一个目录设置了SGID权限后,它具有如下功能:

(1)用户若对此目录具有r和x权限,该用户能够进入该目录;

(2)用户在此目录下的有效用户组将变成该目录的用户组;

(3)若用户在此目录下拥有w权限,则用户所创建的新文件的用户组与该目录的用户组相同。

SBIT

SBIT目前只对目录有效。

SBIT对目录的作用是:

(1)当用户对此目录具有w和x权限时,即具有写入权限时;

(2)当用户在该目录下创建新文件或目录时,仅有自己和root才有权力删除。

SUID\SGID\SBIT权限设置

先将其转换成数字:

SUID->4

SGID->2

SBIT->1

假设要将一个文件权限修改为“-rwsr-xr-x”,由于s在用户权限中,所以是SUID,因此,原先的755前面还要加上4,也就是4755,所以,

用命令chmod 4755 filename 设置就可以了。此外,还可能出现S和T的情况。

我们知道,s和t是替代x这个权限的,但是,如果它本身没有x这个权限,修改为s或t时就会变成大S或大T,例如:

执行chmod 7666 filename。 因为666表示“-rw-rw-rw”,均没有x权限,所以最后变成“-rwSrwSrwT”。

Linux中的特殊权限粘滞位(sticky bit)详解

在linux下每一个文件和目录都有自己的访问权限,访问权限确定了用户能否访问文件或者目录和怎样进行访问。最为我们熟知的一个文件或目录可能拥有三种权限,分别是读、写、和执行操作。我们创建一个文件后系统会默认地赋予所有者读和写权限。当然我们也可以自己修改它,添加自己需要的权限。

除了通用的这些权限,我们来说说在linux下的另一个特殊权限。首先我们来看看在根目录下的一个目录tmp,可以看到tmp目录的other权限是rwt,那么这里的t又是什么权限呢,有什么意义。

t就是粘滞位(粘着位)

上面所说的t权限就是我们在这里要讲的粘滞位(sticky bit),我们给刚刚的cur目录采用chmod o+t的方式给other用户设置粘滞位。

可以看到此时我们是没有权限删除root用户创建的文件了,这也就是粘滞位的作用。

粘滞位权限便是针对此种情况设置,当⽬录被设置了粘滞位权限以后,即便⽤户对该⽬录有写⼊权限,也不能删除该⽬录中其他⽤户的⽂件数据,⽽是只有该⽂件的所有者和root⽤户才有权将其删除。设置了粘滞位之后,正好可以保持⼀种动态的平衡:允许各⽤户在⽬录中任意写⼊、删除数据,但是禁⽌随意删除其他⽤户的数据。

如果去掉了other的执行权限,可以看到本来’t’的位置变成了’T’,,那么原来的执行标志x到哪里去了呢? 系统是这样规定的, 假如本来在该位上有x, 则这些特别标志 (suid, sgid, sticky) 显示为小写字母 (s, s, t).否则, 显示为大写字母 (S, S, T) 。

粘滞位权限是针对目录的,对文件无效