
linux知识小点总结

内核
系统内存管理
软件程序管理
硬件设备管理
文件系统管理
acl权限
ACL权限控制为白名单授权机制,即允许用户或角色对指定对象执行指定操作。ACL权限控制方式简单明了,可实现精准授权。
Linux 系统传统的权限控制方式,无非是利用 3 种身份(文件所有者,所属群组,其他用户),并分别搭配 3 种权限(读 r,写 w,访问 x)。比如,我们可以通过 ls -l 命令查看当前目录中所有文件的详细信息,其中就包含对各文件的权限设置: [root@localhost ~]# ls -l total 36 drwxr-xr-x. 2 root root 4096 Apr 15 16:33 Desktop drwxr-xr-x. 2 root root 4096 Apr 15 16:33 Documents … -rwxr-xr-x. 2 root root 4096 Apr 15 16:33 post-install … 以上输出信息中,“rwxr-xr-x”就指明了不同用户访问文件的权限,即文件所有者拥有对文件的读、写、访问权限(rwx),文件所属群组拥有对文件的读、访问权限(r-x),其他用户拥有对文件的读、访问权限(r-x)。 权限前的字符,表示文件的具体类型,比如 d 表示目录,- 表示普通文件,l 表示连接文件,b 表示设备文件,等等。 但在实际应用中,以上这 3 种身份根本不够用,给大家举个例子。 ACL控制权限
图 1 ACL 访问控制权限 图 1 的根目录中有一个 /project 目录,这是班级的项目目录。班级中的每个学员都可以访问和修改这个目录,老师需要拥有对该目录的最高权限,其他班级的学员当然不能访问这个目录。 需要怎么规划这个目录的权限呢?应该这样,老师使用 root 用户,作为这个目录的属主,权限为 rwx;班级所有的学员都加入 tgroup 组,使 tgroup 组作为 /project 目录的属组,权限是 rwx;其他人的权限设定为 0(也就是 —)。这样一来,访问此目录的权限就符合我们的要求了。 有一天,班里来了一位试听的学员 st,她必须能够访问 /project 目录,所以必须对这个目录拥有 r 和 x 权限;但是她又没有学习过以前的课程,所以不能赋予她 w 权限,怕她改错了目录中的内容,所以学员 st 的权限就是 r-x。可是如何分配她的身份呢?变为属主?当然不行,要不 root 该放哪里?加入 tgroup 组?也不行,因为 tgroup 组的权限是 rwx,而我们要求学员 st 的权限是 r-x。如果把其他人的权限改为 r-x 呢?这样一来,其他班级的所有学员都可以访问 /project 目录了。 显然,普通权限的三种身份不够用了,无法实现对某个单独的用户设定访问权限,这种情况下,就需要使用 ACL 访问控制权限。 ACL,是 Access Control List(访问控制列表)的缩写,在 Linux 系统中, ACL 可实现对单一用户设定访问文件的权限。也可以这么说,设定文件的访问权限,除了用传统方式(3 种身份搭配 3 种权限),还可以使用 ACL 进行设定。拿本例中的 st 学员来说,既然赋予它传统的 3 种身份,无法解决问题,就可以考虑使用 ACL 权限控制的方式,直接对 st 用户设定访问文件的 r-x 权限。
dd 命令虚拟文件
复制文件并对原文件的内容进行转换和格式化处理
补充说明 dd命令 用于复制文件并对原文件的内容进行转换和格式化处理。dd命令功能很强大的,对于一些比较底层的问题,使用dd命令往往可以得到出人意料的效果。用的比较多的还是用dd来备份裸设备。但是不推荐,如果需要备份oracle裸设备,可以使用rman备份,或使用第三方软件备份,使用dd的话,管理起来不太方便。
建议在有需要的时候使用dd 对物理磁盘操作,如果是文件系统的话还是使用tar backup cpio等其他命令更加方便。另外,使用dd对磁盘操作时,最好使用块设备文件。
语法 dd(选项) 选项 bs=<字节数>:将ibs(输入)与obs(输出)设成指定的字节数; cbs=<字节数>:转换时,每次只转换指定的字节数; conv=<关键字>:指定文件转换的方式; count=<区块数>:仅读取指定的区块数; ibs=<字节数>:每次读取的字节数; obs=<字节数>:每次输出的字节数; of=<文件>:输出到文件; seek=<区块数>:一开始输出时,跳过指定的区块数; skip=<区块数>:一开始读取时,跳过指定的区块数; –help:帮助; –version:显示版本信息。 实例 [root@localhost text]# dd if=/dev/zero of=sun.txt bs=1M count=1 1+0 records in 1+0 records out 1048576 bytes (1.0 MB) copied, 0.006107 seconds, 172 MB/s
[root@localhost text]# du -sh sun.txt 1.1M sun.txt 该命令创建了一个1M大小的文件sun.txt,其中参数解释:
if 代表输入文件。如果不指定if,默认就会从stdin中读取输入。 of 代表输出文件。如果不指定of,默认就会将stdout作为默认输出。 bs 代表字节为单位的块大小。 count 代表被复制的块数。 /dev/zero 是一个字符设备,会不断返回0值字节(\0)。 块大小可以使用的计量单位表
单元大小 代码 字节(1B) c 字节(2B) w 块(512B) b 千字节(1024B) k 兆字节(1024KB) M 吉字节(1024MB) G 以上命令可以看出dd命令来测试内存操作速度:
1048576 bytes (1.0 MB) copied, 0.006107 seconds, 172 MB/s 生成随机字符串
我们甚至可以使用 /dev/urandom 设备配合 dd 命令 来获取随机字符串。
[root@localhost ~]# dd if=/dev/urandom bs=1 count=15|base64 -w 0 15+0 records in 15+0 records out 15 bytes (15 B) copied, 0.000111993 s, 134 kB/s wFRAnlkXeBXmWs1MyGEs
shell脚本调试
1 | { set -x |
L3NoYXJlL2hvbWUvamhhZG1pbg,L2FwcHMveHVnb25nNC9hcHBmb3JtL2RhdGEvc3Bvb2xlci9qaGFkbWluLw,L2FwcHMveHVnb25nNC9hcHBmb3JtL2RhdGEvc2hhcmUvamhhZG1pbg,L2FwcHMveHVnb25nNC9hcHBmb3JtL2RhdGEvbWVldGluZy9kYXRhL2poYWRtaW4
“browse”, “edit”, “open”, “runas”, “jsub”, “reload”,
“home”, “up”, “back”, “forward”, “getfile”, “download”, “downloadApply”, “rm”, “rename”, “mkdir”,
“upload”, “copy”, “cut”, “paste”, “extract”, “archive”, “search”, “info”, “view”, “backup”, “restore”,
“difference”, “openDir”, “sendData”, “createShareGroup”, “delShareGroup”, “updateGroupMember”, “markSecret”,
“startAppInThePath”, “downloadApply”, “fileCompressManager”] : [“open”, “runas”, “jsub”, “reload”, “home”,
“up”, “back”, “forward”, “getfile”, “download”, “rm”, “rename”, “mkdir”, “upload”, “copy”, “cut”, “paste”,
“extract”, “archive”, “search”, “info”, “view”, “sort”, “openDir”, “sendData”, “createShareGroup”, “delShareGroup”,
“updateGroupMember”, “markSecret”, “startAppInThePath”, “downloadApply”, “fileCompressManager”
查看端口状态
1 | ## netstat |

1 | lsof -i:8080:查看8080端口占用 |
应用层 http ssh
传输层 tcp udp
网络层 ip
linxu后台启动任务
nohup /usr/local/bin/cpolar start-all -config=/usr/local/etc/cpolar/cpolar.yml > test.log 2>&1 &
进入要运行的py文件目录
nohup python -u test.py > test.log 2>&1 &
nohup与前台后台操作_nohup 怎么唤回_菜梨子不想这么菜!的博客-CSDN博客

Start-Process -WindowStyle hidden -FilePath .\ddns-go.exe install
spring在其他地方手动获取request对象
1 | ((ServletRequestAttributes) (RequestContextHolder.getRequestAttributes())).getRequest() |
setfacl
设置文件访问控制列表
补充说明
setfacl命令 是用来在命令行里设置ACL(访问控制列表)。在命令行里,一系列的命令跟随以一系列的文件名。
选项
1 | -b,--remove-all:删除所有扩展的acl规则,基本的acl规则(所有者,群组,其他)将被保留。 |
- 选项
-m和-x后边跟以acl规则。多条acl规则以逗号(,)隔开。选项-M和-X用来从文件或标准输入读取acl规则。 - 选项
--set和--set-file用来设置文件或目录的acl规则,先前的设定将被覆盖。 - 选项
-m(--modify)和-M(--modify-file)选项修改文件或目录的acl规则。 - 选项
-x(--remove)和-X(--remove-file)选项删除acl规则。
当使用-M,-X选项从文件中读取规则时,setfacl接受getfacl命令输出的格式。每行至少一条规则,以#开始的行将被视为注释。
当在不支持ACLs的文件系统上使用setfacl命令时,setfacl将修改文件权限位。如果acl规则并不完全匹配文件权限位,setfacl将会修改文件权限位使其尽可能的反应acl规则,并会向standard error发送错误消息,以大于0的状态返回。
权限
文件的所有者以及有CAP_FOWNER的用户进程可以设置一个文件的acl。(在目前的linux系统上,root用户是唯一有CAP_FOWNER能力的用户)
ACL规则
setfacl命令可以识别以下的规则格式:
1 | [d[efault]:] [u[ser]:]uid [:perms] 指定用户的权限,文件所有者的权限(如果uid没有指定)。 |
恰当的acl规则被用在修改和设定的操作中,对于uid和gid,可以指定一个数字,也可指定一个名字。perms域是一个代表各种权限的字母的组合:读-r写-w执行-x,执行只适合目录和一些可执行的文件。pers域也可设置为八进制格式。
自动创建的规则
最初的,文件目录仅包含3个基本的acl规则。为了使规则能正常执行,需要满足以下规则。
3个基本规则不能被删除。
任何一条包含指定的用户名或群组名的规则必须包含有效的权限组合。
任何一条包含缺省规则的规则在使用时,缺省规则必须存在。
ACL的名词定义*
先来看看在ACL里面每一个名词的定义,这些名词我大多从man page上摘下来虽然有些枯燥,但是对于理解下面的内容还是很有帮助的。
ACL是由一系列的Access Entry所组成的,每一条Access Entry定义了特定的类别可以对文件拥有的操作权限。Access Entry有三个组成部分:Entry tag type, qualifier (optional), permission。
我们先来看一下最重要的Entry tag type,它有以下几个类型:
1 | ACL_USER_OBJ:相当于Linux里file_owner的permission |
让我们来据个例子说明一下,下面我们就用getfacl命令来查看一个定义好了的ACL文件:
1 | [root@localhost ~]# getfacl ./test.txt |
前面三个以#开头的定义了文件名,file owner和group。这些信息没有太大的作用,接下来我们可以用--omit-header来省略掉。
1 | user::rw- 定义了ACL_USER_OBJ, 说明file owner拥有read and write permission |
从这里我们就可以看出ACL提供了我们可以定义特定用户和用户组的功能,那么接下来我们就来看一下如何设置一个文件的ACL:
如何设置ACL文件
首先我们还是要讲一下设置ACL文件的格式,从上面的例子中我们可以看到每一个Access Entry都是由三个被:号分隔开的字段所组成,第一个就是Entry tag type。
1 | user 对应了ACL_USER_OBJ和ACL_USER |
第二个字段称之为qualifier,也就是上面例子中的john和dev组,它定义了特定用户和拥护组对于文件的权限。这里我们也可以发现只有user和group才有qualifier,其他的都为空。第三个字段就是我们熟悉的permission了。它和Linux的permission一样定义,这里就不多讲了。
下面我们就来看一下怎么设置test.txt这个文件的ACL让它来达到我们上面的要求。
一开始文件没有ACL的额外属性:
1 | [root@localhost ~]# ls -l |
我们先让用户john拥有对test.txt文件的读写权限:
1 | [root@localhost ~]# setfacl -m user:john:rw- ./test.txt |
这时我们就可以看到john用户在ACL里面已经拥有了对文件的读写权。这个时候如果我们查看一下linux的permission我们还会发现一个不一样的地方。
1 | [root@localhost ~]# ls -l ./test.txt |
在文件permission的最后多了一个+号,当任何一个文件拥有了ACL_USER或者ACL_GROUP的值以后我们就可以称它为ACL文件,这个+号就是用来提示我们的。我们还可以发现当一个文件拥有了ACL_USER或者ACL_GROUP的值时ACL_MASK同时也会被定义。
接下来我们来设置dev组拥有read permission:
1 | [root@localhost ~]# setfacl -m group:dev:r-- ./test.txt |
到这里就完成了我们上面讲到的要求,是不是很简单呢。
ACL_MASK和Effective permission
这里需要重点讲一下ACL_MASK,因为这是掌握ACL的另一个关键,在Linux file permission里面大家都知道比如对于rw-rw-r--来说, 当中的那个rw-是指文件组的permission. 但是在ACL里面这种情况只是在ACL_MASK不存在的情况下成立。如果文件有ACL_MASK值,那么当中那个rw-代表的就是mask值而不再是group permission了。
让我们来看下面这个例子:
1 | [root@localhost ~]# ls -l |
这里说明test.sh文件只有file owner: root拥有read, write, execute/search permission。admin组只有read and write permission,现在我们想让用户john也对test.sh具有和root一样的permission。
1 | [root@localhost ~]# setfacl -m user:john:rwx ./test.sh |
这里我们看到john已经拥有了rwx的permission,mask值也被设定为rwx,那是因为它规定了ACL_USER,ACL_GROUP和ACL_GROUP_OBJ的最大值,现在我们再来看test.sh的Linux permission,它已经变成了:
1 | [root@localhost ~]# ls -l |
那么如果现在admin组的用户想要执行test.sh的程序会发生什么情况呢?它会被permission deny。原因在于实际上admin组的用户只有read and write permission,这里当中显示的rwx是ACL_MASK的值而不是group的permission。
所以从这里我们就可以知道,如果一个文件后面有+标记,我们都需要用getfacl来确认它的permission,以免发生混淆。
下面我们再来继续看一个例子,假如现在我们设置test.sh的mask为read only,那么admin组的用户还会有write permission吗?
1 | [root@localhost ~]# setfacl -m mask::r-- ./test.sh |
这时候我们可以看到ACL_USER和ACL_GROUP_OBJ旁边多了个#effective:r–,这是什么意思呢?让我们再来回顾一下ACL_MASK的定义。它规定了ACL_USER,ACL_GROUP_OBJ和ACL_GROUP的最大权限。那么在我们这个例子中他们的最大权限也就是read only。虽然我们这里给ACL_USER和ACL_GROUP_OBJ设置了其他权限,但是他们真正有效果的只有read权限。
这时我们再来查看test.sh的Linux file permission时它的group permission也会显示其mask的值(i.e. r–)
1 | [root@localhost ~]# ls -l |
Default ACL
上面我们所有讲的都是Access ACL,也就是对文件而言。下面我简单讲一下Default ACL。Default ACL是指对于一个目录进行Default ACL设置,并且在此目录下建立的文件都将继承此目录的ACL。
同样我们来做一个试验说明,比如现在root用户建立了一个dir目录:
1 | [root@localhost ~]# mkdir dir |
他希望所有在此目录下建立的文件都可以被john用户所访问,那么我们就应该对dir目录设置Default ACL。
1 | [root@localhost ~]# setfacl -d -m user:john:rw ./dir |
这里我们可以看到ACL定义了default选项,john用户拥有了default的read, write, excute/search permission。所有没有定义的default都将从file permission里copy过来,现在root用户在dir下建立一个test.txt文件。
1 | [root@localhost ~]# touch ./dir/test.txt |
这里我们看到在dir下建立的文件john用户自动就有了read and write permission,
ACL相关命令
前面的例子中我们都注意到了getfacl命令是用来读取文件的ACL,setfacl是用来设定文件的Acess ACL。这里还有一个chacl是用来改变文件和目录的Access ACL and Default ACL,它的具体参数大家可以去看man page。我只想提及一下chacl -B。它可以彻底删除文件或者目录的ACL属性(包括Default ACL),比如你即使用了setfacl -x删除了所有文件的ACL属性,那个+号还是会出现在文件的末尾,所以正确的删除方法应该是用chacl -B用cp来复制文件的时候我们现在可以加上-p选项。这样在拷贝文件的时候也将拷贝文件的ACL属性,对于不能拷贝的ACL属性将给出警告。
mv命令将会默认地移动文件的ACL属性,同样如果操作不允许的情况下会给出警告。
需要注意的几点
如果你的文件系统不支持ACL的话,你也许需要重新mount你的file system:
1 | mount -o remount, acl [mount point] |
如果用chmod命令改变Linux file permission的时候相应的ACL值也会改变,反之改变ACL的值,相应的file permission也会改变。
linux 上把https的流量使用http的替换服务
/etc/systemd/system/socat-proxy.service
1 | [Unit] |
如果获取到这个进程的服务名呢
在 Linux 系统中,对于给定进程 ID(如示例中的 1372),可以通过多种方式尝试获取其对应的服务名,以下是详细介绍:
1. 使用 systemctl 结合进程 ID 查找服务名
若进程是由 systemd 管理的服务启动的,可借助 systemctl 命令来查找对应的服务名。
收起
bash
1 | systemctl status $(ps -o unit= -p 1372) |
- 命令解释:
ps -o unit= -p 1372:此命令用于获取进程 ID 为 1372 的进程所属的systemd单元(服务名)。-o unit=表示仅输出单元名称,-p 1372指定进程 ID。systemctl status:用于查看指定服务的详细状态信息。
2. 通过 /etc/init.d 脚本查找(适用于 SysVinit 系统)
在较旧的系统中,服务可能由 /etc/init.d 目录下的脚本启动。可以根据进程的可执行文件路径来查找对应的服务脚本。
收起
bash
1 | # 先找到进程的可执行文件路径 |
- 命令解释:
readlink -f /proc/1372/exe:获取进程 ID 为 1372 的进程的实际可执行文件路径。grep -l "/path/to/executable" /etc/init.d/*:在/etc/init.d目录下的所有脚本中查找包含该可执行文件路径的脚本,找到的脚本名可能就是对应的服务名。
3. 手动分析进程命令行和服务配置文件
若上述方法无法找到服务名,可以手动分析进程的命令行参数,并结合系统中常见的服务配置文件来推断服务名。
收起
bash
1 | # 查看进程的命令行参数 |
- 命令解释:
cat /proc/1372/cmdline:查看进程 ID 为 1372 的进程的完整命令行参数。grep -r "keyword" /etc:在/etc目录下递归查找包含命令行中关键信息(如可执行文件名、特定配置参数等)的文件,从配置文件中可能能找到对应的服务名。
4. 使用 pstree 查看进程树结构
pstree 命令可以显示进程的树状结构,有助于了解进程的父进程和子进程关系,从而推断服务名。
收起
bash
1 | pstree -p 1372 |
- 命令解释:
-p选项用于显示每个进程的进程 ID。通过查看进程树结构,找到父进程可能对应的服务名。例如,如果父进程是某个知名服务的主进程,那么可以推断该进程可能是该服务的一部分。





