—
文件和目录权限
权限 | 对文件的影响 | 对目录的影响 |
r(读取) | 可读取文件内容 | 可列出目录内容 |
w(写入) | 可修改文件内容 | 可在目录中创建删除内容 |
x(执行) | 可作为命令执行 | 可访问目录内容 |
root@yaoyuan ~# ll -d /var/lib/drwxr-xr-x. 62 root root 4096 Jun 21 17:20 /var/lib/root@yaoyuan ~# ll -d /var/lib/mysqldrwxr-x--x. 7 mysql mysql 4096 Jul 19 14:30 /var/lib/mysqlroot@yaoyuan hr# ll /var/lib|grep ^d|wc 60 540 421root@yaoyuan hr# ll /var/lib/mysql|grep ^d|wc 5 45 285
d表示目录 62和7为该目录下子目录的数量
chmod
修改某个用户、组对文件夹的权限,用命令chmod实现,其中用户以augo代指,+、-、=代表加入、删除和等于对应权限,具体案例如下
取消用户对dir1目录的进入权限:chmod u-x dir1
授予同组用户对dir1目录的写权限:chmod g+w dir1
递归授予其他人对dir1目录的写权限:chmod -R o+w dir1
对所用户赋予文件的执行权限:chmod a+x testfile 常用于shell程序
Linux 系统还为每种权限(r、w 和 x)分配了对应的数字:
权限 | 数字 |
r | 4 |
w | 2 |
x | 1 |
如果我们要合并这些权限,就需要做简单的加法了:将对应的数字相加。假如我们要分配读、写权限,那么我们就要用 4+2,就等于 6。数字 6 表示具有读和写权限。以下是可能的组合形式:
权限 | 数字 | 计算 |
- - - | 0 | 0 + 0 + 0 |
r- - | 4 | 4 + 0 + 0 |
-w- | 2 | 0 + 2 + 0 |
- -x | 1 | 0 + 0 + 1 |
rw- | 6 | 4 + 2 + 0 |
-wx | 3 | 0 + 2 + 1 |
r-x | 5 | 4 + 0 + 1 |
rwx | 7 | 4 + 2 + 1 |
所以,对于访问权限的三组(所有者的权限、群组用户的权限、其他用户的权限),我们只要分别做加法就可以了,然后把三个和连起来。
例如,chmod 640 file1表示:
文件的所有者有读和写的权限;文件所在群组的其他用户具有读的权限;除此之外的其他用户没有任何权限。因此,我们可以给的最宽泛的权限就是 777:所有者,群组用户,其他用户都有读、写和运行的权限(chmod 777 filename)。这样,所有人就都可以对此文件“为所欲为”了。
注意:进入某个目录的前提是能进入它的上级的所有目录(这一点特别容易被忽略)
root@yaoyuan ~# chmod o-x /var/libroot@yaoyuan ~# ls -ld /var/libdrwxr-xr--. 62 root root 4096 Jun 21 17:20 /var/libroot@yaoyuan ~# service mysqld startRedirecting to /bin/systemctl start mysqld.serviceJob for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.root@yaoyuan ~# tail /var/log/mysqld.log ...2022-07-28T02:58:08.568048Z 0 [ERROR] [MY-010095] [Server] Failed to access directory for --secure-file-priv. Please make sure that directory exists and is accessible by MySQL Server. Supplied value : /var/lib/mysql-files2022-07-28T02:58:08.568288Z 0 [ERROR] [MY-010119] [Server] Abortingroot@yaoyuan ~# chmod o+x /var/libroot@yaoyuan ~# service mysqld startRedirecting to /bin/systemctl start mysqld.service
umask
通过使用 umask 默认权限来给所有新建的文件和目录赋予初始权限的。文件(或目录)的初始权限 = 文件(或目录)的最大默认权限 - umask权限 umask的默认值是0022,第 1 个数代表的是文件所具有的特殊权限,后面3位分别对应 3 种用户身份用户、组、其它。
对文件来讲,其可拥有的最大默认权限是 666,即 rw-rw-rw-,减去0022是644。对目录来讲,其可拥有的最大默认权限是 777,即 rwxrwxrwx,减去0022是755。
oracle@yaoyuan tmp$ umask0022oracle@yaoyuan tmp$ mkdir poracle@yaoyuan tmp$ touch aoracle@yaoyuan tmp$ ll -ld a p-rw-r--r--. 1 oracle oinstall 0 Jul 28 15:08 adrwxr-xr-x. 2 oracle oinstall 6 Jul 28 15:08 poracle@yaoyuan tmp$ umask -S 0002u=rwx,g=rwx,o=rxoracle@yaoyuan tmp$ touch boracle@yaoyuan tmp$ ll b-rw-rw-r--. 1 oracle oinstall 0 Jul 28 15:10 b
文件和目录的三种特殊权限
三个特殊的权限是:setuid、setgid和粘滞位
setuid的作用是让执行该命令的用户以该命令拥有者的权限去执行,比如普通用户执行passwd时(修改自己的密码)会拥有root的权限,这样就可以修改/etc/passwd这个文件了。它的标志为:s,会出现在x的地方,例:-rwsr-xr-x 。而setgid的意思和它是一样的,即让执行文件的用户以该文件所属组的权限去执行。
oracle@yaoyuan ~$ ll /usr/bin/passwd-rwsr-xr-x. 1 root root 27856 Nov 22 2019 /usr/bin/passwd
另外一个例子是oracle执行程序
oracle@yaoyuan ~$ ll $ORACLE_HOME/bin/oracle -h-rwsr-s--x. 1 oracle oinstall 421M Mar 20 11:11 /u01/app/oracle/product/19.3.0/db_1/bin/oracle
因此运行oracle程序都是oracle用户和oinstall组。
这三种特殊权限的设置方法
chmod u+s xxx # 设置setuid权限 chmod g+s xxx # 设置setgid权限 chmod o+t xxx # 设置stick bit权限,针对目录 chmod 4775 xxx # 设置setuid权限 chmod 2775 xxx # 设置setgid权限 chmod 1775 xxx # 设置stick bit权限,针对目录
粘滞位最常用是应用于路径。当路径被设置粘滞位后,路径下的文件只有文件的owner,路径的owner, 或者root 才能够重命名、删除文件。如果没有粘滞位,任何用户,不管是不是owner, 只要有路径的写/执行权限就可以重命名、删除文件。典型的应用就是/tmp路径,粘滞位可以阻止一般用户删除/重命名其他用户的文件
“o+t”、 “o-t”权限模式可分别用于添加、移除粘滞位权限。
设置了粘滞位权限的目录,使用ls命令查看其属性时,其他用户权限处的“x”将变为“t”。
oracle@yaoyuan tmp$ mkdir dir1oracle@yaoyuan tmp$ touch dir1/file1oracle@yaoyuan tmp$ chmod o+w dir1 # 对目录有写的权限删除可以成功[zhangsan@yuan tmp]$ rm dir1/file1 rm: remove write-protected regular empty file ‘dir1/file1’? y # 对dir1目录加上粘滞位oracle@yaoyuan tmp$ chmod o+t dir1oracle@yaoyuan tmp$ touch dir1/file1 # 有粘滞位后删除不能成功[zhangsan@yuan dir1]$ rm file1rm: remove write-protected regular empty file ‘file1’? yrm: cannot remove ‘file1’: Operation not permitted[zhangsan@yuan dir1]$ whoamizhangsan
02
—
切换用户
su
su 命令可以用来切换用户身份,除 root 外,其他用户切换身份时,需输入密码该命令的使用方式如下:
su [选项] user
su --help
没有user项默认为root。
-, -l, --login 像登录一样启动shell,配置环境变量。
sudo
sudo 命令用来以root的身份执行指令,该命令的使用方式如下:
sudo [选项] 命令
sudo用户的配置在/etc/sudoers文件中:
oracle ALL=(ALL) NOPASSWD:ALL
这一行的意思是oracle用户可以运行任何超级用户的命令,而且不需要输入密码。
以mysql用户运行这个命令。
oracle@yaoyuan ~$ sudo -u mysql lsls: cannot open directory .: Permission deniedoracle@yaoyuan ~$ sudo -u mysql ls /var/lib/mysql
sudo -i 切换到root,在Ubuntu和Debian上很有用。
02
—
登录信息
who查询当前谁登录。
whoami查询当前登录的信息,类似id。
oracle@yaoyuan ~$ whooracle pts/0 2022-07-28 15:22 (yao)oracle pts/1 2022-07-28 15:25 (yao)oracle@yaoyuan ~$ whoamioracle
last查询过去登录过的用户,信息保存在/var/log/wtmp :
oracle@yaoyuan ~$ last oracleoracle pts/1 yao Thu Jul 28 15:25 still logged in oracle pts/0 yao Thu Jul 28 15:22 still logged in oracle pts/2 yao Thu Jul 28 11:30 - 13:57 (02:26) oracle pts/0 yao Wed Jul 27 11:48 - 17:48 (06:00) oracle pts/2 yao Mon Jul 25 14:22 - 19:57 (05:34) oracle pts/0 yao Mon Jul 25 14:07 - 19:57 (05:49) oracle pts/2 ubuntu-route Sun Jul 24 09:32 - 13:31 (03:59) oracle pts/0 ubuntu-route Sun Jul 24 09:29 - 13:31 (04:01)
不接用户显示所有用户的登录信息,reboot是个伪用户,显示系统启动的动作。