2023-05-27    2023-12-26    5501 字  11 分钟

权限概述

什么是Linux权限

Linux系统中,权限是控制用户对文件或目录进行访问的一种机制。这种权限定义了谁可以访问文件,以及他们可以做什么。

为什么要有权限

保护文件和目录:通过权限设置,可以保护系统的文件和目录不被未授权的用户访问或修改,从而确保系统安全。

防止误操作:对于一些敏感的文件或目录,通过设置权限,可以防止误删除或误修改,从而避免意外情况的发生。

如何查看权限

Linux系统中,针对文件定义了三种身份,分别是属主(owner)、属组(group)、其他人(others),每一种身份又对应三种权限,分别是可读(readable)、可写(writable)、可执行(excutable)。

1
2
[root@localhost ~]# ll
drwxrwxrwx. 2 root root       16 Aug  6 19:52 test

详细权限

用户对文件资源,有三种角色ugo,当一个用户访问文件流程如下:

  1. 判断用户是否为文件所有者,如果是则按所有者的权限进行访问。
  2. 判断用户是否为文件所有组成员,如果是则按组的权限进行访问。
  3. 如果不是所有者,也不是该文件所属组,则按匿名权限进行访问。

权限中rwx的含义

字母 含义 对应权限
r(read) 读取权限 4
w(write) 写入权限 2
x(execute) 执行权限 1
-(占位符) 没有权限 0

权限设置

chmod命令

chmod命令用于改变文件或目录的权限,可以使用数字或符号模式来指定权限。

数字模式:数字模式使用三位数字来表示所有者、组和其他用户的权限,每位数字的范围是07。通过数字模式对file.txt权限进行变更。

1
2
3
4
5
root@localhost ~]# ll file.txt
-rw-r--r-- 1 root root 0 Dec 18 07:52 file.txt
[root@localhost ~]# chmod 640 file.txt
[root@localhost ~]# ll file.txt
-rw-r----- 1 root root 0 Dec 18 07:52 file.txt

符号模式:符号模式使用字母rwx来表示读、写和执行权限。通过符号模式,恢复file.txt的权限。

1
2
3
4
5
[root@localhost ~]# ll file.txt
-rw-r----- 1 root root 0 Dec 18 07:52 file.txt
[root@localhost ~]# chmod u=rw,g=r,o=r file.txt
[root@localhost ~]# ll file.txt
-rw-r--r-- 1 root root 0 Dec 18 07:52 file.txt

符号模式还可以使用+来添加权限,-来移除权限。

1
2
3
4
5
6
7
8
[root@localhost ~]# ll file.txt
-rw-r--r-- 1 root root 0 Dec 18 07:52 file.txt
[root@localhost ~]# chmod a+x file.txt
[root@localhost ~]# ll file.txt
-rwxr-xr-x 1 root root 0 Dec 18 07:52 file.txt
[root@localhost ~]# chmod o-x file.txt
[root@localhost ~]# ll file.txt
-rwxr-xr-- 1 root root 0 Dec 18 07:52 file.txt

chmod常用的选项有-R,表示递归地改变文件或目录的权限。

1
2
3
4
5
6
7
8
9
[root@localhost ~]# mkdir -p testdir/dir1
[root@localhost ~]# touch testdir/file
# 递归修改文件权限
[root@localhost ~]# chmod -R 700 testdir/
# 验证权限
[root@localhost ~]# ll testdir/
total 0
drwx------ 2 root root 6 Dec 19 23:09 dir1
-rwx------ 1 root root 0 Dec 19 23:09 file

权限验证

Linux中权限对文件和对目录的影响是有不同区别的,取别如下表:

权限 对文件的影响 对目录的影响
r 具有读取文件内容权限。 具有浏览目录及子目录的权限。
w 具有修改文件内容的权限。 具有增加和删除目录内文件权限。
x 具有执行文件的权限。 具有进入目录的权限。

文件权限验证

准备一个普通用户和一个文件。文件不要放到用户家目录中。

1
2
3
4
5
6
7
[root@localhost ~]# id snoopy
uid=5106(snoopy) gid=5107(snoopy) groups=5107(snoopy)

