sed 一次性插入多行

有時候須要利用 sed 來修改設定檔
原本的檔案,要在 1 和 4 之間插入 2 & 3
# cat /root/testfile
1
4
5
6
7[@more@]# sed -i ‘/1/a2n3’ /root/testfile

# sed -i ‘/4/i2n3’ /root/testfile

處理完後
# cat /root/testfile
1
2
3
4
5
6
7

另外的一行方式
參考網頁:sed在匹配行之下追加多行文本 – 陆小K网络工作室 – 51CTO技术博客
找到 7 後,在下方插入 /root/nginx.conf 內容
# sed -i ‘/7/r /root/nginx.conf’ /root/testfile

IP 和 Mac address 排序

手上有一份 IP 和 Mac address 的對照表
# cat ipmac.txt
192.168.1.112 00:0c:29:ac:47:64
192.168.1.254 50:67:f0:19:cf:a4
192.168.1.2 ac:22:0b:50:49:ea
192.168.1.5 00:1d:7d:d5:2f:d3
192.168.1.100 00:11:32:0c:da:e2
192.168.1.101 28:cf:e9:80:0c:76

想要以 IP 排序由小到大,但一直都無法試驗成功
# sort -n ipmac.txt
192.168.1.100 00:11:32:0c:da:e2
192.168.1.101 28:cf:e9:80:0c:76
192.168.1.112 00:0c:29:ac:47:64
192.168.1.254 50:67:f0:19:cf:a4
192.168.1.2 ac:22:0b:50:49:ea
192.168.1.5 00:1d:7d:d5:2f:d3[@more@]後來利用 sed 來處理就 OK 了!
想法:
1. 先去除 IP 前面的 192.168.1.
    以下三種方式都可以
# cat ipmac.txt | sed -n ‘/192.168.1./s/192.168.1.//p’
# cat ipmac.txt | sed ‘s/^……….//’
# cat ipmac.txt | sed ‘s/^.{10}//’
112 00:0c:29:ac:47:64
254 50:67:f0:19:cf:a4
2 ac:22:0b:50:49:ea
5 00:1d:7d:d5:2f:d3
100 00:11:32:0c:da:e2
101 28:cf:e9:80:0c:76

2. 以 sort 排序
# cat ipmac.txt | sed ‘s/^.{10}//’ | sort -n
2 ac:22:0b:50:49:ea
5 00:1d:7d:d5:2f:d3
100 00:11:32:0c:da:e2
100 00:11:32:0c:da:e2
101 28:cf:e9:80:0c:76
112 00:0c:29:ac:47:64
254 50:67:f0:19:cf:a4

3. 排序完成之後,再將 192.168.1. 加回
# cat ipmac.txt | sed ‘s/^.{10}//’ | sort -n | sed ‘s/^/192.168.1./’
192.168.1.2 ac:22:0b:50:49:ea
192.168.1.5 00:1d:7d:d5:2f:d3
192.168.1.100 00:11:32:0c:da:e2
192.168.1.101 28:cf:e9:80:0c:76
192.168.1.112 00:0c:29:ac:47:64
192.168.1.254 50:67:f0:19:cf:a4

終於可以了,自己胡亂試了一下,如果大家有更好的方式,歡迎告知!

利用 arp-scan 來查詢區域網路的 IP 和 Mac address

在 Ubuntu 14.04 LTS Server 上安裝 arp-scan 工具
# apt-get install arp-scan

在 CentOS 6.x 上安裝
# yum install arp-scan –enablerepo=epel

