简化
使用 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
测试
(什么?我的终端还不错?详见 oh-my-bash 以及 ohmyzsh)
还不错,但是有个问题,我不想使用 ./rds
的方式调用,最好能直接使用 rds 0
rds 1
这种方式
方法有的
在 /usr/local/bin
下建立一个软链接
sudo ln -s "$HOME/rds" /usr/local/bin
测试
过程中发现一个细节,bash 脚本中第一行
#!/bin/bash
表示使用 /bin/bash
解释执行其中的脚本代码,但是
我的 bash
指向的 /usr/bin/bash
不同的 bash ?还是软链接?
可以看出并非软链接,比对 hash 值、查看 inode 号
这表示实际上二者是同文件的不同入口
密码
虽然不用再写 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 相关命令将不再需要输入密码了
评论区