[root@localhost ~]# touch /opt/file.txt
[root@localhost ~]# echo "date" > /opt/file.txt
[root@localhost ~]# ll /opt/file.txt
-rw-r--r-- 1 root root 10 Dec 18 08:08 /opt/file.txt

r 权限: 切换到普通用户,当用户对文件只有r的权限时,用户仅能查看文件,无法对文件进行修改、复制、删除等更多的操作。 可用的命令有:catmorelessheadtail

[snoopy@localhost opt]$ ll file.txt
-rw-r--r-- 1 root root 10 Dec 18 08:08 file.txt
[snoopy@localhost opt]$ cat file.txt
date

w 权限:可以对文件进行写入操作,但是不能查看或者进行其他操作。

1
2
3
4
5
6
[snoopy@localhost opt]$ ll file.txt
-rw-r---w- 1 root root 10 Dec 18 08:08 file.txt
# 仅可做写入操作。
[snoopy@localhost opt]$ echo "date" >> file.txt
[snoopy@localhost opt]$ cat file.txt
cat: file.txt: Permission denied

x 权限:普通用户执行x权限时,同时需要具有r权限,否则不能执行成功。

1
2
3
4
[snoopy@localhost opt]$ ll file.txt
-rw-r----x 1 root root 5 Dec 18 08:13 file.txt
[snoopy@localhost opt]$ ./file.txt
bash: ./file.txt: Permission denied

rw 权限:可对文件进行读写,但是不能进行执行、复制、移动、删除等操作。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
[snoopy@localhost opt]$ ll file.txt
-rw-r--rw- 1 root root 5 Dec 18 08:13 file.txt
# 可编辑查看文件。
[snoopy@localhost opt]$ vim file.txt
[snoopy@localhost opt]$ cat file.txt
date
date
date
# 不可执行文件或操作文件。
[snoopy@localhost opt]$ ./file.txt
-bash: ./file.txt: Permission denied
[snoopy@localhost opt]$ cp file.txt file.txt.bak
cp: cannot create regular file ‘file.txt.bak’: Permission denied

rx 权限:可进行查看和执行操作,但是不能编辑、移动、删除等。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
[snoopy@localhost opt]$ ll file.txt
-rw-r--r-x 1 root root 15 Dec 18 08:44 file.txt
# 可以查看或执行文件
[snoopy@localhost opt]$ cat file.txt
date
date
date
[snoopy@localhost opt]$ ./file.txt
Mon Dec 18 08:47:51 CST 2023
Mon Dec 18 08:47:51 CST 2023
Mon Dec 18 08:47:51 CST 2023
# 不能编辑文件
[snoopy@localhost opt]$ echo "hello" > file.txt
-bash: file.txt: Permission denied
# 不能操作文件
[snoopy@localhost opt]$ cp file.txt file.txt.bak
cp: cannot create regular file ‘file.txt.bak’: Permission denied
[snoopy@localhost opt]$ rm -f file.txt
rm: cannot remove ‘file.txt’: Permission denied

rwx 权限:能查看、编辑、执行文件,但是不能对文件进行删除、移动、复制等操作。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
[snoopy@localhost opt]$ ll file.txt
-rw-r--rwx 1 root root 15 Dec 18 08:44 file.txt
# 可以编辑或执行文件
[snoopy@localhost opt]$ vim file.txt
[snoopy@localhost opt]$ ./file.txt
Mon Dec 18 08:59:24 CST 2023
Mon Dec 18 08:59:24 CST 2023
Mon Dec 18 08:59:24 CST 2023
# 不能对文件删除复制等
[snoopy@localhost opt]$ cp file.txt file.txt.bak
cp: cannot create regular file ‘file.txt.bak’: Permission denied
[snoopy@localhost opt]$ rm -f file.txt
rm: cannot remove ‘file.txt’: Permission denied

目录权限验证

