linux基础

149 阅读7分钟

linux权限

文件权限和目录权限区别

虽然文件和目录的权限都是rwx三种,但是在Linux系统中对文件和目录的权限是有不同含义和区别的。

权限对文件的作用对目录的作用
r 读取权限具有读取,浏览文件内容的权限具有浏览目录及其子目录的权限
w 写入权限具有增加,修改,删除文件内容的权限具有增加,删除或修改目录内文件的权限
x 执行权限具有执行文件的权限具有进入目录的权限

如果是普通用户,同时还需要具备可读r的权限才能执行文件。

而root用户只要有可执行x的权限就能执行文件。

非特权用户umask默认是 002

root的umask 默认是 022

文件夹的最高权限777

文件的最高权限是666

新建目录默认权限为755

新建文件默认权限为644

chmod和chown

chmod

 chmod u/g/o/a   [=±r]  [rwx]
-R:递归修改权限

chown

chown 属主 文件...        #仅更改文件的用户所有权
chown 属主:属组 文件...  #修改文件的用户和组的所有权
chown 属主: 文件
 chown :属组 文件...      #仅更改文件的组所有权
-R:递归修改归属关系          

/etc/passwd 存放用户文件
用户名:密码占位符X:UID:基本组GID:用户描述信息:家目录:登录系统解释器
/etc/shadow 用户的密码信息

附加权限(特殊权限)

“粘滞”位

占用其他人(Other)的 x 位
显示为 t 或 T,取决于其他人是否有 x 权限
粘滞位表示,只有文件所有者才能删除该文件,即使组权限允许该文件可以删除。通常,在 `/tmp` 这样的通用或协作目录上,此设置最有意义

SGID权限

占用属组(Group)的 x 位
显示为 s 或 S,取决于属组是否有 x 权限
`sgid` 位与 `suid` 位类似,操作是在目录的组所有权下完成的,而不是以运行命令的用户身份。

一个使用 `sgid` 的例子是,如果多个用户正在同一个目录中工作,并且目录中创建的每个文件都需要具有相同的组权限。
在一个具有SGID权限的目录下,新建的文档会自动继承此目录的属组身份  

SUID权限

占用属主(User)的 x 位
显示为 s 或 S,取决于属主是否有 x 权限
仅对可执行的程序有意义
当在文件上设置 `suid` 时,将以文件的属主的身份而不是运行该文件的用户身份执行操作。一个好的例子是 `passwd` 命令。它需要设置 `suid` 位,以便更改密码的操作具有 root 权限

su和sudo

su

su 普通用户切换到超级用户
su+普通用户 超级用户切换到普通用户
限制使用su命令的用户
vim /etc/pam.d/su 
2 auth sufficient pam_ rootok.so   //开启第二行和第六行  .................................  
6 auth required pam_ wheel.so use_ _uid
  

sudo

[root@localhost ~]#visudo

 #用户    登入主机 = (代表用户)     命令
 #user     host=(username)       command
   root       ALL=(ALL)          ALL
  %wheel      ALL=(ALL)         NOPASSWD:ALL
  
 #不以`%`号开头的表示"将要授权的用户",比如例子中的root;
 #以`%`号开头的表示"将要授权的组", 比如例子中的`%wheel`组 和 `%sudo`组
 #第一个ALL表示通过哪些主机登入。
 #第二个ALL表示以哪个用户身份。
 #最后一个ALL表示允许运行哪些命令。
 #NOPASSWD表示使用sudo命令不需要验证密码。
 #在命令前面加上叹号表示不能执行该程序
 ​
 举例说明:
 1.nancy    ALL=(root)   /bin/mount
 #表示nancy用户通过任何主机登入系统后,可以以root的身份运行mount命令(命令前必须加sudo)。
 ​
 2.%wheel    ALL=(ALL)   ALL
 #表示wheel组内的成员通过任何主机登入系统后,可以以任何用户的身份运行所有命令(命令前必须加sudo)。
 ​
 ​
 字段填写说明:
 1.user:可以写用户名或UID。
 2.group:可以写组名或GID。
 3.host:可以写ip或hostname(IP地址或主机名)。
 4.command:
  command name  (命令)
  directory     (文件夹里的命令)
  sudoedit      (可以编辑sudoers这个文件,变相变成管理员)
  Cmnd_Alias    (命令别名)
  
 注:配置文件内支持使用通配符,例如"/sbin/*"表示/sbin/目录下的所有命令。

1)允许 yuji 用户以任何用户的身份运行所有命令。

允许nancy用户以root用户的身份运行mount命令。

ruby
 代码解读
