Linux安装

关于安装步骤此处不过多介绍了,我安装的CentOS 9

登录Xshell

先将虚拟机的IPV4方式改为自动,防止每次地址都会变化

1
2
3
4
地址:192.168.6.101(后两位可以自己设置)
子网掩码:255.255.255.0
网关:192.168.6.2
DNS服务器:192.168.6.2(与网关相同)

在Linux服务器上检查SSH服务是否正在运行
1
systemctl status sshd

如果没有运行,使用systemctl start sshd启动SSH服务。

之后登录Xshell新建一个会话

1
2
名称:自己根据喜好命名
主机:虚拟机的IP,我是192.168.6.101

用户名与密码指的是Linux的账号密码,需根据实际修改

磁盘管理

Linux和windows在资源管理上有什么区别?

  • window
    • 文件分别存储在不同磁盘下,如C盘,D盘。不同磁盘有不同的目录以及子文件。
  • Linux
    • Linux操作系统采用一个文档树来组织所有的资源。
    • 这棵树的根目录的名字叫做:/
    • / 目录下又有很多其他的子目录,比如:dev home lib …..

查看当前所在位置

  • pwd (print working direction)

查看当前所在的位置下的文件

  • ls
    list单词的缩写。ls可以列出当前所在位置下的子目录以及子文件
    注意:这种方式只列出文件或目录的名字。文件或目录更详细的信息没有。
  • ls -a
  • -a 是一个ls命令的参数,表示all,所有的意思。
  • -a 会将当前位置下所有的子文件以及子目录显示出来。包括隐藏文件以及隐藏目录。
  • 注意:在linux操作系统当中凡是目录或者文件的名字是以“.”开头的,它一定是隐藏的。
  • ls -l
    -l 参数可以列出该文件或目录的更详细的信息(不会显示隐藏文件)

    drwxr-xr-x. 2 root root 6 4月 18 10:26 公共
    ……
    drwxr-xr-x. 2 root root 6 4月 18 10:26 桌面
    -rw———-. 1 root root 993 4月 18 10:23 anaconda-ks.cfg

每列的含义
  • 第一列:d或-
    • d 表示是一个目录。
    • -表示是一个文件。
  • 第二列:rwxr-xr-x
    • 这个是该文件权限描述信息。
  • 第三列:2
    • 表示当前目录下有几个直接的子目录(注意:有两个隐藏的目录,分别是:. 和 ..)
  • 第四列:root
    • 这是该目录或文件的拥有者。
  • 第五列:root
    • 这是一个组的名字
    • 表示这个组叫做root组。
    • root用户属于root组的。
    • 假设:drwxr-xr-x. 2 bjpowernode haha 6 4月 18 10:26 公共。表示bjpowernode用户属于haha组的。
  • 第六列:文件或目录的大小,单位是字节。
  • 第七列:最后修改时间
  • 第八列:文件名
  • ls -al
    • a和l组合使用
    • al表示列出所有的文件的详细信息。
  • ll
    • 等同于:ls -l
  • ll -a
    • 等同于:ls -al
  • ls -al /home/bjpowernode

    • 查看/home/bjpowernode目录下所有的子文件以及子目录的详细信息。
  • 切换目录(cd命令:change directory)

    • cd 路径名
    • cd .. 回到上级目录
    • cd ../.. 回到上级目录的上级目录
    • cd / 回到根
    • cd /home/bjpowernode 切换到 /home/bjpowernode目录下
    • 路径包括:绝对路径和相对路径
      • 绝对路径:以/开始的都是绝对路径
      • 相对路径:没有以 / 开始的都是相对路径。相对路径永远都是相对于当前所在的位置而言。
  • clear 清屏

目录结构

/bin:
bin是binaries(二进制)的缩写,这个目录存放着系统的基本命令

/boot:
这里存放的是启动Linux时的一些核心文件,包括一些连接文件以及镜像文件

/dev:
dev是device的缩写,这个目录下存放的是Linux的外部设备文件,在Linux中访问设备的方式和访问文件的方式是相同的。

/etc:
etc是etcetera的缩写,这个目录存放的是系统的配置文件子目录

/lib:
lib是library的缩写,这个目录存放的是系统的动态连接共享库,作用类似于Windows里的DLL文件。几乎所以应用程序都会用到这些共享库

/media:
media是media的缩写,Linux系统会自动识别一些外部设备,例如U盘,光驱等等,这些设备会被挂载到/media目录下。

/mnt:
mnt是mount的缩写,作用是让用户临时挂载别的文件系统,我们可以将光驱挂载在/mnt/上,然后进入该目录就能看到光驱里的内容了
/opt:
opt是optional(可选的)的缩写,这是给主机额外安装软件所摆放的目录。比如安装oracle数据库就可以放到这个目录。

/proc:
proc是process(进程)的缩写,这是一种伪文件系统(也就是虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,是系统文件的映射,我们可以通过直接访问这个目录来获取系统信息。
这个目录的内容不在硬盘上而是在内存里,我们可以直接修改里面某些文件,比如通过下面的命令来拼比主机ping命令,使别人无法ping你的机器

1
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

/root:
root是root的缩写,这个目录存放的是root用户的主目录。

/sbin:
sbin是super user binaries(超级用户二进制文件)的缩写,这个目录存放的是系统管理员使用的系统管理程序。

/srv:
srv是service的缩写,这个目录存放的是服务的数据。

/sys:
sys是system的缩写,这个目录存放的是系统的设备信息。
该目录下安装了2.6内核中新出现的一个文件系统 sysfs。sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的 devpts 文件系统
该文件系统是内核设备树的一个直观反映。
当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。

/tmp:
tmp是temporary的缩写,这个目录存放的是临时文件。

/usr:
usr是user的缩写,这个目录存放的是用户的主目录。类似windows下的program files目录。
/usr/bin:
usr/bin是user binaries的缩写,这个目录存放的是用户的二进制文件

/usr/src:
内核源文件默认的放置目录

/var:
var是variable的缩写,这个目录存放的是变量。通常将经常被修改的目录放在这个目录下。包括各种日志文件。

Linux常用命令

常用技巧

  • tab键自动补全
  • 连续按两次tab键,给出操作提示
  • 使用上下箭头快速调出使用过的命令
  • 使用clear命令或者快捷键ctrl+L来快速清屏

命令格式

Linux命令格式如下

1
command [-options] [parameter]

说明:

  • command:命令名
  • [-options]:选项,可用来对命令进行控制,也可以省略
  • [parameter]:传给命令的参数,可以是0个,1个或多个

注意:

  • []代表可选命令名
  • 选项,参数之间需要用空格进行分隔

vi和vim

概述

vi是Linux操作系统提供的一个编辑器,vim是vi的升级版

  • vim更加适合coding,也就是编码,开发,但需要自己使用yum install vim安装。
  • vi比较适合编辑普通文件,类似windows中的记事本。

vi编辑器使用

  • 新建文件
    • touch hello.java 表示在当前位置创建一个hello.java的文件
  • 打开文件
    • vi hello.java(打开当前路径下的Hello.java)
    • vi /home/bjpowernode/Hello.java(打开/home/bjpowernode目录下的Hello.java文件。)
  • 两个模式
    • 命令模式:vi进入命令模式后,会显示一个>号,表示当前是命令模式。
    • 编辑模式:在命令模式下输入i命令,就可以切换到编辑模式。
    • 从编辑模式切换到命令模式:按一下esc键即可。( 如果分不清现在是编辑模式还是命令模式的话,干脆按一下esc,这样可以保证一定是命令模式,命令模式下可以输入命令。例如:dd命令,可以删除一行。)
  • 退出文件

    保存只有在命令模式下进行

    • :wq 这是一个命令,这个命令可以保存并退出。
    • :q! 这是一个命令,这个命令可以不保存并退出。
  • 也可以使用vi编辑器来创建文件
    • 第一步:vi abc.txt
    • 第二步:在命令模式下保存并退出,此时文件便会新建
  • 编辑命令
    • dd:删除光标所在行
    • yy:复制光标所在行到缓冲区
    • p:粘贴缓冲区中的内容
    • gg:光标回到文件第一行
    • G:光标回到文件最后一行
    • ^ :光标移动至当前行的行首
    • $ :光标移动至当前行的行尾
    • /关键字:按斜杠/键,可以输入想搜索的字符,然后确定进行搜索,如果第一次查找的关键字不是想要的,可以一直按 n 键往后查找到想要的关键字为止
    • o命令:在下一行插入。
    • x命令:命令行模式下,x命令会删除单个字符。

文件管理命令

什么是文件管理?

  • 新建目录,新建文件,删除文件,删除目录,复制文件,移动文件,重命名文件

新建(mkdir)

新建文件和新建目录的区别就是是否有文件后缀

  • 新建目录
    • mkdir abc (mkdir是新建目录的命令,abc是目录名)
    • mkdir -p a/b/c (-p为创建多级目录)
  • 新建文件
    • touch abc.txt (touch是新建文件的命令,abc.txt是文件名)
    • touch a.txt,b.txt,c.txt (一次性创建a.txt,b.txt,c.txt三个文件)

删除(rm)

rm命令,rm是remove单词的缩写

  • 删除文件
    • rm 文件名 ——这种方式会询问是否删除,输入y表示删除,输入n表示取消
      • rm abc.txt
      • rm a.txt,b.txt,c.txt (一次性删除a.txt,b.txt,c.txt三个文件)
    • 不想询问,有没有办法强制删除?
      • rm -f 文件名
      • rm -f *.java (一次性删除当前目录下所有java文件)
  • 删除目录
    • 删除目录时必须添加-r参数,表示删除一个目录,或者递归删除目录下所有子目录及子文件
    • rm -r a/b/c (删除a/b/c目录,这种方式依旧需要用户再次确认)
    • rm -rf a/b/c (强制删除a/b/c目录,这种方式不需要用户再次确认)

复制(cp)

  • 复制文件
    • cp a.txt b.txt —— 复制当前目录下的a.txt文件到当前目录下的b.txt文件
    • cp a.txt /home/bjpowernode/ (复制a.txt文件到/home/bjpowernode目录下)
  • 复制目录
    • -r 参数表示递归复制 -f 参数表示强制复制
    • cp -r a/b/c /home/bjpowernode/ (复制a/b/c目录到/home/bjpowernode目录下)
    • cp -rf a/b/c /home/bjpowernode/ (递归强制复制a/b/c目录到/home/bjpowernode目录下)

移动(mv)

  • mv hello.txt x(把当前目录下的hello.txt文件移动到x目录下)
  • mv /home/bjpowernode/hello.txt a/b/c/ (把/home/bjpowernode/hello.txt文件移动到a/b/c目录下)
  • mv a/b/c /home/bjpowernode/ (把a/b/c目录下的文件移动到/home/bjpowernode目录下,保持a/b目录下的文件不变)

帮助查询

  • man命令 :查看帮助
    • man ls 查看ls命令的帮助
    • man touch 查看touch命令的帮助
  • man命令会跳转到一个文件里,里面有命令的详细帮助信息
    • 按一下空格键可以向下翻页
    • 按一下b键可以向上翻页
    • 按一下q键可以退出
  • --help : 帮助查询
    • ls —help 查看ls命令的帮助
    • touch —help 查看touch命令的帮助
  • —help会直接把命令的帮助信息打印在屏幕上
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
用法:mkdir [选项]... 目录...
若指定<目录>不存在则创建目录。

必选参数对长短选项同时适用。
-m, --mode=模式 设置权限模式(类似chmod),而不是 a=rwx 减 umask
-p, --parents 需要时创建目标目录的上层目录,但即使这些目录已存在
也不当作错误处理
-v, --verbose 每次创建新目录都显示信息
-Z 设置每个创建的目录的 SELinux 安全上下文为默认类型
--context[=CTX] 类似 -Z,或如果指定了 CTX,则将 SELinux 或 SMACK 安全
上下文设置为 CTX 对应的值
--help 显示此帮助信息并退出
--version 显示版本信息并退出

GNU coreutils 在线帮助:<https://www.gnu.org/software/coreutils/>
请向 <http://translationproject.org/team/zh_CN.html> 报告任何翻译错误
完整文档 <https://www.gnu.org/software/coreutils/mkdir>
或者在本地使用:info '(coreutils) mkdir invocation'

软连接和硬链接

软链接和硬链接都是文件系统下的一种特殊文件,用于链接文件。

软连接

软连接其实就是windows下的快捷方式,主要为了方便操作。

  • 软连接的作用:
    • 软连接可以跨文件系统
    • 软连接可以链接目录

软连接和目标连接实际上是两个不同的文件,软连接存储的是目标文件的路径,一旦目标文件被删除,软连接也就失效了

  • 软连接的创建:
    • ln -s hello.txt hello2.txt
    • 表示给目标文件hello.txt创建一个软连接文件hello2.txt
  • 查看文件内容:cat命令
    • cat hello2.txt
    • 查看hello2.txt的内容,发现内容是hello.txt的内容

inode索引

inode是Index node的缩写,意思为索引节点号
在Linux系统中,任何文件都有自己的Inode号,不会重复,Linux系统就是根据inode号来区分文件的。
如何查看一个文件的inode号呢?

  • 可以使用ls -i命令查看文件的inode号
  • 可以使用stat命令查看文件的inode号
    1
    2
    3
    4
    # 通过测试可以发现软连接和目标连接是完全不同的两个文件,因为inode号不同
    ls -li hello2.txt hello.txt
    1320587 lrwxrwxrwx. 1 summery summery 9 8月 24 22:09 hello2.txt -> hello.txt
    748198 -rw-r--r--. 1 summery summery 0 8月 24 22:08 hello.txt

硬链接

硬链接主要用来文件备份

  • 创建硬链接
    • 将软连接创建时的-s去掉即为创建软连接
    • ln hello.txt hello3.txt(给hello.txt创建硬链接)
      1
      2
      3
      4
      # 通过测试发现两个文件的inode号相同,即两者其实是同一个文件
      [summery@192 c]$ ll -i hello.txt hello4.txt
      748198 -rw-r--r--. 2 summery summery 0 8月 24 22:08 hello4.txt
      748198 -rw-r--r--. 2 summery summery 0 8月 24 22:08 hello.txt

      操作硬链接的文件,目标文件会改变吗?操作目标文件,硬链接会改变吗?
      操作任一方文件,另一边都会做出相同变化,因为两者本质上是同一个文件。

硬链接的特点

  1. 硬链接主要作用是做重要文件的备份。
  2. 目标文件被删除,只要硬链接还在,那么硬链接指向的文件依然存在。硬链接被删除后,目标文件也还在。
    总结一句话:目标文件和硬链接只要一个存在,那么文件就没有被删除
  3. 硬链接与复制粘贴机制不同,硬链接会随一方的修改而变化,而复制粘贴机制不会。

系统命令

  • 显示系统当前时间:date
    1
    2
    [root@192 c]$ date
    1900年 01月 01日 星期日 00:00:00 CST
  • 切换用户
    • su 用户名 切换到指定用户
  • 查看系统进程

    • ps -ef 查看所有进程

      ps [命令参数]
      常用参数:
      -e :显示当前所有进程
      -f :显示 UID,PPID,C 与 STIME 栏位信息
      UID:拥有改程序的用户
      PID:程序的进程 id
      PPID:父进程的 id
      C: CPU 使用的资源百分比
      STIME :系统启动时间
      TTY:登录系统的终端位置(客户端的标识)
      TIME:使用掉的 CPU 时间
      CMD:进程是有哪些程序启动的

  • kill进程

    • kill 进程号 正常结束进程
    • kill -9 进程号 强制结束进程
  • 重启
    • reboot
  • 关机
    • shutdown -h now

网络通信

  • ifconfig
    • 查看网卡的ip地址
    • 在Windows是:ipconfig,在Linux是:ifconfig
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      [root@192 c]# ifconfig
      ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
      inet 192.168.6.101 netmask 255.255.255.0 broadcast 192.168.6.255
      inet6 fe80::20c:29ff:fec2:69bb prefixlen 64 scopeid 0x20<link>
      ether 00:0c:29:c2:69:bb txqueuelen 1000 (Ethernet)
      RX packets 2166 bytes 196661 (192.0 KiB)
      RX errors 0 dropped 0 overruns 0 frame 0
      TX packets 1894 bytes 238011 (232.4 KiB)
      TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

      lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
      inet 127.0.0.1 netmask 255.0.0.0
      inet6 ::1 prefixlen 128 scopeid 0x10<host>
      loop txqueuelen 1000 (Local Loopback)
      RX packets 29 bytes 2821 (2.7 KiB)
      RX errors 0 dropped 0 overruns 0 frame 0
      TX packets 29 bytes 2821 (2.7 KiB)
      TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  • ping
    • 查看计算机之间是否可以通信
    • ping 目标主机的ip地址
    • ping 目标主机的域名
  • curl
    • 模拟用户访问,模拟浏览器行为,获取目标主机的响应数据
      1
      2
      3
      4
      curl https://www.baidu.com/
      <!DOCTYPE html>
      <!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=https://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');
      </script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>
  • wget

管道和重定向

  • cat命令
    • 将文件中的内容打印出来
    • cat a.txt(打印a.txt文件的所有内容)
  • grep命令
    • 在某段内容中搜索
    • grep 搜索的内容 文件名
    • grep 192 a.txt(在a.txt文件中搜索192)
  • 管道符: |
    • 连接多个命令,前一个命令的输出作为后一个命令的输入,可以叠加
    • 命令1 | 命令2
    • ps -ef | grep redis(查看redis进程)
  • 重定向符
    • 将命令的输出结果保存到文件中
      1
      2
      > : 将原文件全部清空之后再写入
      >>: 在原文件内容的末尾追加写入
    • ps -ef > a.txt(将所有进程信息保存到a.txt文件中)
    • ps -ef >> a.txt(将所有进程信息追加保存到a.txt文件中)

文件的压缩和解压缩

tar是在Linux系统中完成压缩和解压缩的命令,压缩后的文件被称为归档文件

tar命令的常用参数:

  • z:指定是否使用gzip压缩方式压缩。(扩展名通常为:tar.gz。特点:速度最快)
  • j:是否需要用 bzip2 压缩方式压缩。(扩展名通常为:tar.bz2。特点:体积最小)
  • c:创建压缩(create)
  • x:解压缩
  • v:是否在压缩的过程中显示文件
  • f:指定归档文件名(file)。f参数后面必须紧跟文件名,不能在f参数后面再加其他参数。
  • t:查看 tarfile 里面的文件
  • C:指定解压到的具体目录。注意是大写C。
    注意: c、x、t三个参数不能共存,只能出现一个
  • 压缩
    • tar -czvf 归档文件名.tar.gz 要压缩的文件1 要压缩的文件2 …
    • tar -czvf redis.tar.gz redis.conf
    • tar -czvf redis.tar.gz *.java
  • 解压缩
    • tar -xzvf 归档文件名.tar.gz
    • tar -xzvf redis.tar.gz
    • tar -xzvf redis.tar.gz -C /usr/local/redis (将redis压缩包解压到该目录下)
  • 查看压缩文件
    • tar -tvf 归档文件名.tar.gz

      查找命令

      find

      作用:在指定目录下查找文件
      语法:find dirName -option fileName

      说明:

      • dirName:指定目录
      • -option:一般指定-name(根据文件名称来查找)
      • fileName:可以使用通配符的方式

查看文件内容

查看文件内容的常用命令:

  • cat 和 tac
  • more 和 less
  • head 和 tail
  • nl
  • tailf
  • cut
  • echo
  • sed
  • grep

cat命令

cat命令会一次性将文件内容完整的打印出来,故不适合大文件

用法:cat [选项]… [文件]…
输出所有指定文件并将结果写到标准输出。
如果没有指定文件,则从标准输入读取。
常用选项:
-n, 对输出的所有行编号
-b, 对输出的所有行编号(不含空白行)
-t, 将制表符(tab)显示为^I
-e, 在每行结束处显示”$”
-s, 当连续空白行数量大于1时,合并为1个空白行

cat命令的原理:

  • cat HelloWorld.txt
  • cat命令会将文件内容读取到内存中,然后输出到终端
  • cat命令在没有指定输出到哪里的时候,默认输出到终端
  • cat命令在不指定读取源的时候,默认读取标准输入
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Hello world!
    我在制表符之后
    我在制表符之前



    我前面有三个空白行

    我前面只有一个空白行
    1
    2
    3
    4
    5
    6
    7
    我是hello2.txt
    我是hello2.txt而且我前面还是个制表符




    我是hello2.txt而且我前面好几个空白行
  • 显示文件内容并添加行号
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [summery@192 c]$ cat -n hello.txt
    1 Hello world!
    2 我在制表符之后
    3 我在制表符之前
    4
    5
    6
    7 我前面有三个空白行
    8
    9 我前面只有一个空白行
    10
    11
    12 我前面有两个空白行
  • 显示文件内容并添加行号,但空白行不加行号
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [summery@192 c]$ cat -b hello.txt
    1 Hello world!
    2 我在制表符之后
    3 我在制表符之前



    4 我前面有三个空白行

    5 我前面只有一个空白行


    6 我前面有两个空白行
  • 查看文件所有内容,将制表符显示为^|
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [summery@192 c]$ cat -t hello.txt
    Hello world!
    ^IM-fM-^HM-^QM-eM-^\M-(M-eM-^HM-6M-hM-!M-(M-gM-,M-&M-dM-9M-^KM-eM-^PM-^N
    M-fM-^HM-^QM-eM-^\M-(M-eM-^HM-6M-hM-!M-(M-gM-,M-&M-dM-9M-^KM-eM-^IM-^M^I^I



    M-fM-^HM-^QM-eM-^IM-^MM-iM-^]M-"M-fM-^\M-^IM-dM-8M-^IM-dM-8M-*M-gM-)M-:M-gM-^YM-=M-hM-!M-^L

    M-fM-^HM-^QM-eM-^IM-^MM-iM-^]M-"M-eM-^OM-*M-fM-^\M-^IM-dM-8M-^@M-dM-8M-*M-gM-)M-:M-gM-^YM-=M-hM-!M-^L


    M-fM-^HM-^QM-eM-^IM-^MM-iM-^]M-"M-fM-^\M-^IM-dM-8M-$M-dM-8M-*M-gM-)M-:M-gM-^YM-=M-hM-!M-^L
  • 查看文件所有内容,在每行结尾处显示”$”
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [summery@192 c]$ cat -e hello.txt
    Hello world!$
    M-fM-^HM-^QM-eM-^\M-(M-eM-^HM-6M-hM-!M-(M-gM-,M-&M-dM-9M-^KM-eM-^PM-^N$
    M-fM-^HM-^QM-eM-^\M-(M-eM-^HM-6M-hM-!M-(M-gM-,M-&M-dM-9M-^KM-eM-^IM-^M $
    $
    $
    $
    M-fM-^HM-^QM-eM-^IM-^MM-iM-^]M-"M-fM-^\M-^IM-dM-8M-^IM-dM-8M-*M-gM-)M-:M-gM-^YM-=M-hM-!M-^L$
    $
    M-fM-^HM-^QM-eM-^IM-^MM-iM-^]M-"M-eM-^OM-*M-fM-^\M-^IM-dM-8M-^@M-dM-8M-*M-gM-)M-:M-gM-^YM-=M-hM-!M-^L$
    $
    $
    M-fM-^HM-^QM-eM-^IM-^MM-iM-^]M-"M-fM-^\M-^IM-dM-8M-$M-dM-8M-*M-gM-)M-:M-gM-^YM-=M-hM-!M-^L$
  • 查看文件所有内容,合并多个连续的空白行为一个空白行
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [summery@192 c]$ cat -s hello.txt
    Hello world!
    我在制表符之后
    我在制表符之前

    我前面有三个空白行

    我前面只有一个空白行

    我前面有两个空白行
  • 一次查看多个文件
    先后打印每个文件的内容
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    [summery@192 c]$ cat hello.txt hello2.txt
    Hello world!
    我在制表符之后
    我在制表符之前



    我前面有三个空白行

    我前面只有一个空白行


    我前面有两个空白行
    我是hello2.txt
    我是hello2.txt而且我前面还是个制表符




    我是hello2.txt而且我前面好几个空白行
  • 使用cat时,不指定查看的文件
    1
    2
    3
    4
    5
    [summery@192 c]$ cat
    //默认从标准输入流中读取数据并输出,按Ctrl+C结束输入
    我是键盘上输入的文字
    我是键盘上输入的文字
    ^C
  • 使用cat新建文件
    1
    2
    3
    4
    5
    [summery@192 c]$ cat >hello3.txt
    我是hello3.txt
    ^C
    [summery@192 c]$ cat hello3.txt
    我是hello3.txt
  • 使用cat合并文件
    将文件内容逐个添加到新的文件中
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    [summery@192 c]$ cat hello.txt hello2.txt >hello4.txt
    [summery@192 c]$ cat hello4.txt
    Hello world!
    我在制表符之后
    我在制表符之前



    我前面有三个空白行

    我前面只有一个空白行


    我前面有两个空白行
    我是hello2.txt
    我是hello2.txt而且我前面还是个制表符




    我是hello2.txt而且我前面好几个空白行
  • 加上行号后输出到另一个文件
    “>”默认为覆盖输出,使用”>>”可以追加输出
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [summery@192 c]$ cat -n hello.txt > test.txt
    [summery@192 c]$ cat test.txt
    1 Hello world!
    2 我在制表符之后
    3 我在制表符之前
    4
    5
    6
    7 我前面有三个空白行
    8
    9 我前面只有一个空白行
    10
    11
    12 我前面有两个空白行
  • 清空文件内容
    1
    2
    3
    [summery@192 c]$ cat /dev/null > test.txt
    [summery@192 c]$ cat test.txt
    [summery@192 c]$

tac命令

用的较少,一般不用

用法:tac [选项]… [文件]…
将每个指定文件按行倒置并写到标准输出。

如果没有指定文件,或者文件为”-“,则从标准输入读取。

必选参数对长短选项同时适用。
-b 在行前而非行尾添加分隔标志
-r 将分隔标志视作正则表达式来解析
-s 使用指定字符串代替换行作为分隔标志

more命令

  • 作用:以分页的形式查看文件内容
  • 语法:more [选项] <文件>

more命令cat命令的相同点和不同点:

  • 相同点:more和cat在开始读取文件的时候,都是一次性的将文件全部内容装载到缓存中。
  • 不同点:cat是一次性的全部输出打印。more可以进行部分打印(一屏一屏的打印)。

    常用选项:

    -u 禁止显示下划线和粗体
    -每个屏幕的行数
    +从行号开始显示文件
    +/从匹配的位置前两行开始显示内容
    -p 以清除原内容的方式进行翻页。

    常用操作:

    回车键 【显示下一行】
    空格键 【显示下一页】
    ctrl + b 【显示上一页】
    = 【显示行号】
    :f 【显示文件名的同时显示行号】
    q 【退出more命令】

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    2021.10.1 zhangsan
    2021.10.2 lisi
    2021.10.3 wangwu
    2021.10.4 zhaoliu
    2021.10.5 admin
    2021.10.6 zhangsan
    2021.10.7 lisi
    2021.10.8 wangwu
    2021.10.9 zhaoliu
    2021.10.10 qianqi
    2021.10.11 zhouyu
    2021.10.12 huanggai
    2021.10.13 zhugeliang
    2021.10.14 simayi
    2021.10.15 maimaiti
    2021.10.16 erdaye
    2021.10.17 sandaye
    2021.10.18 zhangsan
    2021.10.19 lisi
    2021.10.20 wangwu
    2021.10.21 zhaoliu
    2021.10.22 qianqi
    2021.10.23 zhoubapi
    2021.10.24 doudizhu
    2021.10.25 nongmin
    2021.10.26 sunwukong
    2021.10.27 zhubajie
    2021.10.28 shaseng
    2021.10.29 wujing
    2021.10.30 baigujing
    2021.10.31 java
    2021.11.1 oracle
    2021.11.2 mysql
    2021.11.3 jdbc
    2021.11.4 servlet
    2021.11.5 jsp
    2021.11.6 spring
    2021.11.7 mybatis
    2021.11.8 springmvc
    2021.11.9 web
    2021.11.10 html
    2021.11.11 css
    2021.11.12 java
    2021.11.13 sun
    • 案例一:从第三行起,查看文件内容
      1
      more +3 test.txt
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      2021.10.3 wangwu
      2021.10.4 zhaoliu
      2021.10.5 admin
      2021.10.6 zhangsan
      2021.10.7 lisi
      2021.10.8 wangwu
      2021.10.9 zhaoliu
      2021.10.10 qianqi
      2021.10.11 zhouyu
      2021.10.12 huanggai
      2021.10.13 zhugeliang
      2021.10.14 simayi
      2021.10.15 maimaiti
      2021.10.16 erdaye
      2021.10.17 sandaye
      2021.10.18 zhangsan
      2021.10.19 lisi
      2021.10.20 wangwu
      2021.10.21 zhaoliu
      2021.10.22 qianqi
      2021.10.23 zhoubapi
      2021.10.24 doudizhu
      2021.10.25 nongmin
      2021.10.26 sunwukong
      2021.10.27 zhubajie
      2021.10.28 shaseng
      2021.10.29 wujing
      2021.10.30 baigujing
      2021.10.31 java
      2021.11.1 oracle
      2021.11.2 mysql
      2021.11.3 jdbc
      2021.11.4 servlet
      2021.11.5 jsp
      2021.11.6 spring
      2021.11.7 mybatis
      2021.11.8 springmvc
      2021.11.9 web
      2021.11.10 html
      2021.11.11 css
      2021.11.12 java
      2021.11.13 sun
    • 案例二:每屏显示四条记录
      1
      more -4 test.txt
      1
      2
      3
      4
      5
      2021.10.1 zhangsan
      2021.10.2 lisi
      2021.10.3 wangwu
      2021.10.4 zhaoliu
      --更多--(8%)
    • 案例三:从文件中查找“java”字符串的行(从匹配的位置前两行开始显示)
      1
      more +/java test.txt
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18

      ...跳过
      2021.10.29 wujing
      2021.10.30 baigujing
      2021.10.31 java
      2021.11.1 oracle
      2021.11.2 mysql
      2021.11.3 jdbc
      2021.11.4 servlet
      2021.11.5 jsp
      2021.11.6 spring
      2021.11.7 mybatis
      2021.11.8 springmvc
      2021.11.9 web
      2021.11.10 html
      2021.11.11 css
      2021.11.12 java
      2021.11.13 sun
    • 案例四:查看进程,每五条为一屏,翻屏时清空原内容
      1
      ps -ef | more -5 -p
      1
      2
      3
      4
      5
      root           1       0  0 08:43 ?        00:00:02 /usr/lib/systemd/systemd rhgb --switched-root --system --deserialize 31
      root 2 0 0 08:43 ? 00:00:00 [kthreadd]
      root 3 2 0 08:43 ? 00:00:00 [rcu_gp]
      root 4 2 0 08:43 ? 00:00:00 [rcu_par_gp]
      --更多--

less命令

less命令用于查看文件内容,并且支持分页显示。应该说是Linux正统的查看文件内容的工具,less的用法相比more·更弹性`。可以使用pageuppagedown等按键来往前往后翻看文件,除此之外less还拥有更多的搜索功能。
用法:
less [选项] 文件

常用选项:

-g 只标志当前搜索到的关键词所在行
-I 忽略搜索时的大小写(注意:是大写I)
-m 显示类似more命令的百分比
-N 显示每行的行号
+num 从第num行开始显示

搜索:

/字符串:向下搜索“字符串”的功能
?字符串:向上搜索“字符串”的功能

n:重复前一个搜索(与 / 或 ? 有关)
N:反向重复前一个搜索(与 / 或 ? 有关)

滚动:

y 向前滚动一行
回车键 向后滚动一行
u 向前滚动半页
d 向后滚动半页

翻页:

b 向前翻一页
space 向后翻一页
pageup 向上翻动一页
pagedown 向下翻动一页

移动:

g 移动到第一行
ng 移动到指定行(n是行号)
G 移动到最后一行

显示:

= 显示详细信息(第几行,共多少行,内容的字节数量等)

编辑:

v 使用vim编辑器进行编辑

退出:

q 退出less 命令

  • 可以使用less命令标记兴趣点
    • 在感兴趣的地方添加标记:
      • 使用m命令添加标记
      • 输入标记名称,然后按回车键
    • 想回到感兴趣的位置时
      • 先按’键
      • 输入标记名称,然后按回车键
    • 删除标记:
      • 使用d命令删除标记
  • less命令实时监控文件动态变化
    • 第一步:在窗口1执行: less+F log.txt
    • 第二步:在窗口2执行: ps -ef >> log.txt
      注意:log.txt是一个文件名,只有机器自动写入或通过输出重定向写入才可以被监控
      less命令查看多个文件
  • less hello.txt hello2.txt
  • 输入: n 跳转到log2.txt
  • 输入: p 跳转到log.txt
    less命令可以结合管道一起使用
  • ps -ef | less -N

head命令

  • head命令用于查看文件头部内容
    用法:

    • head [选项] [文件]
    • 默认输出指定文件的前10行,如果指定多个文件,在每次输出之前附加文件名称作为头部

    参数:

    • -q 不显示文件名
    • -n [行数]:指定输出的行数
    • -c [字节数]:指定输出的字节数

tail命令

  • tail命令用于查看文件尾部内容
    用法:
    • tail [选项] [文件]
    • 默认输出指定文件的最后10行,如果指定多个文件,在每次输出之前附加文件名称作为头部

参数:

  • -q 不显示文件名
  • -f 动态监控文件变化,随文件增长即时输出新增数据
  • -n [行数]:指定输出的行数
  • -c [字节数]:指定输出的字节数

nl命令

nl命令是专业的显示行号命令,其默认的结果与cat -n命令不太一样。nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等等的功能。

用法如下:

  • nl -b a 所有行添加行号,包括空白行;
  • nl -b w 给行添加行号,包括空白行; nl -b t 给行添加行号,不包括空白行(默认行为,和直接使用 nl 一样效果);
  • nl -n ln 行号在自己栏位左侧显示;
  • nl -n rn 行号在自己栏位的右侧显示 ;
  • nl -n rz 显示行号,行号栏位不满时,自动补0 ;
  • nl -w 行号栏位的占用的位数。
1
2
3
4
5
6
7
8
9
10
11
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello World");
}
}

class UserService{
public void logout(){
System.out.println("system log out!");
}
}

执行以下命令:正常打开

1
2
3
4
5
6
7
8
9
10
11
12
[summery@192 c]$ nl helloworld.java
1 public class HelloWorld{
2 public static void main(String[] args){
3 System.out.println("Hello World");
4 }
5 }

6 class UserService{
7 public void logout(){
8 System.out.println("system log out!");
9 }
10 }

执行以下命令:显示所有行的行号,包括空白行
1
2
3
4
5
6
7
8
9
10
11
12
13
[summery@192 c]$ nl -b a helloworld.java
1 public class HelloWorld{
2 public static void main(String[] args){
3 System.out.println("Hello World");
4 }
5 }

6
7 class UserService{
8 public void logout(){
9 System.out.println("system log out!");
10 }
11 }

执行以下命令:行号在行号栏左侧显示
1
2
3
4
5
6
7
8
9
10
11
12
13
[summery@192 c]$ nl -n ln helloworld.java
1 public class HelloWorld{
2 public static void main(String[] args){
3 System.out.println("Hello World");
4 }
5 }

6 class UserService{
7 public void logout(){
8 System.out.println("system log out!");
9 }
10 }


执行以下命令:行号在行号栏右侧显示
1
2
3
4
5
6
7
8
9
10
11
12
[summery@192 c]$ nl -n rn helloworld.java
1 public class HelloWorld{
2 public static void main(String[] args){
3 System.out.println("Hello World");
4 }
5 }

6 class UserService{
7 public void logout(){
8 System.out.println("system log out!");
9 }
10 }

执行以下命令:行号栏自动补0
1
2
3
4
5
6
7
8
9
10
11
12
[summery@192 c]$ nl -n rz helloworld.java
000001 public class HelloWorld{
000002 public static void main(String[] args){
000003 System.out.println("Hello World");
000004 }
000005 }

000006 class UserService{
000007 public void logout(){
000008 System.out.println("system log out!");
000009 }
000010 }

执行以下命令:设置栏位的字符数量
1
2
3
4
5
6
7
8
9
10
11
12
[summery@192 c]$ nl -n rz -w 3 helloworld.java
001 public class HelloWorld{
002 public static void main(String[] args){
003 System.out.println("Hello World");
004 }
005 }

006 class UserService{
007 public void logout(){
008 System.out.println("system log out!");
009 }
010 }

tailf命令

与tail -f命令类似,tailf命令用于监控文件变化,但不同的是,如果文件不增长,他不会去访问磁盘文件。tailf特别适合便携机上追踪日志文件,因为他省电且减少了磁盘访问。
tailf命令不是个脚本,而是一个用C代码编译后的二进制执行文件,某些Linux安装之后没有这个命令,需要手动安装。
CentOS安装tailf命令:
第一步: cd命令切换到/usr/local目录下,新建tailf.c文件,文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/* tailf.c -- tail a log file and then follow it 
* Created: Tue Jan 9 15:49:21 1996 by faith@acm.org
* Copyright 1996, 2003 Rickard E. Faith (faith@acm.org)
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
* less -F and tail -f cause a disk access every five seconds. This
* program avoids this problem by waiting for the file size to change.
* Hence, the file is not accessed, and the access time does not need to be
* flushed back to disk. This is sort of a "stealth" tail.
*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <malloc.h>
#include <sys/stat.h>
//#include "nls.h"
#define _(s) s

static size_t filesize(const char *filename)
{
struct stat sb;

if (!stat(filename, &sb)) return sb.st_size;
return 0;
}

static void tailf(const char *filename, int lines)
{
char **buffer;
int head = 0;
int tail = 0;
FILE *str;
int i;

if (!(str = fopen(filename, "r"))) {
fprintf(stderr, _("Cannot open \"%s\" for read\n"), filename);
perror("");
exit(1);
}

buffer = malloc(lines * sizeof(*buffer));
for (i = 0; i < lines; i++) buffer[i] = malloc(BUFSIZ + 1);

while (fgets(buffer[tail], BUFSIZ, str)) {
if (++tail >= lines) {
tail = 0;
head = 1;
}
}

if (head) {
for (i = tail; i < lines; i++) fputs(buffer[i], stdout);
for (i = 0; i < tail; i++) fputs(buffer[i], stdout);
} else {
for (i = head; i < tail; i++) fputs(buffer[i], stdout);
}
fflush(stdout);

for (i = 0; i < lines; i++) free(buffer[i]);
free(buffer);
}

int main(int argc, char **argv)
{
char buffer[BUFSIZ];
size_t osize, nsize;
FILE *str;
const char *filename;
int count;

//setlocale(LC_ALL, "");
//bindtextdomain(PACKAGE, LOCALEDIR);
//textdomain(PACKAGE);

if (argc != 2) {
fprintf(stderr, _("Usage: tailf logfile\n"));
exit(1);
}

filename = argv[1];

tailf(filename, 10);

for (osize = filesize(filename);;) {
nsize = filesize(filename);
if (nsize != osize) {
if (!(str = fopen(filename, "r"))) {
fprintf(stderr, _("Cannot open \"%s\" for read\n"), filename);
perror(argv[0]);
exit(1);
}
if (!fseek(str, osize, SEEK_SET))
while ((count = fread(buffer, 1, sizeof(buffer), str)) > 0)
fwrite(buffer, 1, count, stdout);
fflush(stdout);
fclose(str);
osize = nsize;
}
usleep(250000); /* 250mS */
}
return 0;
}

第二步:首先确保当前目录在/usr/local下,如果不在该目录下,请使用cd命令切换到/usr/local。然后编译c语言程序:
1
[root@localhost local]# gcc -o /usr/bin/tailf tailf.c

如果出现提示信息没有gcc编译器,顺着输入y安装即可
第三步:测试tailf命令是否可用 直接输入tailf有以下提示则代表tailf命令可用
1
2
[root@localhost local]# tailf
Usage: tailf logfile

tailf命令和“tail -f”一个效果,都是用来实时监控文件变动的。只不过tailf是专业的只负责监控日志文件变化的一个命令。我们来测试一下。
日志文件内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
日志信息第1行
日志信息第2行
日志信息第3行
日志信息第4行
日志信息第5行
日志信息第6行
日志信息第7行
日志信息第8行
日志信息第10行
日志信息第11行
日志信息第12行
日志信息第13行
日志信息第14行
日志信息第15行
日志信息第16行
日志信息第17行
日志信息第18行
日志信息第19行
日志信息第20行

监控日志文件
1
2
3
4
5
6
7
8
9
10
11
[root@192 local]# tailf localhost.log
日志信息第11
日志信息第12
日志信息第13
日志信息第14
日志信息第15
日志信息第16
日志信息第17
日志信息第18
日志信息第19
日志信息第20

开启一个新的命令窗口,然后向日志文件中追加内容,如下:
1
[root@192 local]# echo helloworld>> localhost.log

此时tailf命令会自动监控到日志文件的变化,如下:
1
2
3
4
5
6
7
8
9
10
11
日志信息第11行
日志信息第12行
日志信息第13行
日志信息第14行
日志信息第15行
日志信息第16行
日志信息第17行
日志信息第18行
日志信息第19行
日志信息第20行
helloworld

Linux软件安装

软件安装方式

  1. 二进制发布包安装
    • 软件已经针对具体平台编译打包发布,只要解压,修改配置即可
  2. rpm安装
    • 软件已经按照redhat的包管理规范进行打包,使用rpm命令进行安装,不能自行解决库依赖问题
  3. yum安装
    • 一种在线软件安装方式,本质上还是rpm安装,自动下载安装包并安装,安装过程中自动解决库依赖问题
  4. 源码编译安装
    • 软件以源码工程的形式发布,需要自己编译打包

安装JDK

操作步骤:

  1. 我是使用的xftp将jdk17的二进制安装包传到Linux中

  2. 解压安装包,命令为tar -zxvf openjdk-17.0.0.1+2_linux-x64_bin.tar.gz -C /usr/local

    • 该解压缩命令前面学习过,注意将jdk换成自己的版本,-C /path是解压到指定目录,不过自己安装软件的话,一般都放在/usr/local目录下
  3. 配置环境变量,使用vim命令修改/etc/profile文件,或者使用echo追加文件内容,在文件末尾添加如下配置,注意jdk要换成自己刚才解压的文件名

    1
    2
    JAVA_HOME=/usr/local/jdk-17.0.0.1
    PATH=$JAVA_HOME/bin:$PATH
    • 追加
      • echo 'JAVA_HOME=/usr/local/jdk-17.0.0.1' >> /etc/profile
      • echo 'PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile
    • 查看
      • tail /etc/profile
  4. 重新加载profile文件,使更改的配置立即生效

    • 命令为source /etc/profile
  5. 检查安装是否成功

    • 命令为java -version
  6. 看到jdk版本号则说明安装成功

1
2
3
openjdk version "17.0.0.1" 2024-07-02
OpenJDK Runtime Environment (build 17.0.0.1+2-3)
OpenJDK 64-Bit Server VM (build 17.0.0.1+2-3, mixed mode, sharing)

安装Tomcat

操作步骤:

  1. 使用xtfp将tomcat安装包发送到Linux中

  2. 解压安装包

    • 命令为tar -zxvf apache-tomcat-10.1.48.tar.gz -C/usr/local
  3. 进入Tomcat的bin目录启动服务,命令为sh startup.sh或者./startup.sh

  4. 验证Tomcat是否启动成功

    • 查看进程
      • ps -ef | grep tomcat
    • 查看日志
      • more /usr/local/ apache-tomcat-7.0.57/logs/catalina.out
      • tail -50 /usr/local/apache-tomcat-7.0.57/logs/catalina.out
  5. 停止Tomcat

    • 运行Tomcat的bin目录中提供的停止服务的脚本文件shutdowno.sh

      • ./shutdown.sh
      • sh shutdown.sh
    • 结束Tomcat进程

      • kill -9 tomcat进程id

      • 将tomcat进程id替换为前面查看进程所查出来的id

虽然Tomcat服务器启动了,但是我们暂时还是无法访问的,因为防火墙是开启的,而且我们也没有开放8080端口

防火墙操作

  • 查看防火墙状态
    • systemctl status firewalld、 firewall-cmd —state
  • 暂时关闭防火墙
    • systemctl stop firewalld
  • 永久关闭防火墙
    • systemctl disable firewalld
  • 开启防火墙
    • systemctl start firewalld
  • 开放指定端口
    • firewall-cmd —zone=public —add-port=8080/tcp —permanent
  • 关闭指定端口
    • firewall-cmd —zone=public —remove-port=8080/tcp —permanent
  • 立即生效
    • firewall-cmd —reload
  • 查看开放的端口
    • firewall-cmd —zone=public —list-ports
  1. systemctl是管理Linux中服务的命令,可以对服务进行启动、停止、重启、查看状态等操作
  2. firewall-cmd是Linux中专门用于控制防火墙的命令
  3. 为了保证系统安全,服务器的防火墙不建议关闭
  • 查看防火墙状态,这里是running的

    1
    2
    [root@localhost ~]## firewall-cmd --state
    running
  • 那我们暂时关闭一下,测试能否访问Tomcat服务器

    1
    2
    [root@localhost ~]## firewall-cmd --state
    not running
  • 关了之后再从浏览器访问8080端口,此时就能访问了,但是防火墙都没了,不安全

  • 但是我们可以只开放一个8080端口

    1
    2
    [root@localhost ~]## firewall-cmd --zone=public --add-port=8080/tcp --permanent
    success
  • 并设置立即生效

    1
    2
    [root@localhost ~]## firewall-cmd --reload
    success
  • 刷新页面,尝试访问Tomcat服务器,依旧可以正常访问

安装MySQL

检查冲突

检测当前系统中是否安装MySQL数据库

  • ```
    rpm -qa

    1
    2
    3
    4
    5

    - 查询当前系统中安装的所有软件

    - ```
    rpm -qa | grep mysql
    • 查询当前系统中安装的名称带mysql的软件
  • ```
    rpm -qa | grep mariadb

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    - 查询当前系统中安装的名称带mariadb的软件

    RPM (Red-Hat Package Manager)RPM软件包管理器,是红帽Linux用于管理和安装软件的工具

    如果当前系统中已经安装有MySQL数据库,安装将失败。CentOS7自带mariadb,与MySQL数据库冲突



    #### 解决冲突

    - 如果发现有

    mariadb

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21

    ,那么我们把它卸载掉

    - `rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64`

    - 然后看一下是不是真的卸掉了

    - `rpm -qa | grep mariadb`

    #### 解压MySQL

    - 先创建要解压到的目录

    - `mkdir /usr/local/mysql`

    - 随后解压

    - `tar -zxvf mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar.gz -C /usr/local/mysql`

    - 按顺序安装rpm包

    rpm -ivh mysql-community-common-5.7.25-1.el7.x86_64.rpm
    rpm -ivh mysql-community-libs-5.7.25-1.el7.x86_64.rpm
    rpm -ivh mysql-community-devel-5.7.25-1.el7.x86_64.rpm
    rpm -ivh mysql-community-libs-compat-5.7.25-1.el7.x86_64.rpm
    rpm -ivh mysql-community-client-5.7.25-1.el7.x86_64.rpm
    yum install net-tools
    rpm -ivh mysql-community-server-5.7.25-1.el7.x86_64.rpm

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    #### 启动MySQL

    - 查看MySQL服务状态

    - `systemctl status mysqld`

    - 启动MySQL服务

    - `system start mysqld`

    - 查看已经启动的服务

    - `netstat -tunlp`
    - `netstat -tunlp | grep mysql`

    - 查看MySQL进程

    - ```
    ps -df | grep mysql

    说明:

    • 可以设置开机时自动启动MySQL服务,避免每次开机都要启动MySQL
      • systemctl enable mysqld

登录MySQL

  • 查看日志内容中包含password的行信息
    • cat /var/log/mysqld.log |grep 'A temporary password is generated'
  • 根据查询到的密码来登录MySQL
    • mysql -uroot -p
  • 登录成功之后修改密码
    • 设置密码长度最低位数
      • set global validate_password_length=4;
    • 设置密码安全等级低,便于密码可修改为root
      • set global validate_password_policy=LOW;
    • 设置密码为root
      • set password = password('root');
    • 开启访问权限
      • grant all on *.* to 'root'@'%' identified by 'root';
    • 刷新权限
      • flush privileges;

外部连接

  • 使用Navicat或者SQLyog就可以连接到我们的数据库了,主机名就是ip地址,用户名和密码就是刚刚设置的

如果在查看MySQL服务状态时出现了问题,请查看3306端口是否被占用(我找了俩小时才发现原因,呜呜呜)

安装 lrzsz

操作步骤

  1. 搜索lrzsz安装包
    • yum list lrzsz
  2. 使用yum命令在线安装
    • yum install lrzsz.x86_64

Yum(全称为Yellow dog Updater, Modified)是一个在Fedora和RedHat以及Cent05中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。

  • 安装完后输入 rz ,就会跳出一个窗口,选择文件后即可上传

项目部署

手动部署

操作步骤

  1. 在IDEA上将项目打包成jar包

    • 通过IDEA自带的Maven面板的package指令打包即可
    • 打完的包会放在target目录下
  2. 将jar包上传到linux服务器

    • 最好还是创建一个对应的目录
      • mkdir /usr/local/app
      • cd /usr/local/app
    • 然后使用rz命令上传打包好的jar包
  3. 启动项目

    • java -jar [打包好的jar包名]
    • 我这里试着上传了前面做的瑞吉外卖的项目
      • java -jar reggie-0.0.1-SNAPSHOT.jar
  4. 检查防火墙

    • 确保

      1
      8080

      1
      3306

      端口是开放的

      • firewall-cmd --zone=public --list-ports
  5. 测试

    • 在浏览器访问ip:端口/路径

img

通过Shell脚本自动部署

操作步骤

  1. 在Linux安装Git

    • 列出git安装包

      • yum list git
    • 在线安装git

      • yum install git
    • 使用git克隆代码(在此之前随便编写一个boot项目,然后push到仓库里,controller层写一个GetMapping,随便写个方法返回字符串

      1
      Shell脚本部署测试

      ,方便我们启动服务器的时候查看)

      • git clone [仓库地址]
  2. 在Linux安装Maven

    • 切换到

      1
      /usr/local

      目录

      • cd /usr/local
    • 上传maven的安装包

      • 使用rz命令
    • 解压到当前位置

      • tar zxvf apache-maven-3.5.4-bin.tar.gz
    • 编辑配置文件

      1
      /etc/profile
      • vim /etc/profile

      • 加入以下两行配置

        export MAVEN_HOME=/usr/local/apache-maven-3.5.4
        export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH

    • 编辑maven的

      1
      settings.xml
      • 创建目录

        • mkdir /usr/local/repo
      • 进入到对应目录修改文件

        • ```
          cd /usr/local/apache-maven-3.5.4/conf
          1
          2
          3
          4
          5

          - `vim settings.xml`

          -

          settings
          1
          2
          3
          4
          5
          6
          7
          8
          9

          标签下加上这句话设置仓库位置

          > `<localRepository>/usr/local/repo</localRepository>`

          3. 编写Shell脚本(拉取代码、编译、打包、启动)

          这部分暂时不需要我们自己写,体验一下用Shell脚本部署就好了

          !/bin/sh

          echo =================================
          echo 自动化部署脚本启动
          echo =================================

    echo 停止原来运行中的工程
    APP_NAME=helloworld

    tpid=ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'
    if [ ${tpid} ]; then

    echo 'Stop Process...'
    kill -15 $tpid
    

    fi
    sleep 2
    tpid=ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'
    if [ ${tpid} ]; then

    echo 'Kill Process!'
    kill -9 $tpid
    

    else

    echo 'Stop Success!'
    

    fi

    echo 准备从Git仓库拉取最新代码
    cd /usr/local/HelloWorld

    echo 开始从Git仓库拉取最新代码
    git pull
    echo 代码拉取完成

    echo 开始打包
    output=mvn clean package -Dmaven.test.skip=true

    cd target

    echo 启动项目
    nohup java -jar HelloWorld-1.0-SNAPSHOT.jar &> helloworld.log &
    echo 项目启动完成

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    4. 为用户授予执行Shell脚本的权限

    - 7表示rwx三个权限都有,现在我们把权限都给了方便测试
    - `chmod 777 bootStart.sh`

    5. 执行Shell脚本

    - `./bootStart.sh`

    6. 设置静态ip(可选)

    - 首先进入到对应目录

    - `cd /etc/sysconfig/network-scripts/`

    - 然后编辑

    ifcfg-ens33
    ```

    文件

    • vim ifcfg-ens33

    • 修改添加以下内容(改成你自己的子网IP)

      BOOTPROTO=static
      IPADDR=192.168.28.100
      NETMASK=255.255.255.0
      NM_CONTROLLED=no

      DNS1=8.8.8.8
      DNS2=8.8.4.4

  3. 重启网络服务

    • systemctl restart network