r 权限:具有浏览目录的权限,无法进入目录。使用ls 查看目录下的文件会报错,但会显示文件名称,如果使用 ls -l 只能看到文件名称,其他的全部无法查看。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[snoopy@localhost /]$ ll -d /opt
drwxr-xr--. 2 root root 22 Dec 18 08:07 /opt
# 可以查看目录内容。
[snoopy@localhost /]$ ls /opt/
ls: cannot access /opt/file.txt: Permission denied
file.txt
[snoopy@localhost /]$ ls -l /opt/
ls: cannot access /opt/file.txt: Permission denied
total 0
-????????? ? ? ? ?            ? file.txt
# 不能做其他操作。
[snoopy@localhost /]$ cd /opt/
-bash: cd: /opt/: Permission denied
[snoopy@localhost /]$ rm -rf /opt/
rm: cannot remove ‘/opt/file.txt’: Permission denied

w 权限:单独的w权限不能进行任何操作。

1
2
3
4
5
6
7
8
9
[snoopy@localhost /]$ ll -d /opt/
drwxr-x-w-. 2 root root 22 Dec 18 08:07 /opt/
# 不能做任何操作。
[snoopy@localhost /]$ cd /opt/
-bash: cd: /opt/: Permission denied
[snoopy@localhost /]$ ls /opt/
ls: cannot open directory /opt/: Permission denied
[snoopy@localhost /]$ mv /opt/file.txt /opt/file.txt.bak
mv: failed to access ‘/opt/file.txt.bak’: Permission denied

x 权限:可以进入目录,不能操作其他东西。

1
2
3
4
5
6
7
8
9
[snoopy@localhost /]$ ll -d /opt/
drwxr-x--x. 2 root root 22 Dec 18 08:07 /opt/
# 可以进入目录。
[snoopy@localhost /]$ cd /opt/
# 不能查看目录内容或操作文件。
[snoopy@localhost opt]$ ls
ls: cannot open directory .: Permission denied
[snoopy@localhost opt]$ rm -f file.txt
rm: cannot remove ‘file.txt’: Permission denied

rx 权限:能进入目录,能查看目录下的文件。至于操作文件,需要看文件本身的权限。不能进行新建文件、目录等操作。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[snoopy@localhost /]$ ll -d /opt/
drwxr-xr-x. 2 root root 22 Dec 18 08:07 /opt/
# 可以进入目录并查看文件列表。
[snoopy@localhost /]$ cd /opt/
[snoopy@localhost opt]$ ll
total 4
-rw-r--rwx 1 root root 10 Dec 18 08:59 file.txt
# 不能新建文件或目录
[snoopy@localhost opt]$ touch file1.txt
touch: cannot touch ‘file1.txt’: Permission denied
[snoopy@localhost opt]$ mkdir test
mkdir: cannot create directory ‘test’: Permission denied

rw 权限:只能查看目录内文件列表。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[snoopy@localhost /]$ ll -d /opt/
drwxr-xrw-. 2 root root 22 Dec 18 08:07 /opt/
# 可以查看目录内文件列表。
[snoopy@localhost /]$ ll /opt/
ls: cannot access /opt/file.txt: Permission denied
total 0
-????????? ? ? ? ?            ? file.txt
# 不能进入目录或操作文件。
[snoopy@localhost /]$ cd /opt/
-bash: cd: /opt/: Permission denied
[snoopy@localhost /]$ touch /opt/file1.txt
touch: cannot touch ‘/opt/file1.txt’: Permission denied

rwx 权限:如果目录赋予了w权限,则该目录下的文件可以复制、删除、移动、修改。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
[snoopy@localhost /]$ ll -d /opt/
drwxr-xrwx. 2 root root 22 Dec 18 08:07 /opt/
[snoopy@localhost /]$ ll /opt/file.txt
-rw-r----- 1 root root 10 Dec 18 08:59 /opt/file.txt
# 可以进入目录并修改文件。
[snoopy@localhost /]$ cd /opt/
[snoopy@localhost opt]$ echo "date" > file.txt
[snoopy@localhost opt]$ cat file.txt
date
# 可以复制或删除文件
[snoopy@localhost opt]$ cp file.txt file.txt.bak
[snoopy@localhost opt]$ rm file.txt
[snoopy@localhost opt]$ ls
file.txt.bak