复制代码
 # 1.普通用户nancy不允许使用mount命令。
 [nancy@localhost ~]$ whoami
 nancy
 [nancy@localhost ~]$ mount /dev/sr0 /mnt
 mount: 只有 root 能执行该操作
 ​
 # 2.编辑配置文件,将yuji用户和nancy用户加入文件。
 [root@localhost ~]# visudo            //编辑配置文件/etc/sudoers
 ---------------------------
 yuji    ALL=(ALL)       ALL
 nancy   ALL=(root)      /bin/mount
 ​
 # 3.允许nancy用户以roo身份运行mount命令。
 [nancy@localhost ~]$ whoami
 nancy
 [nancy@localhost ~]$ sudo mount /dev/sr0 /mnt
 [sudo] nancy 的密码:
 mount: /dev/sr0 写保护,将以只读方式挂载
 ​
 # 4.yuji用户以root身份创建文件,文件属主是root。
 [yuji@localhost ~]$ whoami
 yuji
 [yuji@localhost ~]$ sudo touch 1.txt
 [sudo] yuji 的密码:
 [yuji@localhost ~]$ ll 1.txt
 -rw-r--r-- 1 root root 0 3月   7 16:52 1.txt

2)将jack用户加入wheel后,之后可使用所有命令。


 1.jack不在/etc/sudoers文件中,不允许使用sudo命令。
 [jack@localhost ~]$ sudo umount /mnt
 ​
 我们信任您已经从系统管理员那里了解了日常注意事项。
 总结起来无外乎这三点:
 ​
     #1) 尊重别人的隐私。
     #2) 输入前要先考虑(后果和风险)。
     #3) 权力越大,责任越大。
 ​
 [sudo] jack 的密码:
 jack 不在 sudoers 文件中。此事将被报告。
 ​
 
 2.将jack加入wheel组内。jack可以成功使用sudo命令。
 [root@localhost ~]# gpasswd -a jack wheel
 正在将用户“jack”加入到“wheel”组中
 [root@localhost ~]# su - jack
 上一次登录:一 3月  7 16:45:31 CST 2022pts/0 上
 [jack@localhost ~]$ whoami
 jack
 [jack@localhost ~]$ sudo umount /mnt
 [sudo] jack 的密码:
 [jack@localhost ~]$ 
sudo子目录

如果对所有用户进行提权都放在/etc/sudoers 一个文件中,非常不便于管理。这时可以在/etc/sudoers.d/ 下创建子目录。例如针对 测试部门的员工进行授权,可以创建/etc/sudoers.d/test;针对hr部门的员工进行授权,可以创建/etc/sudoers.d/hr。便于分类管理。


 [root@localhost ~]# vim /etc/sudoers.d/test          //创建子目录
 zhangsan  ALL=(root)  /bin/mount
 [root@localhost ~]# chmod 440 /etc/sudoers.d/test    //设置权限,加固安全
 [root@localhost ~]# ll /etc/sudoers.d/test
 -r--r----- 1 root root 33 3月   7 17:51 /etc/sudoers.d/test
查看sudo操作记录
  • 需要启用 Default logfile 配置
  • 默认日志文件:/var/log/sudo

[root@localhost log]# visudo          //修改配置文件
-----------------------------
Default logfile="/var/log/sudo"       //在最后一行添加 Default logfile 配置

测试查看日志是否正常记录:


[root@localhost ~]# sudo -u nancy touch /tmp/f2.txt     //以nancy用户的身份创建文件
[root@localhost ~]# tail -4 /var/log/sudo               //日志成功记录sudo操作
Mar 12 23:12:06 : root : TTY=pts/0 ; PWD=/root ; USER=nancy ; COMMAND=/bin/touch
    /tmp/f1.txt
Mar 12 23:13:49 : root : TTY=pts/0 ; PWD=/root ; USER=nancy ; COMMAND=/bin/touch
    /tmp/f2.txt

chattr 命令

chattr 命令⽤于更改⽂件的扩展属性,⽐ chmod 更改的 rwx 权限更底层

参数 
a :只能向⽂件中添加数据,不得删除 
-R :递归更改⽬录属性 
-V :显示命令执⾏过程 模式 
+ 增加参数 
- 移除参数 
= 更新为指定参数 
A 不让系统修改⽂件最后访问时间 
a 只能追加⽂件数据,不得删除 
i ⽂件不能被删除、改名、修改内容

lsattr 命令

lsattr 命令⽤于查看⽂件的第⼆扩展⽂件系统属性,结合 chattr ⼀起⽤

