使用shell写了一个跳板机脚本ShellSshJumper
这里总结记录下编写shell的注意点。
主机配置保存在n.ini文件中如下:
host=1.1.1.1 port=22 user=a passwd=b logintimes=0 desc=abv create_time=2020-09-13 01:20:06 update_time=2020-09-13 01:20:06
使用sed读取配置文件
涉及读取
id=$1 inifile='data/'$id'.ini' host=$(sed '/^host=/!d;s/^host=//' $inifile) port=$(sed '/^port=/!d;s/^port=//' $inifile) user=$(sed '/^user=/!d;s/^user=//' $inifile) passwd=$(sed '/^passwd=/!d;s/^passwd=//' $inifile) logintimes=$(sed '/^logintimes=/!d;s/^logintimes=//' $inifile) desc=$(sed '/^desc=/!d;s/^desc=//' $inifile) create_time=$(sed '/^create_time=/!d;s/^create_time=//' $inifile) update_time=$(sed '/^update_time=/!d;s/^update_time=//' $inifile)
sed用法请去搜索,这里举例子解释下
/^host=/!d;s/^host=//
中间的“;”表示script分行,/^host=会匹配以host=开头的行,/!表示取反即不是host=开头的行,d表示操作删除。这一波操作下来就只剩host=1.1.1.1
然后后面的s/^host=//中 s表示替换 ^host=代表被替换的部分,第二个/后面是空的表示要用空去替换 这一波操作下来就剩下1.1.1.1
这样解析host变量完成,其他的操作相同。
使用grep只匹配到一个文件时显示文件名
这里遇到一个坑:使用grep搜索命中多个文件时会返回文件名,但是如果只有一个文件就不会显示文件名,
解决方案是grep -H 选项显示文件名
使用sed更新配置项
涉及更新 相同应用场景如 sed 匹配替换以某个字段开头,sed 替换 指定位置后所有字符
像每次更新主机配置的host时:
现在是 host=1.1.1.1
要更新成 host=2.2.2.2
命令如下
newhost=2.2.2.2 sed -i '/^host=/chost='$newhost 1.ini
此处^host=表示匹配以host=开头的行 /c表示改变本行为后面的 host=$newhost
sed -i '/^host=/chost='$host$inifile