1、在linux系统中/root/目录下有一个文件ip-pwd.ini,内容如下:
192.168.149.131,root,nihao123!,
192.168.149.132,root,nihao123@
每一行的格式分别为linux服务的IP 用户 密码,用一个shell脚本批量查看着看这些服务器的主机名;
脚本代码如下: 一个expect.sh脚本 一个exe.sh脚本,用来调用expect.sh
[root@localhost_002 shell]# cat expect.sh
#!/usr/bin/expect
set port [lindex $argv 0]
set host [lindex $argv 1]
set passwd [lindex $argv 2]
set cm [lindex $argv 3]
spawn ssh -p $port root@$host
expect {
"yes/no" { send "yes\r";exp_continue}
"password:" { send "$passwd\r" }
}
expect "]*"
send "$cm\r"
expect "]*"
send "echo -n yuanhaohao >/tmp/yuanhh.txt\r"
expect "]*"
send "exit\r"
[root@localhost_002 shell]# cat exe.sh
#!/bin/bash
cat ip-pwd.ini|while read line
do
ip=`echo $line |awk -F ',' '{print $1}'`
pw=`echo $line |awk -F ',' '{print $3}'`
po=`echo $line |awk -F ',' '{print $4}'`
./expect.sh $po $ip $pw "hostname"
done
执行代码:
[root@localhost_002 shell]# sh exe.sh
spawn ssh -p 52588 root@192.168.149.131
Last login: Sun Mar 10 12:14:56 2019 from 192.168.149.130
[root@localhost_03 ~]# hostname
localhost_03
[root@localhost_03 ~]# echo -n yuanhaohao >/tmp/yuanhh.txt
[root@localhost_03 ~]# spawn ssh -p 52588 root@192.168.149.132
Last login: Sun Mar 10 12:15:06 2019 from 192.168.149.130
[root@localhost_04 ~]# hostname
localhost_04
[root@localhost_04 ~]# echo -n yuanhaohao >/tmp/yuanhh.txt
[root@localhost_002 shell]#
注释:当然 expect脚本可以远程批量执行命令(kaill掉某个服务,或者批量关机等),也可以用分发代码上线等;
2、一个脚本查找/data/log目录下,创建时间是三天前后缀名是.log的文件,打包后发送至192.168.149.131服务器上的/data/log,并删除源文件,只保留打包后的文件;
分析:查找3天前后缀是.log的文件: find /data/log -type f -mtime +3 -name "*.log"
打包命令: tar zcvf
把打包后文件发送到远程有两个命令可以使用; rsync scp (只需要做rsync验证登录或者ssh免密码登录就可以拷贝远程)
rsync命令: rsync -avP -e "ssh -p 52588" expect.sh root@192.168.149.131:/data/log
[root@localhost_002 shell]# rsync -avP -e "ssh -p 52588" expect.sh root@192.168.149.131:/data/log/
sending incremental file list
expect.sh
366 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)
sent 460 bytes received 35 bytes 990.00 bytes/sec
total size is 366 speedup is 0.74
scp命令: scp -P 52588 exe.sh root@192.168.149.131:/data/log/
[root@localhost_002 shell]# scp -P 52588 exe.sh root@192.168.149.131:/data/log/
exe.sh 100% 225 80.5KB/s 00:00
脚本命令如下:
[root@localhost_002 shell]# cat 77.sh
#!/bin/bash
cd /data/log
find /data/log/ -type f -mtime +3 -name "*.log" > /tmp/old_log
d=`date +%F`
tar zcvf $d.tar.gz `cat /tmp/old_log|xargs`
/usr/bin/rsync -avP -e "ssh -p 52588" $d.tar.gz root@192.168.149.131:/data/log/
#scp -P 52588 $d.tar.gz root@192.168.149.131:/data/log/
cat /tmp/old_log/|xargs rm -f
执行脚本:
[root@localhost_002 shell]# sh 77.sh
/data/log/anaconda.log
/data/log/X.log
/data/log/program.log
/data/log/packaging.log
/data/log/storage.log
/data/log/ifcfg.log
/data/log/ks-script-E_14kx.log
/data/log/ks-script-ojsReP.log
/data/log/journal.log
sending incremental file list
2019-03-10.tar.gz
195,777 100% 61.79MB/s 0:00:00 (xfr#1, to-chk=0/1)
sent 1,919 bytes received 1,715 bytes 7,268.00 bytes/sec
total size is 195,777 speedup is 53.87
3、有如下文本:其中前5行内容如下:
1111111:13443253456
2222222:13211222122
1111111:13643543544
3333333:12341243123
2222222:12123123123
用 shell 脚本处理后,按下面的格式输出:
[1111111]
13443253456
13643543544
[2222222]
13211222122
12123123123
[3333333]
12341243123
分析:本题的目的,是以第一段为基准,列出第二段;
首先需要截取第一段的内容,排序及去重; 然后遍历第一段的内容,用 awk 匹配来获取第二段的相关内容;
for w in `awk -F ':' '{print $1}' 3.txt|sort -n|uniq ; do echo "[$w]" ; done`
[root@fenye2019 shell]# awk -F ':' '{print $1}' 3.txt|sort -n|uniq
[root@fenye2019 shell]# for w in `awk -F ':' '{print $1}' 3.txt|sort -n|uniq`; do echo "[$w]"; done
[1111111]
[2222222]
[3333333]
第一段的内容获取到了,接下来和源文件 3.txt 匹配(awk实现),当匹配到$1== w时(w是上面的循环结果),则打印出 $2 出来;
不过此时涉及到一个传参的问题,如果把shell的参数出传递到 awk 中; awk -v w2=$w -F ':' '$2==w2 {print $2}'
for w in `awk -F ':' '{print $1}' 3.txt|sort -n|uniq` ; do echo "$[w]"; awk -v w2=$w -F ':' '$1==w2 {print $2}' 3.txt ; done
[root@fenye2019 shell]# for w in `awk -F ':' '{print $1}' 3.txt|sort -n|uniq`; do echo "[$w]"; awk -v w2=$w -F ':' '$1==w2 {print $2}' 3.txt ; done
[1111111]
13443253456
13643543544
[2222222]
13211222122
12123123123
[3333333]
12341243123
当然 awk 也可以用如下这种方式来调用shell的参数 "' '" (里面是单引号,外层是双引号的方式)
awk -F ':' '$1=="'$w'" {print $2}' 3.txt
[root@fenye2019 shell]# for w in `awk -F ':' '{print $1}' 3.txt|sort -n|uniq`; do echo "[$w]"; awk -F ':' '$1=="'$w'" {print $2}' 3.txt ; done
[1111111]
13443253456
13643543544
[2222222]
13211222122
12123123123
[3333333]
12341243123
脚本代码如下:
[root@fenye2019 shell]# cat 78.sh
#!/bin/bash
for w in `awk -F ':' '{print $1}' 3.txt|sort -n|uniq`
do
echo [$w]
awk -v w2=$w -F ':' '$1==w2 {print $2}' 3.txt
done