文件最多使用的是rw权限和rx权限(文件的权限通常会设置为644)。

目录最多使用的是rx权限(目录的权限通常会设置为755)。

chown命令

chown可用于更改文件或目录的属主及属组。

选项 解释
-R 递归修改。

修改file.txt的属主为snoopy

1
2
3
4
5
6
[root@localhost opt]# ll file.txt
-rw-r--r-- 1 root root 0 Dec 19 22:58 file.txt

root@localhost opt]# chown snoopy file.txt
[root@localhost opt]# ll file.txt
-rw-r--r-- 1 snoopy root 0 Dec 19 22:58 file.txt

修改file.txt的属组为snoopy

1
2
3
[root@localhost opt]# chown .snoopy file.txt
[root@localhost opt]# ll file.txt
-rw-r--r-- 1 snoopy snoopy 0 Dec 19 22:58 file.txt

递归修改目录及目录下所有文件的属主和属组为snoopy

1
2
3
4
5
[root@localhost opt]# mkdir testdir
[root@localhost opt]# touch testdir/test1
[root@localhost opt]# touch testdir/test2

[root@localhost opt]# chown -R snoopy.snoopy testdir/

特殊权限

SUID

在学习SUID之前,我们先要了解一个重要的概念。

进程能够以何种形式访问文件,取决于运行这个进程的用户对这个文件有没有相应的权限。

比如:需要使用vim修改/opt/file.txt,要看运行vim这条命令的人对/opt/file.txt用怎么样的权限。

认识SUID

SUIDSet UID)是Linux中的一种特殊权限,无论谁运行具有suid权限的二进制文件的时候,都可以使得调用者暂时获得该文件"属主"的权限。只有可执行文件才能设定SUID权限,对目录设定SUID,是无效的。

我们知道在Linux中,每个用户可以通过passwd命令更改自己的密码。密码存放的位置为/etc/shadow。我们可以查看一下/etc/shadow的权限。

1
2
[root@localhost ~]# ll /etc/shadow
---------- 1 root root 14217 Dec 11 01:36 /etc/shadow

通过上结果,我们可以知道任何人对/etc/shawow都是没有任何权限的。当然root除外,因为rootLinux系统中有着最高的权限。

我们是通过passwd这个命令来修改密码的,我们可以查看一下passwd这个命令的权限。

1
2
[root@localhost ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27856 Apr  1  2020 /usr/bin/passwd

我们发现属主的权限中有个s(若原先权限为为空的话,会显示S),这就是SUID,这表示当任何人想要执行passwd这条命令时,都会以该命令的属主身份运行该命令。

使用普通用户snoopy执行passwd修改密码。

1
2
3
4
[snoopy@localhost ~]$ passwd
Changing password for user snoopy.
Changing password for snoopy.
(current) UNIX password:

我们发现其实是以root的身份在运行这条命令,这就是SUID的作用。

1
2
3
[root@localhost ~]# ps -ef | grep passwd
root       1329   1306  0 00:01 pts/0    00:00:00 passwd
root       1365   1334  0 00:01 pts/1    00:00:00 grep --color=auto passwd

设置SUID

数字模式:可通过chmod 4XXX filename 对文件设置SUID权限。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[root@localhost ~]# ll /usr/bin/cat
-rwxr-xr-x. 1 root root 54080 Aug 20  2019 /usr/bin/cat
# 对文件设置suid
[root@localhost ~]# chmod 4755 /usr/bin/cat
[root@localhost ~]# ll /usr/bin/cat
-rwsr-xr-x. 1 root root 54080 Aug 20  2019 /usr/bin/cat
# 取消suid设置
[root@localhost ~]# chmod 755 /usr/bin/cat
[root@localhost ~]# ll /usr/bin/cat
-rwxr-xr-x. 1 root root 54080 Aug 20  2019 /usr/bin/cat

符号模式:可通过chmod u+s filenamechmod u-s filename 变更文件的SUID

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[root@localhost ~]# ll /usr/bin/cat
-rwxr-xr-x. 1 root root 54080 Aug 20  2019 /usr/bin/cat
# 对文件设置suid
[root@localhost ~]# chmod u+s /usr/bin/cat
[root@localhost ~]# ll /usr/bin/cat
-rwsr-xr-x. 1 root root 54080 Aug 20  2019 /usr/bin/cat
# 取消suid设置
[root@localhost ~]# chmod u-s /usr/bin/cat
[root@localhost ~]# ll /usr/bin/cat
-rwxr-xr-x. 1 root root 54080 Aug 20  2019 /usr/bin/cat

SGID

认识SGID

将目录设置为SGIDSet Group ID)权限后,如果在该目录下创建文件,都将与该目录的所属组保持一致。

