目標:想用awk與scp命令批量傳送文件
前提:先搭好主機間的免密登陸環境(參考:http://www.cnblogs.com/tankaixiong/p/4172942.html)
實現腳本方法:
1.在一個文件中記錄好各個主機的端口與ip地址,第一列為主機描述信息,參考信息
[root@zejin240 share]# cat scp_port_ip.txt host1 33330 192.168.10.11 host2 33331 192.168.20.22 host3 33332 192.168.30.33 host4 33333 192.168.40.44
2.編寫shell腳本
[root@zejin240 share]# cat scp_all.sh #!/bin/bash src_path='/home/chenzejin/mysql_backup_all.sh' des_path='/home/chenzejin/mysql_backup_all_from11.sh' awk '{ cmd="scp -P"$2 "'" $src_path"'" " chenzejin@"$3":""'"$des_path"'";print cmd } ' /mnt/hgfs/share/scp_port_ip.txt
說明:最后一行用awk去調用主機ip與端口的信息,並拼接成一個完事的scp命令,這個腳本中只是打印拼接命令,確定拼接命令正確用,將print cmd改成system(cmd)即可完成真正命令的執行。
調試信息如下:
[root@zejin240 share]# sh -x scp_all.sh + src_path=/home/chenzejin/mysql_backup_all.sh + des_path=/home/chenzejin/mysql_backup_all_from11.sh + awk '{ cmd="scp -P"$2 " /home/chenzejin/mysql_backup_all.sh" " chenzejin@"$3":""/home/chenzejin/mysql_backup_all_from11.sh";print cmd } ' /mnt/hgfs/share/scp_port_ip.txt scp -P33330 /home/chenzejin/mysql_backup_all.sh chenzejin@192.168.10.11:/home/chenzejin/mysql_backup_all_from11.sh scp -P33331 /home/chenzejin/mysql_backup_all.sh chenzejin@192.168.20.22:/home/chenzejin/mysql_backup_all_from11.sh scp -P33332 /home/chenzejin/mysql_backup_all.sh chenzejin@192.168.30.33:/home/chenzejin/mysql_backup_all_from11.sh scp -P33333 /home/chenzejin/mysql_backup_all.sh chenzejin@192.168.40.44:/home/chenzejin/mysql_backup_all_from11.sh
說明:在使用awk命令引用外部變量時,需要注意:外部變量名需要用"'"$src_path"'"這樣的格式來引用,而awk中的域信息$0 $1 $2……等不用任何引號包含。
為什么需要用"'"$src_path"'"這樣的格式來引用外部變量呢,其實shell在解析時是從左到匹配單引號與雙引號的,會一步步解釋過去,具體的可以參考其它的文章:http://www.cnblogs.com/mydomain/archive/2012/09/24/2699467.html
至此,完成了我們的設定目標。