前言
环境搭建
账号管理
开机关机
根目录结构
目录操作
文件操作
文件权限
vim编辑器
磁盘管理
进程管理
进阶小故事之CPU深夜狂飙
交互工具
环境安装
程序员常用开发命令组合
前言
在java开发之路学习到一定程度之后。接下来再要遇到的技术如:消息队列(kafka、RabbitMQ、RockeetMQ)、缓存(Redis)、搜索引擎(ES)、集群分布式(需要购买多台服务器,如果没有服务器我们就只能使用虚拟机))。这些接下来要遇到的技术都是需要安装在linux上进行操作,所以可想而知linux的重要性。
学习linux需要掌握以下基本命令:文件操作、目录操作、文件属性、vim编辑器、账号管理、磁盘管理…,以及软件安装和部署:java、tomcat、docker
环境搭建
第一种方式:直接安装Linux操作系统 (会替换掉现有系统)
第二种方式:本机电脑安装成双系统 (windos linux)
第三种方式:虚拟机(VMware下载(360一键安装))
[注]虚拟机搭建环境有两种方式:
a. 下载镜像进行安装
b. 可以使用他人已制作好的镜像
安装VMware虚拟机软件好后打开镜像即可使用
第四种方式:购买云服务器 (有经济来源的话可以购买阿里云服务器,因为这才是最接近公司中原生环境的)
账号管理
Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。每个用户账号都拥有一个唯一的用户名和各自的口令。
用户在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录。
实现用户账号的管理,要完成的工作主要有如下三个方面:
用户账号的添加、删除、修改
用户账号的添加(useradd)
添加用户账号就是在系统中创建一个新账号,然后为新账号分配用户名、用户组、主目录和登录 Shell等资源
#添加账号
useradd 选项 用户名
用户账号的删除(userdel)
删除用户账号就是要将/etc/passwd等系统文件中的该用户记录删除,必要时还删除用户的主目录。删除命令删除用户在系统文件中(主要是/etc、/etc/shadow…)
#删除已有用户的时候将它的目录页一并删除
userdel -r [文件名]
用户账号的修改(usermod)
#常用选项-c/d/m/g/G/s/u/o
usermod -d [文件名]
用户口令的管理(su)
#切换用户
su 用户名
#切换用户后使用新用户的工作环境
su - 用户名
#切换到root用户
sudo su
#退回原来用户
exit
#退回原来用户
logout
#退回原来用户,其实也是执行的eixt命令
ctrl + d
用户组的管理
将用户分组是Linux系统对用户进行管理及控制访问的一种手段。用户组的所有信息都存放在/etc/group文件中。此文件的格式也类似于/etc/passwd文件,由冒号(:)隔开若干个字段,这些字段有(组名:口令:组标识号:组内成员用户列表)
a. 组名是用户组的名称,由字母或数字构成。与/etc/passwd中的登录名一样,组名不应重复
b. 口令字段存放的是用户组加密后的口令字。一般linux系统的用户组都没有口令,即这个字段一般为空,或者是*
c. 组标识号与用户标识号类似,也是一个整数,被系统内部用来标识组
d. 组内用户列表是属于这个组的所有用户的列表,不同用户之间用(,)分隔。这个用户组可能是用户的主组,也可能是附加组
每个用户都属于某个用户组,一个组中可以有多个用户,一个用户可以属于不同的组
当一个用户同时是多个组中成员时,在etc/passwd文件中记录的是用户所属的主组,也就是登录时所属的默认组,而其他组称为附加组,用户要访问附加组的文件时,必须首先使用newgrp命令使自己成为所要访问的组中的成员
完成用户的管理工作有许多办法,但是每种办法实际都是对有关系统文件进行修改
#创建一个用户组
groupadd [用户组]
#创建一个用户组并设置id
groupadd -g [数字] [用户组]
#修改旧用户名为新用户名且设置id
group -g [数字] -n [新用户组] [旧用户组]
#删除用户组
groupdel [用户组]
#修改用户组的组标识号
groupmod -g [数字] 用户组
#将旧用户组名修改为新的,并标识号改1000
groupmod -g 1000 -n 新用户组名 旧用户组名
#切换[root]用户组
newgrp root
#查看group文件中组信息
cat /etc/group
#查看所有用户信息
cat /etc/passwd
查看系统用户信息
作为系统管理员,你可能经常会(在某个时候)需要查看系统中有哪些用户正在活动。有些时候,你甚至需要知道他(她)们正在做什么。本文为我们总结了4种查看系统用户信息(通过编号(ID))的方法。
查看登录用户正在使用的进程信息(w)
w命令用于显示已经登录系统的用户的名称,以及他们正在做的事。该命令所使用的信息来源于/var/run/utmp文件。w命令输出的信息包括:
• 用户名称
• 用户的机器名称或tty号
• 远程主机地址
• 用户登录系统的时间
• 空闲时间(作用不大)
• 附加到tty(终端)的进程所用的时间(JCPU时间)
• 当前进程所用时间(PCPU时间)
• 用户当前正在使用的命令
w命令还可以使用以下选项
• -h忽略头文件信息
• -u显示结果的加载时间
• -s不显示JCPU, PCPU, 登录时间
查看登录用户信息(who)
who命令用于列举出当前已登录系统的用户名称。其输出为:用户名、tty号、时间日期、主机地址。
[注]使用whoami命令查看你所使用的登录名称
查看曾经使用过系统的历史用户信息(who)
last命令可用于显示特定用户登录系统的历史记录。如果没有指定任何参数,则显示所有用户的历史信息。在默认情况下,这些信息(所显示的信息)将来源于/var/log/wtmp文件。该命令的输出结果包含以下几列信息:
• 用户名称
• tty设备号
• 历史登录时间日期
• 登出时间日期
• 总工作时间
用户账号授权(sudo)
简单的说,sudo 是一种权限管理机制,管理员可以授权于一些普通用户去执行一些 root 执行的操作,而不需要知道 root 的密码。
严谨些说,sudo 允许一个已授权用户以超级用户或者其它用户的角色运行一个命令。当然,能做什么不能做什么都是通过安全策略来指定的。sudo 支持插件架构的安全策略,并能把输入输出写入日志。第三方可以开发并发布自己的安全策略和输入输出日志插件,并让它们无缝的和 sudo 一起工作。默认的安全策略记录在 /etc/sudoers 文件中。而安全策略可能需要用户通过密码来验证他们自己。也就是在用户执行 sudo 命令时要求用户输入自己账号的密码。如果验证失败,sudo 命令将会退出。(注意,本文介绍的 sudo 命令运行在 ubuntu 14.04中。)
sudo命令还可以使用以下选项
• -b 在后台执行指令
• -h 显示帮助
• -H 将HOME环境变量设为新身份的HOME环境变量
• -k 结束密码的有效期限,也就是下次再执行sudo时便需要输入密码
• -l 列出目前用户可执行与无法执行的指令
• -p 改变询问密码的提示符号
• -s 执行指定的shell
• -u <用户> 以指定的用户作为新的身份。若不加上此参数,则预设以root作为新的身份
• -v 延长密码有效期限5分钟
• -V 显示版本信息
• -S 从标准输入流替代终端来获取密码
sudo 程序相关文件如下
• /etc/sudoers
• /etc/init.d/sudo
• /etc/pam.d/sudo
• /var/lib/sudo
• /usr/share/doc/sudo
• /usr/share/lintian/overrides/sudo
• /usr/share/bash-completion/completions/sudo
• /usr/bin/sudo
• /usr/lib/sudo
现在了解了这些概念后下一步是进行基本配置:
系统默认创建了一个名为 sudo 的组。只要把用户加入这个组,用户就具有了 sudo 的权限。
至于如何把用户加入 sudo 组,您可以直接编辑 /etc/group 文件,当然您得使用一个有 sudo 权限的用户来干这件事:
$ sudo vim /etc/group
在 sudo 组中加入新的用户,要使用逗号分隔多个用户。
$ sudo usermod -a -G sudo jack
上面的设置中我们把用户 jack 添加到了 sudo 组中,所以当用户 jack 登录后就可以通过 sudo 命令以 root 权限执行命令了!
[拓展]详细配置
在前面的配置中我们只是把用户 jack 加入了 sudo 组,他就具有了通过 root 权限执行命令的能力。
现在我们想问一下,这是怎么发生的?是时候介绍如何配置 sudo 命令了!
sudo 命令的配置文件为 /etc/sudoers。
编辑这个文件是有单独的命令的 visudo(这个文件我们最好不要使用 vim 命令来打开),是因为一旦你的语法写错会造成严重的后果,这个工具会替你检查你写的语法,这个文件的语法遵循以下格式:
who where whom command
说白了就是哪个用户在哪个主机以谁的身份执行那些命令,那么这个 where, 是指允许在那台主机 ssh 连接进来才能执行后面的命令,文件里面默认给 root 用户定义了一条规则:
root ALL=(ALL:ALL) ALL
• root 表示 root 用户
• ALL 表示从任何的主机上都可以执行,也可以这样 192.168.100.0/24
• (ALL:ALL) 是以谁的身份来执行,ALL:ALL 就代表 root 可以任何人的身份来执行命令
• ALL 表示任何命令
那么整条规则就是 root 用户可以在任何主机以任何人的身份来执行所有的命令。
现在我们可以回答 jack 为什么具有通过 root 权限执行命令的能力了。打开 /etc/sudoers 文件:
sudo 组中的所有用户都具有通过 root 权限执行命令的能力!
再看个例子
nick 192.168.10.0/24=(root) /usr/sbin/useradd
上面的配置只允许 nick 在 192.168.10.0/24 网段上连接主机并且以 root 权限执行 useradd 命令。
现在设置 sudo 时不需要输入密码
执行 sudo 命令时总是需要输入密码事件很不爽的事情(抛开安全性)。有些应用场景也需要在执行 sudo 时避开输入密码的交互过程。
那么需要如何设置呢?其实很简单,只需要在配置行中添加 NOPASSWD: 就可以了:
****** ALL=(ALL) NOPASSWD: ALL
再试试看,是不是已经不需要输入密码了?
在 ubuntu 中,sudo 的日志默认被记录在 /var/log/auth.log 文件中。当我们执行 sudo 命令时,相关日志都是会被记录下来的。比如下图中显示的就是一次执行 sudo 命令的日志:
开机关机
开机登录
方式一 : 命令行登录
方式二 : ssh登录
方式三 : 图形界面登录
[注]开机会启动许多程序。它们在windows中叫"服务"(service),在linux中叫"守护进程"(daemon)
关机(shutdown)
在Linux领域内大多用在服务器上,很少遇到关机的操作,不管是重启还是关闭系统,首先要运行sync命令,把内存中的数据同步到磁盘中.
使用关机指令,可以man shutdown 来看一下帮助文档。
#立即关机
shutdown -h now
#计算机将在10分钟后关机
shutdown -h 10
#10分钟后关机
shutdown -h +10
#系统会在今天20:25关机
shutdown -h 20:25
#关机,等同于 shutdown -h now 和 poweroff
halt
重启
#系统立即重启
shutdown -r now
#系统10分钟后重启
shutdown -r +10
#重启,等同于 shutdown -r now
reboot
根目录结构
根目录/
,所有的文件都挂载在这个节点下,树状目录结构如下
ls
是系统目录查看命令,通过ls /
命令查看根目录下所有文件,文件信息如下:
#binshi Binary的缩写,这个目录存放着最经常用使用的命令
cd /bin
#这里存放的是启动linux时使用的一些核心文件,包括一些连接文件以及镜像文件
cd /boot
#dev是Device(设备)的缩写,存放的是Linux的外部设备,在linux中访问设备的方式和访问文件的方式是相同的
cd /dev
#用户的主目录,在linux中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的
cd /home
#这个目录里存放着系统最基本的动态连接共享库,其作用类似于windows里的ddl文件
cd /lib
#这个目录一般情况下是空的,当系统非法关机后,这里就存放一些文件
cd /lost+found
#linux系统会自动识别一些设备,例如U盘,光驱等等,当识别后,linux会把识别的设备挂载到这个目录下
cd /media
#系统提供该目录是为了让用户临时挂载到别的文件系统的,我们可以将光驱挂载在/mnt上,然后进入该目录就可以查看光驱里的内容了
cd /mnt
#这里给主机额外安装软件所摆放的目录。比如开发者安装一个ORALCE数据库则就可以放到这个目录下。默认是空的
cd /opt
#这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息
cd /proc
#该目录为系统管理员,也称为超级权限者的用户主目录
cd /root
#s就是super user的意思,这里存放的是系统管理员使用的系统管理程序
cd /sbin
#该目录存放一些服务启动之后需要提取的数据
cd /srv
#这是Linux2.6内核的一个很大的变化,该目录下安装2.6内核中新出现的一个文件系统sysfs
cd /sys
#这个目录是用来存放一些临时文件的。用完即丢的文件
cd /tmp
#这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录
cd /usr
这里要注意,“/
“是根目录,”~
“是家目录。linux存储是以挂载的方式,相当于树状的,源头就是”/
”,也就是根目录,而每个用户都有"家"目录,也就是用户的个人目录,比如root用户的"家"目录就是/root
,普通用户a的"家"目录就是/home/a
。
[注]
8./etc/passwd文件是用户管理工作涉及的最重要的文件
9.linux系统中的每个用户都在/etc/passwd文件中有一个对应的记录行,它记录着用户的一些基本信息,这个文件对所有用户都是可读的
10./etc/passwd中每行记录用(:)分隔为7个字段,其格式和含义是
(用户名:口令:用户账号标识号:组标识号:注释性描述:主目录:登录xshell)
11.口令中一些系统中,存放着加密后的用户口令字
目录操作
创建命令(mkdir)
#创建一个目录
mkdir
#创建多级目录
mkdir -p
[注]pwd
命令显示当前用户所在的目录
列出命令(ls)
#列出目录
ls
#和ls -l效果一样,查看文件属性、权限,没有隐藏文件
ll
#-a参数即all,查看全部的文件,包括隐藏文件
ls -a
#-l参数,列出所有的文件,包括文件的属性和权限,没有隐藏文件
ls -l
#-a和-l的组合,列出所有文件的属性和权限,包括隐藏文件
ls -al
查找命令(find)
#列出当前目录及子目录下的所有文件和文件夹,其中. 代表当前文件夹,会递归查找子文件夹
find .
#在/usr目录下查找FeraoRedisConfig文件夹
find /usr -name "FeraoRedisConfig"
#在/usr目录下查找以.txt结尾的文件名,文件名 可用文件全名或*代表不确定部分,如*.sh
find /usr -name "*.txt"
移动命令(mv)
#移动文件或者目录!重命名
mv
#强制移动
mv -f
#只替换已经更新过的文件
mv -u
复制命令(cp)
#cp 文件or目录 地点
删除命令(rmidr)
#删除目录,仅能删除空的目录,如果下面有文件,需要先删除文件
rmidr 目录
#递归删除多个目录
rmidr -p 目录/目录/..
#-r 就是向下递归,不管有多少级目录,一并删除;-f 就是直接强行删除,不作任何提示的意思
rm -rf 目录名字
#将会删除/var/log/httpd/access目录以及其下所有文件、文件夹
rm -rf /var/log/httpd/access
#将会强制删除/var/log/httpd/access.log这个文件
rm -f /var/log/httpd/access.log
```
问题描述
执行cp命令时提示cp:略过目录
解决办法
加入-r参数后成功拷贝
cp命令
将给出的文件或目录拷贝到另一个文件或者目录中,同msdos下的copy命令一样,功能十分强大
语法
cp [参数] 源文件或目录 目标文件或目录
说明
该命令把指定的源文件复制到目标文件或把多个源文件复制到目标目录中
参数
-a 该选项通常在拷贝目录时使用。它保留链接、文件属性、并
递归地拷贝目录,其作用等于dpR选项的组合。
(复制的时候要保留文件的属性用-a,不然会导致服务无法
应用等问题,例如原作者拥有者为oracle,直接cp后
文件拥有者变为root,会导致数据库服务器无法使用,
可以使用chown修改文件拥有者,或者复制时直接用cp
-a 命令)
-d 拷贝时保留链接
-f 删除已经存在的目标文件而不提示
-i 和f选项相反,在覆盖目标文件之前将给出提示要求用户确认
。回答y时目标文件将被覆盖,是交互式拷贝。
-p 此时cp除复制源文件的内容外,还将把其修改时间和访问权限
也复制到新文件中
-r 若给出的源文件是一目录文件,此时cp将递归复制该目录下
所有的子目录和文件。此时目标文件必须为一个目录名
-l 不作拷贝,只是链接文件
注意
为防止用户在不经意的情况下用cp命令破坏另一个文件,如用户指定的目标文件名已存在,用cp命令
拷贝文件后,这个文件就会被新源文件覆盖,因此,建议用户在使用cp命令拷贝文件时,最好使用i
选项
```
文件操作
1)绿色文件:执行文件,可执行的程序
2)红色文件:压缩文件或者包文件
3)蓝色文件:目录
4)白色文件:普通,如文本文件、配置文件、源码文件等
5)浅蓝色文件:链接文件,主要是使用ln命令建立的文件
6)红色闪烁:表示链接的文件有问题
7) 黄色文件:表示设备文件
8) 灰色文件:表示其他文件
文件内容展示方式
#由第一行开始显示文件内容
cat
#由最后一行开始显示文件内容
tac
#一页一页的显示文件内容
more
#与more类似,但比more更好的是它可以往前翻页。空格下翻页,pageDown、pageUp键代表翻动页面
less
查看文件头部内容(head)
#head -n,查看头几行
#示例:查看日志头几行日志
head -n 10 test.log
#示例:查看日志除最后几行
head -n -10 test.log
查看文件末尾内容(tail)
#tail -n,显示行号,相当于nl命令.
#示例:查询日志尾部最后10行
tail -n 10 test.log
#查询10行之后的所有日志
tail -n +10 test.log
#实时监控100行日志
tail -100f
快速查看文件指定内容(grep)
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户
#查找即包含leo又包含li的行
grep leo logs.log | grep li --color
#多文件查询
grep leo logs.log logs_back.log --color
#查找匹配leo或者匹配li的行
grep leo | li logs.log --color
#显示匹配行前2行
grep leo logs.log -A2 --color
#显示匹配行后2行
grep leo logs.log -B2 --color
#显示匹配行前后2行
grep leo logs.log -C2 --color
#统计包含leo的行数
grep -c leo logs.log --color
#查找以leo开头的行
grep ^leo logs.log --color
#查找以leo结尾的行
grep leo$ logs.log --color
#显示namesrv.log文件中包含config的行
grep 'config' ~/logs/rocketmqlogs/namesrv.log
#显示在aa,bb,cc文件中匹配test的行。
grep 'test' aa bb cc
#显示所有包含每个字符串至少有5个连续小写字符的字符串的行。
grep ‘[a-z]\{5\}’ aa
#如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着 另外一个es(\1),找到就显示该行。如果用egrep或grep -E,就不用”\”号进行转义,直接写成’w(es)t.*\1′就可以了。
grep ‘w\(es\)t.*\1′ aa
文件内查找
#向下查找字符串
#n : 继续搜寻下一个
#N : 上寻找
/[要查找的字符]
#向上查找字符串
?[要查找的字符]
[注]可以使用man[命令]来查看各个命令的使用文档,如 man cp网络配置目录:cd /etc/sysconfig/network-scripts (CentOS7)ifconfig查看网络配置
文件内容信息汇总(wc)
wc
命令,该命令统计给定文件中的字节数,字数,行数。如果没有给出文件名,则从标准输入读取.wc
同时也给出所有指定文件的总统计数。字由空格字符区分开的最大字符串。
#查看文件里有多少字节(统计字节数)
wc -c filename
#查看文件里有多少行(统计行数)
wc -l filename
#查看文件里有多少个word(统计字数)
wc -w filename
#文件里最长的哪一行是有多少个字
wc -L filename
[注]wc
命令输出列的顺序和数目不受选项的顺序和数目的影响。总是按下述顺序显示并且每项最多一列。如果命令行中没有文件名,则输出中不出现文件名。
行数、字数、字节数、文件名
(4)删除目录/文件
rm 移除文件或者目录
rm -f 就是直接强行删除,不作任何提示的意思
rm -r 就是向下递归,不管有多少级目录,一并删除
rm -i 互动,删除询问是否删除
rm -rf / 系统中所有的文件都删除,删库跑路
-----------------------------------------------------------------------------
#删除文件夹实例
rm -rf /var/log/httpd/access #将会删除/var/log/httpd/access目录以及其下所有文件、文件夹
#删除文件使用实例
rm -f /var/log/httpd/access.log #将会强制删除/var/log/httpd/access.log这个文件
#清屏
clear
(5)文件压缩/解压缩
#压缩命令(压缩文件名和被压缩文件名都可加入路径)
tar -zcvf 压缩文件名.tar.gz 被压缩文件名
#解压缩命令(解压缩后的文件只能放在当前的目录)
tar -zxvf 压缩文件名.tar.gz
文件权限
linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。
用户有三种不同类型的:文件所有者,同组用户、其他用户。所有者一般是文件或目录的创建者。所有者可以允许同组用户有权访问文件,还可以将文件的访问权限赋予系统中的其他用户。在这种情况下,系统中每一位用户都能访问该用户拥有的文件或目录。
文件或目录的访问权限分为只读,只写和可执行三种。以文件为例,只读权限表示只允许读其内容,而禁止对其做任何的更改操作。可执行权限表示允许将该文件作为一个程序执行。文件被创建时,文件所有者自动拥有对该文件的读、写和可执行权限,以便于对文件的阅读和修改。用户也可根据需要把访问权限设置为需要的任何组合。
每一文件或目录的访问权限都有三组,每组用三位表示,分别为文件属主的读、写和执行权限;与属主同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限。当用ls -l
命令显示文件或目录的详细信息时,最左边的一列为文件的访问权限。 例如:
[root@localhost test]# ll -al
总计 316lrwxrwxrwx 1 root root 11 11-22 06:58 linklog.log -> log2012.log
-rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log
-rw-r--r-- 1 root root 61 11-13 06:03 log2013.log
-rw-r--r-- 1 root root 0 11-13 06:03 log2014.log
-rw-r--r-- 1 root root 0 11-13 06:06 log2015.log
-rw-r--r-- 1 root root 0 11-16 14:41 log2016.log
-rw-r--r-- 1 root root 0 11-16 14:43 log2017.log
我们以log2012.log为例:
-rw-r--r-- 1 root root 296K 11-13 06:03 log2012.log
第一列共有10个位置,第一个字符指定了文件类型(目录、文件或链接文件等等)。在通常意义上,一个目录也是一个文件。换句话说,该列为类型列。
类型列 含义
--------------------------
[d] 目录
[-] 非目录的文件
[l] 链接文档[link file]
[b] 装置文件内可供存储的接口设备(可随机存取装置)
[c] 装置文件内串行端口设备,如键盘(一次性读取装置)
从第二个字符开始到第十个共9个字符,3个字符一组,分别表示了3组用户对文件或者目录的权限。
第一组[rwx]:属主权限,代表该文件的所有者拥有该文件的权限
第二组[rwx]:属组权限,代表所有者的同组用户拥有该文件的权限
第三组[rwx]:其他用户权限,代表其他用户所拥有该文件的权限
权限字符用[-]代表空许可(没有权限)、[r]代表只读(read)、[w]代表写(write)、[x]代表可执行(execute)
示例中:- rw- r-- r--
,表示log2012.log是一个普通文件;log2012.log的属主有读写权限;与log2012.log属主同组的用户只有读权限;其他用户也只有读权限。
确定了一个文件的访问权限后,用户可以利用Linux系统提供的命令对访问权限、所有者、用户组进行变更。
chmod
命令:重新设定不同的访问权限。
chown
命令:更改某个文件或目录的所有者。
chgrp
命令:来更改某个文件或目录的用户组。
chmod命令是非常重要的,用于改变文件或目录的访问权限,用它控制文件或目录的访问权限。详细情况如下。
两种用法:
一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。
1)文字设定法:
chmod [-cfvR] [who] [+ | - | =] [mode] 文件名
①格式:
chmod <参数> <权限范围>+<权限设置> 使权限范围内的目录或者文件具有指定的权限
chmod <参数> <权限范围>-<权限设置> 删除权限范围的目录或者文件的指定权限
chmod <参数> <权限范围>=<权限设置> 设置权限范围内的目录或者文件的权限为指定的值
②<参数>内容:
-c 当发生改变时,报告处理信息
-f 错误信息不输出
-R 处理指定目录以及其子目录下的所有文件
-v 运行时显示详细处理信息
③<权限范围>内容:
u :代表用户
g :代表用户组
o :代表其他
a :代表所有
④<权限设置>内容:
r :读权限,用数字4表示
w :写权限,用数字2表示
x :执行权限,用数字1表示
- :删除权限,用数字0表示
s :特殊权限
#增加授予这个文件的所属者执行的权限
#chmod <权限范围>+<权限设置> file
chmod u+x somefile
#授予所有用户这个文件的执行权
#chmod <权限范围>+<权限设置> file
chmod +x somefile
chmod a+x somefile
#为所有用户分配读权限
chmod =r file
# 递归地给directory目录下所有文件和子目录的属主分配读的权限
chmod -R u+r directory
2)数字设定法
我们必须首先了解用数字表示的属性的含义:
0 表示没有权限,
1 表示可执行权限,
2 表示可写权限,
4 表示可读权限,
每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,数字设定法的一般形式为:
chmod [mode] 文件名
#权限为 [rwxrwx---]
#owner = r w x = 4 + 2 + 1 =7
#group = r w x = 4 + 2 + 1 =7
#others = - - - = 0 + 0 + 0 =0
chmod 770 filename
#权限为 [rwxrwxrwx]
#owner = r w x = 4 + 2 + 1 =7
#group = r w x = 4 + 2 + 1 =7
#others = r w x = 4 + 2 + 1 =0
chmod 777 filename
软链接与硬链接
分类
硬链接
A---B,假设B是A的硬链接,那么他们两个指向了同一个文件,允许一个文件拥有多个路径,用户
可以通过这种机制建立硬链接到一些重要的文件上,防止误删
软链接
类似windows下的快捷方式,删除源文件,快捷方式也访问不了了
命令
ln 原文件 链接新文件 创建硬链接
ln -s 原文件 链接新文件 创建一个软链接(符号链接)
touch 新文件 创建文件
echo “字符串” >> 文件 输入字符串
vim编辑器
vi是老版的文本处理器,虽然已经很全了,但是还有可以进步的地方,vim则可以说是开发者的一项很好用的工具。
vim是从vi发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在开发圈被广泛使用。
所有的Unix like 系统都会内建vi文本编辑器,其他的编辑器则不一定会存在。
基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode)。 这三种模式的作用分别是:
(1)命令模式
使用 Vim 编辑(新建)文件时,默认处于命令模式。在此模式下,可以使用上、下、左、右键或者 k、j、h、l 命令进行光标移动,还可以对文件内容进行复制、粘贴、替换、删除等操作。
换言之,此状态下敲击键盘动作会被vim识别为命令,而非输入字符。
注意如果这个文件存在,那就是修改这个文件,如果不存在,那就会新建这个文件
例如:vim array.sh
然后在打开页面的左下角可以看到文件的信息,行数和字符数,比如上图的241行,5450个字符
在命令模式中,可以使用以下功能:
①査找指定字符串:/char
#char为需要查找的字符,在查找的过程中还以使用$^等进行匹配
然后enter键就可以了,按n健查找下一个,按N健查找前一个。
(2)输入模式
在输入模式下可以对文件执行写操作,类似在 Windows 的文档中输入内容。进入输入模式的方法是输入 i、a、o 等插入命令,编写完成后按 Esc 键即可返回命令模式。
在输入模式中,可以使用以下按键:
①Page Up/Page Down,上/下翻页
②HOME/END,移动光标到行首/行尾
③Insert,切换光标为输入/替换模式,光标将变成竖线/下划线
④ESC,退出输入模式,切换到命令模式
⑤字符按键以及Shift组合,输入字符
⑥方向键,在文本中移动光标
(3)底线模式
命令模式只有一些最基本的命令,因此仍然要依靠底线命令模式输入更多命令,底线模式的进入方法为:在命令模式下按":“键,Vim 窗口的左下方会出现一个”:"符号,这时就可以输入相关的指令进行操作了。指令执行后会自动返回命令模式。
①保存并退出::wq
②强制退出并忽略所有更改::q!
③放弃所有修改,并打开原来文件::e!
磁盘管理
linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。
命令格式:df [选项] [文件]
如果没有文件名被指定,则所有当前被挂载的文件系统的可用空间将被显示。默认情况下,磁盘空间将以 1KB 为单位进行显示,除非环境变量 POSIXLY_CORRECT 被指定,那样将以512字节为单位进行显示。
df命令还可以使用以下选项
• -a 全部文件系统列表
• -h 方便阅读方式显示
• -H 等于“-h”,但是计算式,1K=1000,而不是1K=1024
• -i 显示inode信息
• -k 区块为1024字节
• -l 只显示本地文件系统
• -m 区块为1048576字节
• --no-sync 忽略 sync 命令
• -P 输出格式为POSIX
• --sync 在取得磁盘信息前,先执行sync命令
• -T 文件系统类型
可选择参数为以下选项
• --block-size=<区块大小> 指定区块大小
• -t<文件系统类型> 只显示选定文件系统的磁盘信息
• -x<文件系统类型> 不显示选定文件系统的磁盘信息
• --help 显示帮助信息
• --version 显示版本信息
“df -h”这条命令再熟悉不过。以更易读的方式显示目前磁盘空间和使用情况。
“df -i” 以inode模式来显示磁盘使用情况。
那么df -h 和df -i的区别是什么?同样是显示磁盘使用情况,为什么显示占用百分比相差甚远?
df -h的比较好解释,就是查看磁盘容量的使用情况。
至于df -i,先需要去理解一下inode
最简单的说法,inode包含的信息:文件的字节数,拥有者id,组id,权限,改动时间,链接数,数据block的位置。相反是不表示文件大小。这就是为什么df -h和df -i 显示的结果是不一样的原因。
ps:在df -h 和df -i 显示使用率100%,基本解决方法都是删除文件。
df -h 是去删除比较大无用的文件-----------大文件占用大量的磁盘容量。
df -i 则去删除数量过多的小文件-----------过多的文件占用了大量的inode号。
进程管理
在Linux中,每一个正在运行的程序都有一个进程,每一个进程都有一个id号,并且每一个进程都会有一个父进程。进程的存在方式有两种:前台、后台,一般的服务都是后台进行的,基本的程序都是前台运行的。
进程管理的命令是 ps
(进程状态的缩写),ps
可以显示当前运行进程的详细信息,如用户名、用户 ID、CPU 使用率、内存使用、进程启动日期时间、命令名等等。
在ps
命令使用时通常会用到 |
(管道符),如 A|B
,在A的基础上通过B过滤进程信息。比如:
在所有进程中查找java进程:ps -aux | grep java
或 ps -ef | grep java
下面列出ps进程管理命令常见用法:
#查看当前系统中正在执行的各种进程信息
ps
#显示当前终端运行的所有的进程信息
ps -a
#以用户的信息显示进程
ps -u
#显示后台运行的进程参数
ps -x
#查看所有的进程
ps -aux
#在所有进程中匹配符合条件的字符并列出
ps -aux|grep mysql
#查看父进程
ps -ef
#通过目录树结构查看
ps -ef|grep mysql
#显示进程树-p 显示父ID、-u显示用户组
ps -pu
杀死进程使用kill命令:
#杀死进程,等于windows结束任务
kill -9 [进程ID]
[注]1.grep 查找文件中符合条件的字符串
[拓展]程序后台运行
nohup
命令,如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( n ohang up)。
该命令的一般形式为:nohup Command [ Arg … ] &
nohup
命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup
命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示”and”的符号)到命令的尾部。
操作系统中有三个常用的流:
▶0:标准输入流 stdin
▶1:标准输出流 stdout
▶2:标准错误流 stderr
一般当我们用 > console.txt,实际是 1>console.txt的省略用法;< console.txt ,实际是 0 < console.txt的省略用法。
使用nohup命令提交作业: 如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:
nohup command > myout.file 2>&1 &
在上面的例子中,输出被重定向到myout.file文件中。
2>&1的意思 :是把标准错误(2)重定向到标准输出中(1),而标准输出又导入文件output里面,所以结果是标准错误和标准输出都导入文件output里面了。 至于为什么需要将标准错误重定向到标准输出的原因,那就归结为标准错误没有缓冲区,而stdout有。这就会导致 >output 2>output 文件output被两次打开,而stdout和stderr将会竞争覆盖,这肯定不是我门想要的.
【注】无论是否将 nohup
命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。
最后谈一下/dev/null文件的作用,这是一个无底洞,任何东西都可以定向到这里,但是却无法打开。 所以一般很大的stdou和stderr当你不关心的时候可以利用stdout和stderr定向到这里>./command.sh >/dev/null 2>&1
[拓展]管道命令
管道是一种通信机制,通常用于进程间的通信(也可通过socket进行网络通信),它表现出来的形式将前面每一个进程的输出(stdout)直接作为下一个进程的输入(stdin)
管道命令使用|
作为界定符号,管道命令与上面说的连续执行命令不一样。
管道命令必须要能够接受来自前一个命令的数据成为standard input继续处理才行。且管道命令仅能处理standard output,对于standard error output会予以忽略。
管道命令有:less
,more
,head
,tail
…等等都是可以接受standard input的命令。
而例如 ls
,cp
,mv
并不会接受standard input的命令,所以他们就不是管道命令了。
[拓展]命令执行顺序控制
通常情况下,开发者在终端只能执行一条命令,然后按下回车执行,那么执行多条命令的方法怎么样的? 示例如下:
#顺序执行多条(简单的顺序指令可以通过 ;来实现)
command1;command2;command3;
#有条件的执行多条命令
which command1 && command2 || command3
有条件的执行多条命令中符号含义:
&&
: 如果前一条命令执行成功则执行下一条命令,如果command1执行成功(返回0),则执行command2
||
:与&&命令相反,执行不成功时执行这个命令
$?
: 存储上一次命令的返回结果
进阶小故事之CPU深夜狂飙
傍晚时分,警报声乍起,整个Linux帝国都陷入了惊恐之中。
安全部长迅速召集大家商讨应对之策。
“诸位,突发情况,CPU占用率突然飙升,并且长时间没有降下来的趋势,CPU工厂的阿Q向我们表达了强烈抗议”
这时,一旁的kill命令说到:“部长莫急,叫top老哥看一下谁在占用CPU,拿到进程号pid,我把他干掉就好了”
此言一出,在座的大伙都点头赞许,惊恐之色稍解。
top命令站了起来,面露得意之色,说到:“大家请看好了”,说完,打印出了当前的进程列表:
众人瞪大了眼睛,瞅了半天,也没看出哪个进程在疯狂占用CPU,top老哥这下尴尬了。
这时,一旁的ps命令凑了上来,“让我来试试”
ps命令深吸了一口气,也打印出了进程列表。
然而,依旧没有任何可疑的进程。
“你俩怎么回事,为什么没有?”,安全部长有些不悦。
“部长,我俩都是遍历的 /proc/ 目录下的内容,按理说,所有的进程都会在这里啊,我也想不通为什么找不到···”,top老哥委屈的说到。
“遍历,怎么遍历的?”
“就是通过opendir/readdir这些系统调用函数来遍历的,这都是帝国提供的标准接口,应该不会出错,除非···”,说到这,top打住了。
“除非什么?”
“除非这些系统调用把那个进程给过滤掉了,那样的话我就看不到了,难道有人潜入帝国内核,篡改了系统调用?”
安全部长瞪大了眼睛,真要如此,那可是大事啊!
眼看部长急的团团转,一旁的netstat起身说到:“部长,我之前结识一好友,名叫unhide,捉拿隐藏进程是他的拿手好戏,要不请他来试试?”
部长大喜,“还犹豫什么,赶紧去请啊!”
“已经联系了,随后就到”
部长看着netstat,说到:“正好,趁着这个功夫,你先来看看现在有没有对外可疑的连接”
netstat点了点头,随后打印出了所有的网络连接信息:
“这个80端口的服务是我的”,nginx站了出来。
“这个6379端口服务是我的”,redis也站了出来。
“这个,9200是我的”,elasticsearch说到。
“3306那个是我的”
“8182是我的”
······
一阵嘈杂后,只剩下一个连接无人认领:
“部长,这八成就是躲在暗处那家伙的连接”,netstat说到。
安全部长思考片刻问到:“curl何在?来访问下这个IP地址,探探对方虚实”
curl站了出来,“来了来了”
curl小心翼翼的发送了一个HTTP请求过去,对方竟然回信了:
一行醒目的mining poll出现在大家面前。
“挖,挖矿病毒!”,top老哥叫了出来。
这一下,在场所有的人都倒吸了一口凉气。
部长赶紧叫防火墙firewall配置了一条规则,将这条连接掐断。
就在这时,unhide走了进来。
简单了解了情况后,unhide拍拍胸脯说到:“这事交给我了,一定把这家伙给揪出来”
随后,unhide一阵操作猛如虎,输出了几行信息:
众人皆凑了过来,瞪大了眼睛,unhide老哥果然不是盖的,果真发现了几个可疑分子。
top有点表示怀疑,问到:“敢问兄台用的什么路数,为何我等都看不到这几个进程的存在?”
unhide笑道:“没什么神秘的,其实我也是遍历 /proc/ 目录,和你们不同的是,我不用readdir,而是从进程id最小到最大,挨个访问 /proc/$pid 目录,一旦发现目录存在而且不在ps老哥的输出结果中,那这就是一个隐藏进程。”
一旁的ps笑道:“原来还有我的功劳呐”
“找到了,就是这家伙!”,netstat大声说到。
“你怎么这么肯定?”部长问到。
“大家请看,进程打开的文件都会在 /proc/pid/fd 目录下,socket也是文件,我刚看了一下,这个进程刚好有一个socket。再结合/proc/tcp信息,可以确定这个socket就是目标端口号7777的那一条!”
“好家伙!好家伙”,众人皆啧啧称赞。
“还等什么,快让我来干掉它吧!”,kill老哥已经按捺不住了。
“让我来把它删掉”,rm小弟也磨刀霍霍了。
部长摇头说到:“且慢,cp何在,把这家伙先备份到隔离目录去,以待秋后算账”
cp拷贝完成,kill和rm两位一起上,把背后这家伙就地正法了。
top赶紧查看了最新的资源使用情况,惊喜的欢呼:“好了好了,CPU占用率总算降下去了,真是大快人心”
天色已然不早,没多久,众人先后离开,帝国恢复了往日的平静。
不过,安全部长的脸上,仍然是一脸愁容。
“部长,病毒已经被清除,为何还是闷闷不乐呢?”,助理问到。
“病毒虽已清除,但却不知这家伙是如何闯入的,还有背后暗中保护隐藏它的人又是谁,这实让我在很忧心啊”
交互工具
secureCRT
(1)本地与远程传输文件方式
①通过SFTP标签页
secureCRT按下ALT+P 或[文件]–[连接SFTP标签页] 开启新的会话 进行ftp操作。
查看本地和远程对接目录可以通过:[选项]–[会话选项]–[SFTP标签页]
输入:help命令,显示该FTP提供的所有命令
pwd :查询linux主机所在目录(也就是远程主机目录)
lpwd:查询本地目录(一般指windows上传文件的目录:我们可以通过查看”选项“下拉框中的”会话选项“知道本地上传目录为:D:/我的文档)
ls:查询连接到当前linux主机所在目录有哪些文件
lls: 查询当前本地上传目录有哪些文件
lcd:改变本地上传目录的路径
cd: 改变远程上传目录
get 文件名称:将远程目录中文件下载到本地目录
put 文件名称:将本地目录中文件上传到远程主机(linux)
quit:断开FTP连接
②通过rz命令与sz命令
rz命令(Receive ZMODEM),使用ZMODEM协议,将本地文件批量上传到远程Linux/Unix服务器,注意不能上传文件夹。
当我们使用虚拟终端软件,如Xshell、SecureCRT或PuTTY来连接远程服务器后,使用rz命令可以上传本地文件到远程服务器。输入rz回车后,会出现文件选择对话框,选择需要上传文件,一次可以指定多个文件,上传到服务器的路径为当前执行rz命令的目录。
此外,可以在虚拟终端软件设置上传时默认加载的本地路径和下载的路径。如SecureCRT软件 -> Options -> session options -> X/Y/Zmodem 下可以设置上传和下载的目录。
命令格式:rz [选项]
选项 | 说明 |
---|---|
-a | ascii:以文本方式传输 |
-b | binary:以二进制方式传输,推荐使用 |
环境安装
JDK安装
MYSQL安装
防火墙-端口
systemctl status firewalld 查看firewall服务状态
systemctl restart firewalld.service 开放端口重启防火墙才能生效
firewall-cmd --list-ports 查看所有开启的端口,如果是阿里云,还需配置安全
组规则
firewall-cmd --list-all 查看防火墙所有信息
firewall-cmd --reload 更新防火墙规则
firewall-cmd --zone=public --add-port=8080/tcp --permanent
永久开放9000端口
firewall-cmd --zone=public --add-port=80-90/tcp --permanent
多端口永久开放
firewall-cmd --zone=public --remove-port=80/tcp --permanent
移除80端口号
【注】
--zone 作用域
--add-port=80/tcp 添加端口,格式为端口和通讯协议
--permanent 永久生效,没有此参数重启后失效
软件安装方式
-rpm JDK示例,并在线发布一个项目
-解压缩 tomcat示例,启动并通过外网访问,发布网站
-yum在线安装 docker示例,直接安装运行跑起来docker即可
JDK安装
(1)下载jdk8的压缩包
(2)上传压缩包到Linux
① 从windows本地上传压缩包到Linux: rz -b
(3)相关linux安装命令
① 检测当前系统是否存在java环境: java -version
② 检测jdk的版本信息:rpm -qa|grep jdk
③ 删除JDK环境:rpm -e --nodeps jdk_*
④ 开始安装java rpm:rpm -ivh jdk包名
⑤ 添加环境变量配置:vim /etc/profile
JDK小工具
(1)Jps命令
jps是jdk提供的一个查看当前java进程的小工具。其全程为JavaVirtual Machine Process Status Tool。
Jps命令(拓展)
含义
命令格式
jps [options ] [ hostid ]
-[options ]选项
-q:仅输出VM标识符,不包括classname,jar name,arguments in main method
-m:输出main method的参数
-l:输出完全的包名,应用主类名,jar的完全路径名
-v:输出jvm参数
-V:输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件
-Joption:传递参数到vm,例如:-J-Xms512m
-[hostid]选项
jps –v :输出jvm参数
MYSQL安装
(5)检查MYSQL相关配置状态
步骤一 : 官网下载tomcat9即可 ,apache-tomcat-9.0.22.tar.gz
步骤二 : linux命令
tar -zxvf apche-tomcat... 解压压缩包
./startup.sh 执行tomcat
./shutdown.sh 停止tomcat
[注]
1.上传完毕的项目直接购买自己的域名,备案解析过去即可。
2.域名解析后如果端口是80,http或者443-https 可以直接访问,如果是9000 8080,就需要通过apache或者niginx做一下反向代理即可,配置文件即可
cat /etc/redhat-release 检测CentOS 版本
yum -y install gcc 编译C工具
yum -y install gcc-c++ 编译C++工具
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine 官网版卸载旧版本
yum install -y yum-utils device-mapper-persistent-data lvm2
安装必须的软件包
yum-config-manager --add-repo http://mirrors.
aliyun.com/docker-ce/linux/centos/docker-ce.repo
设置stable镜像仓库(这里使用的是国内的)
yum makecache fast 更新Yum软件包索引
yum -y install docker-ce docker-ce-cli containerd.io
安装Docker CE
systemctl start docker 启动docker
docker version 查看docker版本
docker pull hello-world 从docker镜像仓库中拉去hello-world镜像
docker images 查看下载好了的情况
docker run hello-world 运行helloworld
ps -ef|grep docker 查看docker进程
[注]
1.gcc是拿来编译各种源代码的软件 所谓GCC包,就相当于安装GCC的安装包啦,类似WIN下的setup.exe
2.RPM是不需要GCC就可以装的,不过TAR包里都是源代码,你得自己编译才能装,所以一定要装GCC,不然无法装
3./usr/bin查看是否有gcc包
4.安装yum-utils,它提供一个yum-config-manager单元,同时安装的device-mapper-persistent-data和lvm2用于储存设备映射(devicemapper)必须的两个软件包。
elasticsearch及运行
下载安装包
downloads
linux操作
【注】
此处省略了上传安装包到linux的步骤(因为比较简单)
下面的Linux命令依次执行即可安装成功elasticsearch
Liniux下配置elasticsearch文件夹
getconf LONG_BIT 查看Linux是32位还是64位
groupadd elsearch 创建一个elsearch用户组
useradd elsearch -g elsearch 创建一个elsearch用户并放入elsearch用户组
chown -R elsearch:elsearch [解压后文件名] 将该elasticsearch文件更改为elsearch用户下
Liniux下创建elasticsearch数据文件和日志文件
mkdir /path 在linux根路径下创建一个path文件夹
chown -R elsearch:elsearch /path/ 将该文件夹更改为elsearch用户下且elsearch组
su -elsearch 进入elsearch用户中
mkdir -p to/data 创建多级目录也就是创建to目录和data目录
mkdir -p to/logs 创建多级目录也就是logs目录
Liniux下更改elasticsearch配置文件
【注】此处省略了进入es文件夹下的步骤(因为比较简单)
vim elasticsearch.yml 进入elasticsearch的配置文件
i 进入vim输入模式,此时修改可内容,如下图
esc 退出输入模式,切换为命令模式
: 进入底线模式
wq 保存文件,并退出该文件
Liniux下更改用户空间
su -root 切换到root用户下
sysctl -w vm.max_map_count=262144 将内存设置为262144
sysctl -a|grep vm.max_map_count 查看内存设置结果
vim /etc/sysctl.conf 进入系统设置文件内
加一行:vm.max_map_count=262144
Liniux下运行elasticsearch
【注】此处省略了进入es文件夹下的bin目录步骤(因为比较简单)
./elasticsearch 开始执行elastcsearch服务
./elasticsearch -d 若上面没有报错,可后台执行elasticsearch
curl 'http://自己配置的IP地址:9200/' 测试elasticsearch
程序员常用开发命令组合
(1)本地与远程传输文件方式