利用 arp-scan 進行偵測
# arp-scan –localnet
Interface: eth0, datalink type: EN10MB (Ethernet)
Starting arp-scan 1.8.1 with 256 hosts (http://www.nta-monitor.com/tools/arp-scan/)
192.168.1.2     ac:22:0b:50:49:ea       (Unknown)
192.168.1.5     00:1d:7d:c5:2f:d3       GIGA-BYTE TECHNOLOGY CO.,LTD.
192.168.1.100   00:11:23:0c:da:e2       Synology Incorporated
192.168.1.101   28:cf:e9:80:0c:76       (Unknown)
192.168.1.112   00:0c:29:ac:47:64       VMware, Inc.
192.168.1.254   50:67:fa:19:cf:a4       ZyXEL Communications Corporation

9 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.8.1: 256 hosts scanned in 2.316 seconds (110.54 hosts/sec). 7 responded[@more@]利用 sed / egrep 來過濾一些不要的資料,和使用 awk 來取得所要的資料
# arp-scan –localnet | sed -n ‘/Starting/,/^$/p’ | egrep -v ‘(Starting|^$)’ | awk ‘{print $1,$2}’
192.168.1.2 ac:22:0b:50:49:ea
192.168.1.5 00:1d:7d:c5:2f:d3
192.168.1.100 00:11:23:0c:da:e2
192.168.1.101 28:cf:e9:80:0c:76
192.168.1.112 00:0c:29:ac:47:64
192.168.1.254 50:67:fa:19:cf:a4

解決 Ubuntu 在 Shell Script 中無法執行 let 的問題

在 Ubuntu Server 執行 Shell Script 時出現下面的訊息
# sh firewall.t
Set external ……

firewall.t: 43: firewall.t: let: not found
firewall.t: 44: firewall.t: let: not found
firewall.t: 45: firewall.t: let: not found
firewall.t: 46: firewall.t: let: not found

看起來似乎是找不到 let 這一個命令,但這個 Shell Script 在 CentOS 上是沒有問題的[@more@]在網路上搜尋了一下,找到了這一篇 unix – “let” internal shell command doesn’t work in a shell script? – Stack Overflow
本來是
a=0
let “a=a+1”

改用
a=0
a=$(($a+1))
可以用這種方式來做處理。

Shell Script 顏色

讓 Linux Console 也五顏六色,多采多姿!
[@more@]Shell Script
[0m 還原
[1; 高亮度
前景色
文字顏色:
30 黑色
31 紅色
32 綠色
33 黃色
34 藍色
35 洋紅色
36 青色
37 白色

背景顏色:
40 黑色
41 紅色
42 綠色
43 黃色
44 藍色
45 洋紅色
46 青色
47 白色

快速產生 DHCP Server 的 dhcpd.conf 格式檔

從 /var/lib/dhcpd/dhcpd.leases 取出要的網路卡卡號
# cat /var/lib/dhcpd/dhcpd.leases | grep hard | awk ‘{print $3}’
d0:df:c7:f9:5c:ef;
00:26:51:0d:53:40;
00:11:93:88:7a:00;
00:15:58:6b:7d:da;
00:15:58:6b:7d:da;
00:15:58:6b:7d:da;
00:15:58:6b:7d:da;

經過處理,只取出想要的部分
# cat /var/lib/dhcpd/dhcpd.leases | grep hard | awk ‘{print $3}’ | sed ‘s/.$//’ | sort | uniq
00:11:93:88:7a:00
00:15:58:6b:7d:da
00:26:51:0d:53:40
d0:df:c7:f9:5c:ef

整理完的資料檔
# cat /root/mac
server1,00:11:93:88:7a:00,192.168.1.11
server2,00:15:58:6b:7d:da,192.168.1.12
server3,00:26:51:0d:53:40,192.168.1.13
server4,d0:df:c7:f9:5c:ef,192.168.1.14
[@more@]
使用 awk
# cat /usr/local/bin/mkdhcpd
#!/bin/bash
cat /root/mac | awk -F”,” ‘BEGIN{OFS=” “}{print $1,$2,$3 }’ | while read i j k
do
   echo “host $i {“
   echo ”  hardware ethernet $j;”
   echo ”  fixed-address $k;”
   echo “}”
done

使用 sed
# cat /usr/local/bin/mkdhcpd
#!/bin/bash
cat /root/mac | sed ‘s/,/ /g’ | while read i j k
do
   echo “host $i {“
   echo ”  hardware ethernet $j;”
   echo ”  fixed-address $k;”
   echo “}”
done

測試
# sh /usr/local/bin/mkdhcpd
host server1 {
  hardware ethernet 00:11:93:88:7a:00;
  fixed-address 192.168.1.11;
}
host server2 {
  hardware ethernet 00:15:58:6b:7d:da;
  fixed-address 192.168.1.12;
}
host server3 {
  hardware ethernet 00:26:51:0d:53:40;
  fixed-address 192.168.1.13;
}
host server4 {
  hardware ethernet d0:df:c7:f9:5c:ef;
  fixed-address 192.168.1.14;
}

在 Linux Console 做 2 / 10 / 16 進位的轉換

人還是習慣用 10 進位,遇到 2 / 10 / 16 進位的轉換,可能就要藉助紙筆或是計算機的幫忙,底下是在 Linux Console 中使用 Bash Shell 內建的功能來做轉換。

2 進位轉成 10 進位
# echo $((2#111111))
63

16 進位轉成 10 進位
# echo $((16#c0))
192

10 進位轉成 2 進位
# echo “obase=2;17″|bc
10001

10 進位轉成 16 進位
# echo “obase=16;17″|bc
11

由 DHCP Server 的動態 IP 轉成固定 IP – Linux Server 篇

Linux 安裝完成之後,如果沒有在手動或自動安裝中設定好網路組態,通常就要手動設定網路,但如果是用由 DHCP Server 自動取得 IP,會節省許多的時間,但如果是 Server 的話,還是使用固定 IP 會比較好。[@more@]
底下文章內容取自:HowTos/NetworkInstallServer – CentOS Wiki
1. 建立 Script 檔
# vim /usr/local/bin/set_static_ip
#!/bin/bash
echo “Converting DHCP scope to static IP address”

DEVICE=`route -n|grep ‘^0.0.0.0’|awk ‘{print $8}’`
IPADDR=`ifconfig $DEVICE|grep ‘inet addr:’|awk ‘{sub(/addr:/,””); print $2}’`
NETMASK=`ifconfig $DEVICE|grep ‘Mask’|awk ‘{sub(/Mask:/,””); print $4}’`
NETWORK=`ipcalc $IPADDR -n $NETMASK|awk -F= ‘{print $2}’`
GATEWAY=`route -n|grep ‘^0.0.0.0’|awk ‘{print $2}’`
HWADDR=`ifconfig $DEVICE|grep ‘HWaddr’|awk ‘{print $5}’`
HOSTNAME=`hostname`

cat <<EOF >/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=$HOSTNAME
GATEWAY=$GATEWAY
EOF

cat <<EOF >/etc/sysconfig/network-scripts/ifcfg-$DEVICE
DEVICE=$DEVICE
BOOTPROTO=static
IPADDR=$IPADDR
NETMASK=$NETMASK
ONBOOT=yes
HWADDR=$HWADDR
EOF

2. 賦予執行權限
# chmod 700 /usr/local/bin/set_static_ip

3. 執行
# /usr/local/bin/set_static_ip

4. 觀看成果
# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=test.tces.ilc.edu.tw
GATEWAY=192.168.1.254

# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.1.6
NETMASK=255.255.255.0
ONBOOT=yes
HWADDR=6C:62:6D:61:80:81

大批產生學生帳號的 LDIF 格式檔

每學年初都會由校務行政系統由擷取新的學生資料,並搭配亂數密碼,使用 awk 來大批產生學生帳號,在建立學生帳號時,可以建立硬碟容量限制 Quota、建立 Samba 密碼、建立學生個人網頁、設定帳號使用期限、初始化個人目錄設定…….等等,一些瑣碎的事都可以一個步驟完成。
在處理 Open LDAP Server 時,也想要利用這樣的方式來處理這個部份,稍微試了一下,看起來應該是沒有太大的問題。
底下是實驗的學生資料,以 csv 格式,每個學生一列資料,以空格當做欄位間隔
欄位分別是 班級 座號 姓名 帳號 密碼 群組
# head -2 102_class41.lst
四忠 01 蔡中火 s0990499 123456 s0990
四忠 02 陳大水 s0990999 234567 s0990[@more@]建立 LDAP 密碼檔
# vim mkldifpw.awk
# 產生密碼
{print “slappasswd -s “$5 }

測試
# awk -f mkldifpw.awk 102_class41.lst | sh
{SSHA}CmIwt8puhug01FSBsdqVSpQgMkkuuQWv
{SSHA}9sgDt6+WDZG4y9nZasVL5jRgpbkMq3AU

輸出成密碼檔
# awk -f mkldifpw.awk 102_class41.lst | sh > /root/102_class41_ldifpw.lst

把 102_class41.lst 和 102_class41_ldifpw.lst 組合起來
# paste -d ” ” 102_class41.lst 102_class41_ldifpw.lst > 102_class41_ldap.lst
四忠 01 蔡中火 s0990499 123456 s0990 {SSHA}xecUVfAyOlao7udDzLccUvf4fHOonjzN
四忠 02 陳大水 s0990999 234567 s0990  {SSHA}WqVy40LfOfoRV1KBwlJFPpfGNgnkIbtr

建立產生 ldif 的 awk 檔
# vim mkldif.awk
# 帳號密碼檔格式
四忠 01 蔡中火 s0990499 123456 s0990 {SSHA}xecUVfAyOlao7udDzLccUvf4fHOonjzN

{print “dn: uid=”$4″,ou=”$6″,ou=Student,dc=ldap,dc=tces.ilc.edu.tw” }
{print “uid: “$4 }
{print “cn: “$1$2$3 }
{print “sn: “$1$2$3 }
{print “mail: “$4″@tces.ilc.edu.tw” }
{print “objectClass: person” }
{print “objectClass: organizationalPerson” }
{print “objectClass: inetOrgPerson” }
{print “objectClass: posixAccount” }
{print “objectClass: top” }
{print “userPassword: “$7 }
{print “loginShell: /sbin/nologin” }
{print “uidNumber: 500” }
{print “gidNumber: 500” }
{print “homeDirectory: /home/”$6″/”$4 }
{print “gecos: “$1$2$3 }
{print “” }

測試一下
# awk -f mkldif.awk 102_class41_ldap.lst
dn: uid=s0990499,ou=s0990,ou=Student,dc=ldap,dc=tces.ilc.edu.tw
uid: s0990499
cn: 四忠01蔡中火
sn: 四忠01蔡中火
mail: s0990499@tces.ilc.edu.tw
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
userPassword: {SSHA}xecUVfAyOlao7udDzLccUvf4fHOonjzN
loginShell: /sbin/nologin
uidNumber: 500
gidNumber: 500
homeDirectory: /home/s0990/s0990499
gecos: 四忠01蔡中火

dn: uid=s0990999,ou=s0990,ou=Student,dc=ldap,dc=tces.ilc.edu.tw
uid: s0990999
cn: 四忠02陳大水
sn: 四忠02陳大水
mail: s0990999@tces.ilc.edu.tw
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
userPassword: {SSHA}WqVy40LfOfoRV1KBwlJFPpfGNgnkIbtr
loginShell: /sbin/nologin
uidNumber: 500
gidNumber: 500
homeDirectory: /home/s0990/s0990999
gecos: 四忠02陳大水

最後可能比較麻煩的是 uidNumber 的部份,因為 uidNumber 是建立帳號時,系統依帳號的使用而自動編號產生的,當然也可以在建立學生帳號時,直接指定使用者的 uidNumber
# useradd
-u, –uid UID                 user ID of the new account

列出取不到 IP 的網路卡卡號

針對一些不容易查到網路卡卡號的設備
# cat /var/log/messages | grep “no free leases” | awk ‘{OFS=”,”}{print $1,$2,$8,$10,$12}’ | sort | uniq
Oct,15,00:0c:29:67:73:72,eth0:,140.111.74.0/24:
Oct,15,00:11:93:88:7a:00,eth0:,140.111.74.0/24:
Oct,15,00:14:2a:3e:c7:5e,eth2:,192.168.250.0/24:
Oct,15,00:14:2a:3e:d1:00,eth2:,192.168.250.0/24:
Oct,15,00:26:51:0d:53:40,eth0:,140.111.74.0/24:
Oct,15,00:26:5a:be:5a:88,eth1:,192.168.249.0/24:
Oct,15,14:7d:c5:9f:68:b1,eth2:,192.168.250.0/24:
Oct,15,18:34:51:c0:40:14,eth2:,192.168.250.0/24:
Oct,15,6c:62:6d:63:8f:80,eth0:,140.111.74.0/24:

[@more@]或
# awk ‘{OFS=”,”}/no free leases/{print $1,$2,$8,$10,$12}’ /var/log/messages | sort | uniq
Oct,15,00:0c:29:67:73:72,eth0:,140.111.74.0/24:
Oct,15,00:11:93:88:7a:00,eth0:,140.111.74.0/24:
Oct,15,00:14:2a:3e:c7:5e,eth2:,192.168.250.0/24:
Oct,15,00:14:2a:3e:d1:00,eth2:,192.168.250.0/24:
Oct,15,00:26:51:0d:53:40,eth0:,140.111.74.0/24:
Oct,15,00:26:5a:be:5a:88,eth1:,192.168.249.0/24:
Oct,15,14:7d:c5:9f:68:b1,eth2:,192.168.250.0/24:
Oct,15,18:34:51:c0:40:14,eth2:,192.168.250.0/24:
Oct,15,6c:62:6d:63:8f:80,eth0:,140.111.74.0/24: