安全矩阵

 找回密码
 立即注册
搜索
查看: 915|回复: 0

万字详解 Linux 常用指令

[复制链接]

102

主题

102

帖子

330

积分

中级会员

Rank: 3Rank: 3

积分
330
发表于 2023-9-27 18:21:37 | 显示全部楼层 |阅读模式
本帖最后由 jiangmingzi 于 2023-9-27 18:21 编辑

HACK之道 2023-09-27 08:02 发表于重庆
1,写一个自己的日志命令:logmsg

1)一般打印日志时需要记录时间戳,我们现在改写脚本“004-while.sh”,示例如下:

  1. ……
  2. ##→编写LogMsg函数,每次调用,重新打印时间戳
  3. LogMsg () {
  4.   local_time=`date +"%Y-%m-%d %H:%M:%S"`
  5.   echo $local_time $1
  6. }
  7. ……
  8.    if [ $sshd_count -lt 1 ]
  9.    then
  10.        LogMsg  '没有找到ssh服务,重启该服务'          #调用LogMsg函数
  11.        systemctl start sshd
  12.    else
  13.        LogMsg  'ssh服务正常运行中...'                 #调用LogMsg函数
  14.     fi
复制代码

重新执行,示例如下:
  1. [root@linuxido /shell]# sh 004-while.sh
  2. 2021-06-07 07:35:11 ssh服务正常运行中...
  3. 2021-06-07 07:35:16 ssh服务正常运行中...
  4. ……
复制代码


2)如果每个脚本中都要写个LogMsg的方法,就会很麻烦,可不可以像使用其他命令一样,直接调用呢?例如echo、cat我们先来新建logmsg脚本。示例如下:

  1. [root@linuxido /shell]# vi logmsg.sh     ##→编辑logmsg.sh脚本
  2. ……
  3. LogMsg() {
  4.   local_time=`date +"%Y-%m-%d %H:%M:%S"`
  5.   echo $local_time $1  #此时的$1是指调用LogMsg时输入的第一个参数
  6. }

  7. LogMsg $1     #调用LogMsg函数,此时的$1是指调用脚本时输入的第一个参数
复制代码

3)虽然写了logmsg脚本,但是没法在文件目录以外的地方使用。还记得前面章节所说的,命令一般放在哪个目录吗?当然是/bin目录了。

  1. ##→创建logmsg命令的符号链接
  2. [root@linuxido /shell]# ln -s  /shell/logmsg.sh /bin/logmsg  
  3. [root@linuxido /shell]# logmsg         ##→直接执行logmsg命令
  4. -bash: /usr/bin/logmsg: 权限不够         ##→执行时发现虽然调用了/usr/bin,但权限不够
  5. [root@linuxido /shell]# chmod 555 /bin/logmsg  ##→赋予555权限,所有用户可读可执行
  6. [root@linuxido ~]##→logmsg linuxido.com       ##→直接执行logmsg命令,参数为yaomm
  7. 2021-06-07 23:25:19 linuxido.com                 ##→执行成功
复制代码

(4)为什么/bin目录下的命令可以在任何目录下直接执行呢?因为环境配置的原因,/bin目录下的命令直接被赋予了全局调用的环境。

注意:除了echo,还可以使用print、printf打印文本。

2,写一个常用的备份命令:backup

1)编辑backup脚本,先故意命名bachup.sh。

  1. [root@yaomm shell]# vi bachup.sh                ##→编写备份脚本
  2. #!/bin/bash   
  3. # description:编写备份常用脚本
  4. # date:2020-06-26
  5. # filename:bachup.sh
  6. # author:linuxido.com

  7. # 编辑backup函数,将要备份的文件名添加上时间戳之后改名
  8. function backup() {
  9.   newfile=$1.`date +%Y-%m-%d.%H%M.bak`;         ##→新文件名称,加上时间戳
  10.   cp -p $1 $newfile;                                ##→复制一份文件
  11.   echo "Backed up $1 to $newfile.";             ##→打印成功日志
  12. }

  13. backup $1                                          ##→调用backup函数
复制代码

2)创建/bin目录下的脚本链接,将bachup.sh链接为/bin/backup。

  1. [root@yaomm shell]# ln -s /shell/bachup.sh /bin/backup    ##→创建链接,注意全路径
  2. [root@yaomm shell]# ll /bin/backu*
  3. ##→创建成功
  4. lrwxrwxrwx 1 root root 16 Jun 20 10:33 /bin/backup -> /shell/bachup.sh
  5. [root@yaomm shell]# chmod 555 /bin/backup.sh       ##→赋予所有用户执行权限

  6. [root@yaomm shell]# touch sss.txt                  ##→创建测试脚本
  7. [root@yaomm shell]# backup sss.txt                    ##→备份测试
  8. Backed up sss.txt to sss.txt.2021-06-20.1034.bak.  ##→备份成功
  9. [root@yaomm shell]# ll
  10. -rw-r--r-- 1 root root   0 Jun 20 10:31 sss.txt                            ##→原文件
  11. -rw-r--r-- 1 root root   0 Jun 20 10:31 sss.txt.2021-06-20.1034.bak ##→备份文件