设置SGID

创建用户和组。

1
2
3
[root@localhost opt]# groupadd devops
[root@localhost opt]# useradd zhangsan -G devops
[root@localhost opt]# useradd lisi -G devops

/opt目录下创建一个share目录,并赋予777权限,使用zhangsanlisi用户在这个目录下创建文件,并观察其权限。

1
2
[root@localhost opt]# mkdir share
[root@localhost opt]# chmod 777 share/

可通过chmod 2XXX dirname 对目录设置SGID权限。

1
2
3
4
5
6
[root@localhost opt]# chown .devops share/
[root@localhost opt]# chmod 2777 share
# 也可通过符号模式设置sgid,命令为:
# chmod g+s share/
[root@localhost opt]# ll -d share/
drwxrwsrwx 2 root devops 17 Dec 22 01:01 share/

切换用户在share中创建文件,就会拥有share属组的权限。

1
2
[zhangsan@localhost share]$ ll zs1.txt
-rw-rw-r-- 1 zhangsan devops 0 Dec 22 03:17 zs1.txt

这时候,我们发现 zs1.txt的属组已经变成了devops

SBIT

认识SBIT

SBITSticky Bit)也叫粘滞位,它仅对目录有效,一旦目录设定了SBIT权限,用户在此目录下创建的文件或目录,就只有自己和root才有权利修改或删除该文件。

设置SBIT

可通过chmod 1XXX dirname 对文件设置SBIT权限。

share目录设置粘滞位。

1
2
3
4
5
6
7
[root@localhost opt]# ll -d share/
drwxrwxrwx 2 root devops 49 Dec 22 03:20 share/
[root@localhost opt]# chmod 1777 share/
# 也可通过符号模式设置sbit,命令为:
# chmod o+t share/
[root@localhost opt]# ll -d  share/
drwxrwxrwt 2 root devops 49 Dec 22 03:20 share/

zhangsan在该目录下创建文件。

1
2
3
[zhangsan@localhost share]$ touch z1.txt
[zhangsan@localhost share]$ ll z1.txt
-rw-rw-r-- 1 zhangsan zhangsan 0 Dec 22 04:04 z1.txt

lisi用户虽然对目录share有足够的权限,但是仍然无法删除z1.txt

1
2
[lisi@localhost share]$ rm -f z1.txt
rm: cannot remove ‘z1.txt’: Operationz not permittedlisi

取消粘滞位后,test用户可以删除z1.txt

1
2
3
4
5
[root@localhost opt]# chmod o-t share/
[root@localhost opt]# ll -d share/
drwxrwxrwx 2 root devops 63 Dec 22 04:04 share/
# 使用lisi用户删除文件
[lisi@localhost share]$ rm -f z1.txt

隐藏属性

Linux系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限。

既然叫隐藏权限,那么使用常规的ls命令肯定不能看到它的真面目。隐藏权限的专用的命令有chattrlsattr

chattr命令

只有root 用户可以使用,用于修改文件系统的隐藏属性,此权限凌驾于rwx基础权限之上。

常用的选项如下表:

选项 解释
i 锁定文问,任何人无法对文件进行操作。
a 无法写入和删除文件,可追加文件内容。

lsattr命令

用于查看文件的特殊属性。

锁定文件

