Linux基础学习:初学者必须掌握的基础命令(每天练习有助于熟练使用)
熟练使用Linux管理的必备命令,包括: locate,pwd,clear,chmod,chown,chattr,useradd, userdel, cd,Is.groupaddvi,cat,less ,mv,cp,rm,rmdir, touch,ifconfig,ip addr,route,echo, wc,expr, In, head, tail, who, htop, df,du, netstat,ss, kill, alias,tar,zip,unzip.jar,tailf,fdisk,free, uptime, Isof, Ismod, man,Isattr, dd, date,crontab,ps,findawk,sed,grep,sort,uniq,shred,nohup等,命令至少要熟练。
chattr:命令用于改变文件属性。
用chattr命令防止系统中某个关键文件被修改:
$ chattr +i /etc/resolv.conf
lsattr:命令用于显示文件属性。
使用 lsattr 命令来显示文件属性:
$ lsattr /etc/resolv.conf
输出结果为:
----i-------- /etc/resolv.conf
$ vim -o file1 file2 打开一个编辑会话,显示为水平分割成两半的窗口,一个文件占用一个窗口。
$ vim -O file1 file2 和上面相同,不过是垂直分割两半的窗口
#查看文件编码
:set fileencoding
#修改为utf-8
:set fileencoding=utf-8
ls 命令
常用参数:
-a, –all 列出目录下的所有文件,包括以 . 开头的隐含文件
-l, 除了文件名之外,还将文件的权限、所有者、文件大小等信息详细列出来。
-h, –human-readable 以容易理解的格式列出文件大小 (例如 1K 234M 2G)
-t 以文件修改时间排序
# ls -alht /etc/passwd
file 命令
说明:file命令用于查看文件的类型,可以根据文件的内部存储结构来进行判别,而不根据文件的扩展名来进行判别。在Linux系统中,文件扩展名与文件类型没有绝对的关系。
file 可以查看当前文件属于什么类型
d --目录
- --普通文件
纯文本文件 text /etc/hosts
二进制文件 binary /bin/ls
数据型文件 data /tmp/etc.tar.gz
c/b --块文件/字符文件(设备文件)
s --socket文件
[root@localhost home]# file justin/
justin/: directory
[root@localhost home]# file justin1
justin1: empty
[root@localhost ~]# file install.log
install.log: UTF-8 Unicode text
stat 命令
命令用于查看文件属性、inode等信息
File:显示文件名
Size:显示文件大小
Blocks:文件使用的数据块总数
IO Block:IO块大小
regular file:文件类型(常规文件) ,如果是其他文件类型会显示出对应的文件类型
Device:设备编号
Inode:Inode号
Links:链接数
Access:文件的权限
Gid、Uid:文件所有权的Gid和Uid。
Access Time:简写为atime,表示文件的访问时间。当文件内容被访问时,更新这个时间
Modify Time:简写为mtime,表示文件内容的修改时间,当文件的数据内容被修改时,更新这个时间。
Change Time:简写为ctime,表示文件的状态时间,当文件的状态被修改时,更新这个时间,例如文件的链接数,大小,权限,Blocks数。
-i 显示所有连接
-u 显示指定用户打开了什么
-c 查看指定的命令正在使用的文件和网络连接
-p 查看指定进程ID已打开的内容
-i 使用示例:
使用-i 6仅获取IPv6流量
$ lsof -i 6
仅显示TCP连接(同理可获得UDP连接)
$ lsof -iTCP
使用-i:port来显示与指定端口相关的网络信息
$ lsof -i :22
使用 @host 来显示指定到指定主机的连接
$ lsof [email protected]
使用@host:port显示基于主机与端口的连接
lsof [email protected]:22
找出监听端口
$ lsof -i -sTCP:LISTEN
你也可以grep “LISTEN”来完成该任务。
$ lsof -i | grep -i LISTEN
找出已建立的连接
$ lsof -i -sTCP:ESTABLISHED
你也可以通过grep搜索“ESTABLISHED”来完成该任务。
$ lsof -i | grep -i ESTABLISHED
-u 使用示例:
使用-u显示指定用户打开了什么
$ lsof -u daniel
-- snipped --
Dock 155 daniel txt REG 14,2 2798436 823208 /usr/lib/libicucore.A.dylib
Dock 155 daniel txt REG 14,2 1580212 823126 /usr/lib/libobjc.A.dylib
Dock 155 daniel txt REG 14,2 2934184 823498 /usr/lib/libstdc++.6.0.4.dylib
Dock 155 daniel txt REG 14,2 132008 823505 /usr/lib/libgcc_s.1.dylib
Dock 155 daniel txt REG 14,2 212160 823214 /usr/lib/libauto.dylib
-- snipped --
使用-u user来显示除指定用户以外的其它所有用户所做的事情
# lsof -u ^daniel
-- snipped --
Dock 155 jim txt REG 14,2 2798436 823208 /usr/lib/libicucore.A.dylib
Dock 155 jim txt REG 14,2 1580212 823126 /usr/lib/libobjc.A.dylib
Dock 155 jim txt REG 14,2 2934184 823498 /usr/lib/libstdc++.6.0.4.dylib
Dock 155 jim txt REG 14,2 132008 823505 /usr/lib/libgcc_s.1.dylib
Dock 155 jim txt REG 14,2 212160 823214 /usr/lib/libauto.dylib
-- snipped --
** -c 使用示例:**
使用-c查看指定的命令正在使用的文件和网络连接
# lsof -c syslog-ng
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
syslog-ng 7547 root cwd DIR 3,3 4096 2 /
syslog-ng 7547 root rtd DIR 3,3 4096 2 /
syslog-ng 7547 root txt REG 3,3 113524 1064970 /usr/sbin/syslog-ng
-- snipped --
-p使用示例:
使用-p查看指定进程ID已打开的内容
# lsof -p 10075
-- snipped --
sshd 10068 root mem REG 3,3 34808 850407 /lib/libnss_files-2.4.so
sshd 10068 root mem REG 3,3 34924 850409 /lib/libnss_nis-2.4.so
sshd 10068 root mem REG 3,3 26596 850405 /lib/libnss_compat-2.4.so
sshd 10068 root mem REG 3,3 200152 509940 /usr/lib/libssl.so.0.9.7
sshd 10068 root mem REG 3,3 46216 510014 /usr/lib/liblber-2.3
sshd 10068 root mem REG 3,3 59868 850413 /lib/libresolv-2.4.so
sshd 10068 root mem REG 3,3 1197180 850396 /lib/libc-2.4.so
sshd 10068 root mem REG 3,3 22168 850398 /lib/libcrypt-2.4.so
sshd 10068 root mem REG 3,3 72784 850404 /lib/libnsl-2.4.so
sshd 10068 root mem REG 3,3 70632 850417 /lib/libz.so.1.2.3
sshd 10068 root mem REG 3,3 9992 850416 /lib/libutil-2.4.so
-- snipped --
显示daniel连接到1.1.1.1所做的一切
# lsof -u daniel -i @1.1.1.1
bkdr 1893 daniel 3u IPv6 3456 TCP 10.10.1.10:1234->1.1.1.1:31337 (ESTABLISHED)
-z --- 用零覆盖以隐藏碎片
-v --- 显示操作进度
-u --- 在覆盖后截断并删除文件
-n --- 指定覆盖文件内容的次数(默认值为3)
shred 会覆盖文件来隐藏它的内容,并且也可以选择删除它。
# shred -zvu -n 5 passwords.list
locate:让使用者可以很快速的搜索档案系统内是否有指定的档案。
locate让使用者可以很快速的搜索档案系统内是否有指定的档案。其方法就是先建立一个包括系统内所有档案名称及路径的资料库,之后当寻找时只需要查询这个资料库,而不必深入系统文件中查找了。
命令格式:locate 文件名
参数:
-u: 从根目录开始建立资料库。
-U: 从指定位置开始建立资料库
-e: 将某些路径排除在寻找的范围外。
-n: 指定最多显示查找到的文件的个数
find:命令用来在指定目录下查找文件。
find /etc/ -name passwd ##查找/etc/下名称中带有passwd的文件
find /etc -maxdepth 1 -name passwd ##查找/etc/下名称中带有passwd的文件,查找一层。
find /etc -name *.conf ##查找/etc/下名称中带有*.conf的文件(下面显示的是部分)
find /etc -maxdepth 2 -name *.conf ##查找/etc/下名称中带有*.conf的文件,且查找两层,包括一层(下面显示的是部分)
find /etc -maxdepth 2 -mindepth 2 -name *.conf ##查找/etc/下名称中带有*.conf的文件,且只查找第二层
find /mnt -group tony ##查找/mnt中所有组是tony用户的文件
find /mnt -user student -group student ##查找/mnt中所有人和所有组都是student的文件
find /mnt -not -user student ##查找/mnt中所有人不是student用户的文件
find /mnt -not -user student -o -group tony ##查找/mnt中所有人不是student用户或者所有组是tony用户的文件
find /mnt -size 20K ##查找/mnt文件大小近似20k的文件
find /mnt -size +20K ##查找/mnt文件大小大于20k的文件
find /mnt -size -20K ##查找/mnt文件大小小于20k的文件
find /mnt -type d ##按type查找/mnt中目录
find /mnt -type f ##按type查找/mnt中文件
find /mnt -cmin 10 ##查找/mnt中十分钟左右修改的
find /mnt -cmin +10 ##查找/mnt中十分钟以上修改的
find /mnt -cmin -10 ##查找/mnt中十分钟以内修改的
find /mnt -ctime 10 ##查找/mnt中十天左右修改的
find /mnt -ctime +10 ##查找/mnt中十天以上修改的
find /mnt -ctime -10 ##查找/mnt中十天以内修改的
find /mnt/ -perm 444 ##查找/mnt文件权限为444的文件
find /mnt/ -perm -444 ##查找/mnt中user有读的权限且group有读的权限且other有读的权限的文件。(三个条件,u.g.o至少要读的权限即r--r--r--)
find /mnt/ -perm -004 ##查找/mnt中other有读权限的文件(一个条件,o至少有读的权限)
find /mnt/ -perm -644 ##查找/mnt中user有读写的权限且group至少有读权限且other有读的权限的文件。(四个条件,rw-r--r--)
find /etc/ -name *.conf -exec cp -rp {} /mnt \; ##把/etc/目录下名称中带有.conf的文件递归复制到/mnt下
find /mnt -name "*.conf" -exec rm -fr {} \; ##删除/mnt名称中带有.conf的文件
find / -group mail -exec cp -rp {} /mnt \; ##把/目录下的组属于mail的文件复制到/mnt
杀死指定用户所做的一切事情
可以消灭指定用户运行的所有东西,这真不错。
# kill -9 `lsof -t -u daniel
将资料同步写入硬碟中的指令: sync
[dmtsai@study ~]$ su - #这个指令在让你的身份变成root !底下请输入root的密码!
Password: #就这里!请输入安装时你所设定的root密码!
Last login: Mon Jun 1 16:10:12 CST 2015 on pts/0
[root@study ~]# sync
关机指令: shutdown
[root@study ~]# shutdown -h now
立刻关机,其中now相当于时间为0的状态
[root@study ~]# shutdown -h 20:25
系统在今天的20:25分会关机,若在21: 25才下达此指令,则隔天才关机
[root@study ~]# shutdown -h +10
系统再过十分钟后自动关机
[root@study ~]# shutdown -r now
系统立刻重新开机
[root@study ~ ]# shutdown -r +30 'The system will reboot'
再过三十分钟系统会重新开机,并显示后面的讯息给所有在线上的使用者
[root@study ~]# shutdown -k now 'This system will reboot'
仅发出警告信件的参数!系统并不会关机啦!吓唬人!
重新开机,关机: reboot, halt, poweroff
[root@study ~]# halt #系统停止~萤幕可能会保留系统已经停止的讯息!
[root@study ~]# poweroff #系统关机,所以没有提供额外的电力,萤幕空白!
[root@study ~]# systemctl [指令]
指令项目包括如下:
halt 进入系统停止的模式,萤幕可能会保留一些讯息,这与你的电源管理模式有关
poweroff 进入系统关机模式,直接关机没有提供电力喔!
reboot 直接重新开机
suspend 进入休眠模式
[root@study ~]# systemctl reboot #系统重新开机
[root@study ~]# systemctl poweroff #系统关机
chgrp :改变档案所属群组
chown :改变档案拥有者
chmod :改变档案的权限, SUID, SGID, SBIT等等的特性
改变所属群组, chgrp:
[root@study ~]# chgrp [-R] dirname/filename ...
选项与参数:
-R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有档案、目录
都更新成为这个群组之意。常常用在变更某一目录内所有的档案之情况。
范例:
[root@study ~]# chgrp users initial-setup-ks.cfg
[root@study ~]# ls -l
-rw-r--r--. 1 root users 1864 May 4 18:01 initial-setup -ks.cfg
[root@study ~]# chgrp testing initial-setup-ks.cfg
chgrp: invalid group: `testing' <==发生错误讯息啰~找不到这个群组名~
改变文件拥有者, chown:
[root@study ~]# chown [-R]帐号名称档案或目录
[root@study ~]# chown [-R]帐号名称:群组名称档案或目录
选项与参数:
-R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有档案都变更
范例:将initial-setup-ks.cfg的拥有者改为bin这个帐号:
[root@study ~]# chown bin initial-setup-ks.cfg
[root@study ~]# ls -l
-rw-r- -r--. 1 bin users 1864 May 4 18:01 initial-setup-ks.cfg
范例:将initial-setup-ks.cfg的拥有者与群组改回为root:
[root@study ~]# chown root:root initial-setup-ks.cfg
[root@study ~]# ls -l
- rw-r--r--. 1 root root 1864 May 4 18:01 initial-setup-ks.cfg
改变权限, chmod:
各权限的分数对照表如下:
r:4
w:2
x:1
每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为: [-rwxrwx---] 分数则是:
owner = rwx = 4+2+1 = 7
group = rwx = 4+2+1 = 7
others= --- = 0+0+0 = 0
[root@study ~]# chmod [-R] xyz档案或目录
选项与参数:
xyz : 就是刚刚提到的数字类型的权限属性,为rwx 属性数值的相加。
-R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有档案都会变更
[root@study ~]# ls -al .bashrc
-rw-r--r-- . 1 root root 176 Dec 29 2013 .bashrc
[root@study ~]# chmod 777 .bashrc
[root@study ~]# ls -al .bashrc
-rwxrwxrwx . 1 root root 176 Dec 29 2013 .bashrc
功能:
lsmod命令:是一个小程序,用来显示文件、proc/modules的信息,也就是显示当前内核模块装载的模块。
补充说明:
执行lsmod指令,会列出所有已载入系统的模块。Linux操作系统的核心具有模块化的特性,应此在编译核心时,务须把全部的功能都放入核心。您可以将这些功能编译成一个个单独的模块,待需要时再分别载入。
[root@localhost ~]# lsmod
Module Size Used by
binfmt_misc 17468 1
ip6t_rpfilter 12595 1
ip6t_REJECT 12625 2
nf_reject_ipv6 13717 1 ip6t_REJECT
ipt_REJECT 12541 2
nf_reject_ipv4 13373 1 ipt_REJECT
xt_conntrack 12760 13
ebtable_nat 12807 1
ebtable_broute 12731 1
bridge 151336 1 ebtable_broute
stp 12976 1 bridge
llc 14552 2 stp,bridge
nohup的意思是忽略SIGHUP信号, 所以当运行nohup python test.py的时候, 关闭shell, 那么这个python进程还是存在的(对SIGHUP信号免疫)。 但是, 要注意, 如果你直接在shell中用Ctrl C, 那么, 这个python进程也是会消失的(因为对SIGINT信号不免疫)
注意并没有后台运行的功能,就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH连接都不会影响他的运行,注意了nohup没有后台运行的意思;&才是后台运行
如果想让进程在后台不挂断的运行,需要 nohup 和 & 结合起来使用
# nohup nohup python test.py &> /var/log/python.log &
nohup 语法:
nohup Command [ Arg ... ] [ & ]
与Linux传统的top相比,htop更加人性化。它可让用户交互式操作,支持颜色主题,可横向或纵向滚动浏览进程列表,并支持鼠标操作。
htop相比较top的优势:
1.可以横向或纵向滚动浏览进程列表,以便看到所有的进程和完整的命令行。
2.在启动上比top 更快。
3.杀进程时不需要输入进程号。
4.htop 支持鼠标选中操作(反应不太快)。
5.top 已不再维护。
安装htop:yum install -y htop.x86_64
命令行选项(COMMAND-LINE OPTIONS)
-C --no-color 使用一个单色的配色方案
-d --delay=DELAY 设置延迟更新时间,单位秒
-h --help 显示htop 命令帮助信息
-u --user=USERNAME 只显示一个给定的用户的过程
-p --pid=PID,PID… 只显示给定的PIDs
-s --sort-key COLUMN 依此列来排序
-v –version 显示版本信息
交互式命令(INTERACTIVE COMMANDS)
上下键或PgUP, PgDn 选定想要的进程,左右键或Home, End 移动字段,当然也可以直接用鼠标选定进程;
Space 标记/取消标记一个进程。命令可以作用于多个进程,例如 “kill”,将应用于所有已标记的进程
U 取消标记所有进程
s 选择某一进程,按s:用strace追踪进程的系统调用
l 显示进程打开的文件: 如果安装了lsof,按此键可以显示进程所打开的文件
I 倒转排序顺序,如果排序是正序的,则反转成倒序的,反之亦然
+, - When in tree view mode, expand or collapse subtree. When a subtree is collapsed a "+" sign shows to the left of the process name.
a (在有多处理器的机器上) 设置 CPU affinity: 标记一个进程允许使用哪些CPU
u 显示特定用户进程
M 按Memory 使用排序
P 按CPU 使用排序
T 按Time+ 使用排序
F 跟踪进程: 如果排序顺序引起选定的进程在列表上到处移动,让选定条跟随该进程。这对监视一个进程非常有用:通过这种方式,你可以让一个进程在屏幕上一直可见。使用方向键会停止该功能。
K 显示/隐藏内核线程
H 显示/隐藏用户线程
Ctrl-L 刷新
Numbers PID 查找: 输入PID,光标将移动到相应的进程上
作为一个标准的命令行工具,jq可以处理 JSON 文件,也可以直接处理从命令行管道或者流中传入的数据,这方便在 shell 脚本中使用。通过 jq 的 .(点)过滤器可以让 JSON 的格式规整起来,即输出格式化,美丽的打印效果。
安装jq工具:
yum install -y jq
-c compact instead of pretty-printed output;
-n use `null` as the single input value;
-e set the exit status code based on the output;
-s read (slurp) all inputs into an array; apply filter to it;
-r output raw strings, not JSON texts;
-R read raw strings, not JSON texts;
-C colorize JSON;
-M monochrome (don't colorize JSON);
-S sort keys of objects on output;
--tab use tabs for indentation;
--arg a v set variable $a to value ;
--argjson a v set variable $a to JSON value ;
--slurpfile a f set variable $a to an array of JSON texts read from ;
[root@ss-server ~]# cat test.json
{"timestamp":"2021-06-10T18:27:56.928217+0800","flow_id":1943102950284001,"in_iface":"enp26s0f0","event_type":"alert","src_ip":"10.10.10.10","src_port":61159,"dest_ip":"1.1.1.1","dest_port":80,"proto":"TCP","alert":{"action":"allowed","gid":1,"signature_id":3013004,"rev":1,"signature":"http GET data","category":"A Network Trojan was detected","severity":1,"metadata":{"by":["al0ne"],"created_at":["2018_10_17"]}}}
[root@ss-server ~]# jq . test.json
{
"timestamp": "2021-06-10T18:27:56.928217+0800",
"flow_id": 1943102950284001,
"in_iface": "enp26s0f0",
"event_type": "alert",
"src_ip": "10.10.10.10",
"src_port": 61159,
"dest_ip": "1.1.1.1",
"dest_port": 80,
"proto": "TCP",
"alert": {
"action": "allowed",
"gid": 1,
"signature_id": 3013004,
"rev": 1,
"signature": "http GET data",
"category": "A Network Trojan was detected",
"severity": 1,
"metadata": {
"by": [
"al0ne"
],
"created_at": [
"2018_10_17"
]
}
}
}
在屏幕上显示指定文件的末尾若干行内容,通常用于日志文件的跟踪输出。
补充说明
tailf命令几乎等同于tail -f,严格说来应该与tail --follow=name更相似些。当文件改名之后它也能继续跟踪,特别适合于日志文件的跟踪(follow the growth of a log file)
tailf和tail -f的区别
tailf 总是从文件开头一点一点的读, 而tail -f 则是从文件尾部开始读
tailf check文件增长时,使用的是文件名, 用stat系统调用;而tail -f 则使用的是已打开的文件描述符; 注:tail 也可以做到类似跟踪文件名的效果; 但是tail总是使用fstat系统调用,而不是stat系统调用;结果就是:默认情况下,当tail的文件被偷偷删除时,tail是不知道的,而tailf是知道的。
选项
-n, --lines NUMBER # 输出最后数行
-NUMBER # 与NUMBER相同 `-n NUMBER'
-V, --version # 输出版本信息并退出
-h, --help # 显示帮助并退出
**Linux系统7个运行级别**
0:关机,停机模式
1:单用户模式
2:多用户模式
3:完整的多用户文本模式
4:系统未使用,保留一般不用
5:图形化模式
6:重启模式
运行级就是操作系统当前正在运行的功能级别。这个级别从0到6 ,具有不同的功能。
1.使用runlevel命令
runlevel
打印系统的上一个和当前运行级别:
[root@localhost ~]# runlevel
N 3
2.使用who命令
who
打印有关当前登录用户的信息,使用-r选项打印运行级别信息:
[root@localhost ~]# who -r
run-level 3 2021-09-14 22:07
3.使用systemctl命令
systemctl
用于控制systemd系统和服务管理器
[root@localhost ~]# systemctl get-default
multi-user.target
备注:如果需要临时切换系统运行级别 直接 init
+ 需要切换到的数字。