复制代码

3,写一个Java项目的管理脚本:springboot-admin.sh

在做Java开发、运维、测试的工作中,和Spring Boot打交道的地方很多。怎么轻松管理一个Spring Boot的项目部署呢?借着这个来自GitHub的开发者junbaor的优秀实例,我们来看看一个Shell脚本是如何炼成的。

修改后的脚本详见本书代码网盘(详见“前言”)。简略代码如下:


  1. operation=$1      ##→第一个参数,start、stop、restart、status
  2. springboot=$2     ##→第二个参数,Jar包名

  3. ##→校验参数是否为空
  4. showUsage() {

  5.     ##→校验第一个参数是否为空
  6.     if [ "$operation" == "" ];        ##→注意:中括号[]两端至少要有一个空格
  7. ……
  8.     ##→校验第二个参数是否为空
  9.     if [ "$springboot" == "" ];
  10. ……
  11.     count=`ls $springboot | wc -l`   # 校验jar包是否存在
  12. ……
  13. }

  14. ##→启动springboot项目
  15. function start()
  16. {
  17.     count=`ps -ef |grep java|grep $springboot|grep -v grep|wc -l`
  18.     if [ $count != 0 ];then
  19.         echo "$springboot is running..."
  20.     else
  21.                 ls $spring
  22.         ##→启动springboot项目,反斜杠连接命令
  23.         nohup java -server -Xmx1g -Xms1g -Xss512k \
  24.         -jar $springboot > /dev/null 2>&1 &

  25.         ##→调换提示位置
  26.         echo "Start $springboot success..."
  27.     fi
  28. }

  29. ##→关闭springboot项目
  30. function stop()
  31. {
  32. ……
  33.     count=`ps -ef |grep java|grep $springboot|grep -v grep|wc -l`

  34.     ##→先用kill -15 发出停止信号,等待springboot自行关闭
  35.     if [ $count != 0 ];then
  36.         echo "Stop Success! 优雅关闭 $springboot  Process..."
  37.         kill $boot_id
  38.      fii
  39. ……
  40. }

  41. ##→重启springboot项目,关闭后停止两秒重新启动
  42. function restart()
  43. {
  44.     stop
  45.     ##→睡眠两秒调用start方法
  46.     sleep 2
  47.     start
  48. }

  49. ##→查看springboot项目的启动状态
  50. function status()
  51. {
  52.     count=`ps -ef |grep java|grep $springboot|grep -v grep|wc -l`
  53.     jarStatus=`ps -ef |grep java|grep $springboot`
  54. ……
  55. }

  56. showUsage ##→先验证参数是否为空

  57. ##→只有第一个输入变量是 start|stop|restart|status的时候,才执行对应的方法
  58. case $1 in
  59.         start)
  60.         start;;
  61.         stop)
  62.         stop;;
  63.         restart)
  64.         restart;;
  65.         status)
  66.         status;;
  67.         *)
  68. echo -e "\033[0;34m  请正确操作:{start|stop|restart|status}.\n Example:bash springboot-admin.sh start test-springboot.jar \033[0m"
  69. esac
  70. 执行脚本:
  71. [root@yaomm shell]# sh springboot-admin.sh start xx.jar  ##→执行一个不存在的jar包
  72. ls: cannot access xx.jar: No such file or directory        ##→v0.3应该解决这个问题
  73. xx.jar不存在

  74. [root@yaomm shell]# sh springboot-admin.sh reload /home/deploy/face-0.0.1-SNAPSHOT.jar
  75.   请正确操作:{start|stop|restart|status}.                    ##→reload不存在已有选项中
  76. Example:bash springboot-admin.sh start test-springboot.jar

  77. [root@yaomm shell]# sh springboot-admin.sh start /home/deploy/face-0.0.1-SNAPSHOT.jar
  78. ……   
  79. Start /home/deploy/face-0.0.1-SNAPSHOT.jar success...     ##→正常启动

  80. [root@yaomm shell]# sh springboot-admin.sh stop /home/deploy/face-0.0.1-SNAPSHOT.jar
  81. Stop /home/deploy/face-0.0.1-SNAPSHOT.jar ...               ##→正常关闭
  82. Stop Success! 优雅关闭 /home/deploy/face-0.0.1-SNAPSHOT.jar  Process...
  83. 我们可以通过将脚本放入/usr/bin下或建立systemd服务的方式进行服务控制,这个可以做到如下效果:
  84. systemctl start xxx.jar                                          ##→方法1
  85. springboot-admin start xxx.jar                                 ##→方法2
复制代码

小结

在学习完本章内容后,我们已经掌握了Shell的基本环境配置与常用的内置变量,基本的语法操作与简单的脚本编写,知道了怎样写一个自己的Shell命令,怎样使用Shell命令实现一个服务的管理。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 05:44 , Processed in 0.014358 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表