当文件被+i后,包括root在内的所有用户无法对文件进行操作。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
[root@localhost opt]# touch snoopy.txt
[root@localhost opt]# lsattr snoopy.txt
---------------- snoopy.txt
[root@localhost opt]# chattr +i snoopy.txt
[root@localhost opt]# lsattr snoopy.txt
----i----------- snoopy.txt
# 加了i属性后,文件不可被删除。
[root@localhost opt]# rm -f snoopy.txt
rm: cannot remove ‘snoopy.txt’: Operation not permitted
# 文件不可被修改。
[root@localhost opt]# echo "hello" >> snoopy.txt
-bash: snoopy.txt: Permission denied
# 取消i属性。
[root@localhost opt]# chattr -i snoopy.txt
[root@localhost opt]# lsattr snoopy.txt
---------------- snoopy.txt

限制文件仅可追加内容

文件使用了+a选项后,仅可追加文件内容,不可进行其他任何操作。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
[root@localhost opt]# chattr +a snoopy.txt
[root@localhost opt]# lsattr snoopy.txt
-----a---------- snoopy.txt
# 加了a属性后,文件不可被删除。
[root@localhost opt]# rm -f snoopy.txt
rm: cannot remove ‘snoopy.txt’: Operation not permitted
# 文件仍可追加新内容。
[root@localhost opt]# echo "hello" >> snoopy.txt
[root@localhost opt]# echo "My Name is Snoopy" >> snoopy.txt
[root@localhost opt]# cat snoopy.txt
hello
My Name is Snoopy
# 取消a属性。
[root@localhost opt]# chattr -a snoopy.txt
[root@localhost opt]# lsattr snoopy.txt
---------------- snoopy.txt

掩码umask

什么是umask

我们知道当我们创建目录或文件时,系统会分配一个默认权限,目录默认权限为755,文件默认权限为644。这些默认权限就是通过umask实现的。

通过umask命令可查看当前登陆用户的掩码。

1
2
[root@localhost ~]# umask 
0022

创建文件的默认权限为666-umask

创建目录的默认权限为777-umask

umask的应用

默认权限

Linux/etc/bashrc中定义了umask的值。

1
2
3
4
5
6
[root@localhost ~]# grep -A 4 "UID" /etc/bashrc
    if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
       umask 002
    else
       umask 022
    fi

用户也可以通过umask命令临时设置umask的值。

1
2
3
[root@localhost ~]# umask 002
[root@localhost ~]# umask 
0002

创建文件时,默认权限为奇数的,要通过+1变成偶数。创建目录不受影响。

1
2
3
4
5
6
7
8
9
[zhangsan@localhost opt]$ umask 045
[zhangsan@localhost opt]$ mkdir umask_dir
# 777-045=732 所以umask_dir权限为732。
[zhangsan@localhost opt]$ ll -d umask_dir/
drwx-wx-w- 2 zhangsan zhangsan 6 Dec 22 05:35 umask_dir/
[zhangsan@localhost opt]$ touch umask_file
# 666-045=621,创建文件时,遇到奇数要+1,所以最终权限为622。
[zhangsan@localhost opt]$ ll umask_file
-rw--w--w- 1 zhangsan zhangsan 0 Dec 22 05:35 umask_file

再来看一组案例。

1
2
3
4
5
6
7
8
9
[zhangsan@localhost opt]$ umask 035
[zhangsan@localhost opt]$ mkdir umask_dir_1/
# 777-035=742 所以umask_dir权限为742。
[zhangsan@localhost opt]$ ll -d umask_dir_1/
drwxr---w- 2 zhangsan zhangsan 6 Dec 22 05:42 umask_dir_1/
[zhangsan@localhost opt]$ touch umask_file_1
# 666-035=631,创建文件时,遇到奇数要+1,所以最终权限为642。
[zhangsan@localhost opt]$ ll umask_file_1
-rw-r---w- 1 zhangsan zhangsan 0 Dec 22 05:42 umask_file_1

用户家目录权限

用户家目录的umask可以通过/etc/login.defs指定。

1
2
3
4
[root@localhost ~]# grep "UMASK" /etc/login.defs
UMASK           077
[root@localhost ~]# ll -d /home/snoopy
drwx------ 2 snoopy snoopy 99 Dec 22 01:06 /home/snoopy

image-20231028232834657