侧边栏壁纸
  • 累计撰写 10 篇文章
  • 累计创建 5 个标签
  • 累计收到 2 条评论
标签搜索

目 录CONTENT

文章目录

使用 bash 脚本简化命令操作

简化

使用 linux desktop 作为开发环境经常需要使用 shell 设置一些服务,不过

systemctl start some-server
systemctl --user start some-server
#... 

对我来说还是太长了,尤其是一些需要经常手动管理的服务 QAQ

所以我决定使用 bash 脚本简化这些操作

以 redis 为例,使用 systemd 管理的常见命令

systemctl start redis-server #启动服务
systemctl stop redis-server #停止服务
systemctl restart redis-server #重启服务
systemctl status redis-server #服务状态
# ... 其他相关的命令

新建一个 rds 文件,写入以下内容(为什么不用 rd?因为和系统的 rmdir 命令别名 rd 冲突了)

vim rds
#!/bin/bash

case "$1" in
    0|start)
        systemctl start redis-server
        echo "redis-server 服务已启动"
        ;;
    1|stop)
        systemctl stop redis-server
        echo "redis-server 服务已停止"
        ;;
    2|status)
        systemctl status redis-server
        ;;
    3|restart)
        systemctl restart redis-server
        echo "redis-server 服务已重启"
        ;;
    *)
        echo "用法: $0 {0|1|2|3}"
        echo "0 - 启动服务"
        echo "1 - 停止服务"
        echo "2 - 查看状态"
        echo "3 - 重启服务"
        exit 1
        ;;
esac

可执行权限,相对于数字形式的权限,对我来说 rwx 更加直观

chmod +x rds

测试

2025-03-31_15-09

(什么?我的终端还不错?详见 oh-my-bash 以及 ohmyzsh

还不错,但是有个问题,我不想使用 ./rds 的方式调用,最好能直接使用 rds 0 rds 1 这种方式

方法有的

/usr/local/bin 下建立一个软链接

sudo ln -s "$HOME/rds" /usr/local/bin

测试

2025-03-31_15-07-1743404917039

过程中发现一个细节,bash 脚本中第一行

#!/bin/bash

表示使用 /bin/bash 解释执行其中的脚本代码,但是

2025-03-31_15-23

我的 bash 指向的 /usr/bin/bash

不同的 bash ?还是软链接?

2025-03-31_15-22

可以看出并非软链接,比对 hash 值、查看 inode 号

2025-03-31_15-27

这表示实际上二者是同文件的不同入口

密码

虽然不用再写 systemctl start ... 了,但是需要 root 密码时还是会弹出窗口输入密码,不够简便

在 linux 上可以通过编辑 /etc/sudoers 文件使用特定语法设置 谁可以运行哪些命令

sudo cat /etc/sudoers

文件内容基本上是这种形式

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "@include" directives:

@includedir /etc/sudoers.d

含义为 用户规范 主机列表=(可运行身份) [标签:] 命令列表

例如我想要在操作 redis-server 时不需要手动输入密码就可以这样设置

lucas ALL=(ALL) NOPASSWD: /usr/bin/systemctl start redis-server, /usr/bin/systemctl stop redis-server, /usr/bin/systemctl status redis-server, /usr/bin/systemctl restart redis-server

此文件是 sudo 的核心配置文件,如果直接编辑,出现问题会影响整个系统,需慎重

可以使用 sudo visudo 编辑 /etc/sudoers 文件,visudo 的好处是完成编辑后会检查文件语法是否正确,只有正确的情况下才会被应用,这避免了语法错误影响整个系统的 sudo

并且 linux 并不推荐直接编辑 /etc/sudoers 文件,用户可以在 /etc/sudoers.d 文件夹下创建自定义配置文件,这种方式比较好

创建自定义配置文件,并写入内容

sudo visudo -f /etc/sudoers.d/my-rules
lucas ALL=(ALL) NOPASSWD: /usr/bin/systemctl start redis-server, /usr/bin/systemctl stop redis-server, /usr/bin/systemctl status redis-server, /usr/bin/systemctl restart redis-server

最后一步,修改前面的 rds 文件,命令添加上 sudo

#!/bin/bash

case "$1" in
    0|start)
        sudo systemctl start redis-server
        echo "redis-server 服务已启动"
        ;;
    1|stop)
        sudo systemctl stop redis-server
        echo "redis-server 服务已停止"
        ;;
    2|status)
        sudo systemctl status redis-server
        ;;
    3|restart)
        sudo systemctl restart redis-server
        echo "redis-server 服务已重启"
        ;;
    *)
        echo "用法: $0 {0|1|2|3}"
        echo "0 - 启动服务"
        echo "1 - 停止服务"
        echo "2 - 查看状态"
        echo "3 - 重启服务"
        exit 1
        ;;
esac

此时直接执行 rds 相关命令将不再需要输入密码了

0

评论区