-R 递归地列出⽬录以及其下内容的属性 . 
-V 显示程序版本 . 
-a 列出⽬录中的所有⽂件 , 包括以 `.' 开头的⽂件的属性 . 
-d 以列出其它⽂件的⽅式那样列出⽬录的属性 , ⽽不列出其下的内容 .
-v  显示⽂件版本 .

linux用户管理

useradd

 useradd [选项]  用户名 #创建新用户
-u:指定 用户UID 
-d:指定宿主目录(家目录),默认为 /home/用户名
-g:指定用户的基本组名
-G:指定所属的附加组
-s:指定用户的登录解释器
-M: 不建立家目录
-e:指定用户的账户失效时间,可使用 YYYY-MM-DD 的日期格式。

usermod

基本语法:usermod [options] username

#[options]常用选项
sudo usermod -d /new/home/dir username #更改用户主目录
sudo usermod -p newpassword username  #更改用户密码
sudo usermod -s /bin/bash username  #更改用户的登录Shell
sudo usermod -L username  #锁定用户密码,使其无法登录。
sudo usermod -U username  #解锁用户密码,使其可以登录。

passwd

交互式设置密码    
passwd [选项]用户
-d # 删除密码
-l:锁定用户账户
-S:查看用户账户的状态(是否被锁定)
-u:解锁用户账户

非交互式设置密码
echo  ***** |  passwd  --stdin 用户    --stdin:从标准输入(比如管道)取密码



[root@localhost ~]# chpasswd < user.txt

[root@localhost ~]# cat user.txt
guest1:abc123
guest2:dfasdf
批量修改密码

userdel

userdel [-r] 用户名
添加 -r 选项,家目录/用户邮件也一并删除

组账户

唯一标识:GID(编号从0开始的编号,默认最大60000)
原则:Linux一个用户必须至少属于一个组
组账户的分类:
基本组:系统创建与用户同名,有且唯一
附加组(从属组):由管理员创建,由管理员进行加入。
附加组可有可无,且可以有多个

/etc/group 存放组用户
组名:组密码占位符:组的GID:组成员列表
/etc/gshadow 组管理信息

groupadd

groupadd  [选项] 组名
-g:指定新建工作组的gid


groupmod

groupmod [选项] 组名
-g GID:修改组 ID;
-n 新组名:修改组名;

groupdel

groupdel 组名
删除组账号:删除组的时候,不可以删除基本组

gpasswd

#修改组成员
gpasswd [选项]...用户,用户  组名
-a:添加组成员,每次只能加一个
-d: 删除组成员,每次只能删一个
-M:定义(重置)组成员用户列表,可设置多个

usermod -G 命令也可以将用户加入群组,但会产生一个问题,
即使用此命令将用户加入到新的群组后,该用户之前加入的那些群组都将被清空

用户账号的初始配置文件


~/.bash_profile 
用于用户级别的环境变量和启动程序配置
~/.bashrc
用于用户级别的交互式非登录shell的配置。
~/.bash_logout 
退出用户后 ,关机之前 会执行此文件里面的命令

/etc/profile
用于系统级别的环境变量和启动程序配置。

/etc/bashrc
用于系统级别的交互式非登录shell的配置。

修改/etc/profile文件中相关配置,切换bash或者用户后都需要source /etc/profile才生效;
修改/etc/bashrc文件中相关配置,切换bash或者用户后直接生效


你可以通过以下命令判断当前 Shell 的类型:
echo $0

-   如果输出以 `-` 开头(如 `-bash`),则是登录 Shell。
-   如果没有 `-`(如 `bash`),则是非登录 Shell。

vi编辑器

命令模式

移动光标
行内跳转
Home/0/^	 #跳到本行的行首。Home和0跳到真行首,^跳到第一个非空字符。End 键或$     #跳转到本行的行尾

行间跳转
nG        #n代表行号数字,直接跳转到n行   单独G文件末尾
M	      #跳转到当前显示页面的中间行
删除 复制 粘贴 撤销
删除
xdelete	#删除当前光标的字符
ndd     #删除行 单独dd 删除当前一行
d$      #删除当前光标到行尾
d^      #删除当前光标之前到行首     往前不包括当前光标处的字符
dw	    #删除当前光标处的单词

复制粘贴
nyy     #复制当前光标处向下的n行 单独y复制当前行
p       #粘贴到光标处下一行
P       #粘贴到光标处上一行

撤销
u       #只消除上一次可多次使用
U       #取消所有操作
ctrl+r  #撤销最近的撤销。



替换和查找
r	            #单独替换光标所在字符
R/shift+r        #替换字符序列
cw	       #替换一个单词


/字符	#向下查找
?字符    #向上查找



输入模式

o #在光标所在行的下面插入新的一行。光标停在空行首,等待输入文本
O #在光标所在行的上面插入新的一行。光标停在空行的行首,等待输入文本


A #行尾插入命令
I #在当前行输入文本


i #在光标前插入随后输入的文本

末行模式

.   	          #当前行
$ 		  #最后一行
$-1               #当前行到倒数第二行
替换

n,n s/old/new/g	  #到n行所有old改为new
% s/old/new/g	  #%代表全文,全文替换所有old改为new

查找替换中的分隔符/可替换为其它字符,如:#,@
复制和删除
n,n d             #删除n到n行
n,n y             #复制n到n行

:1,3 co 10	#将第1~3行复制粘贴到第10行下方(co表示copy)
:1,3 m 10	#将第1~3行剪切到第10行下方(m表示move)
设置
set nu (set nonu取消设置)加行号 不显示行号
set cul (set nocul 取消设置)#光标所在行有下划线(取消)
set ai     #对齐 回车后和上一行对齐