一年十二月  谁主春秋
关注:基础系统工程 密码学 人工智能
C++博客
首页
新随笔
联系
聚合
管理
随笔-157 评论-223 文章-30 trackbacks-0
Shell应用(9):自动化批量编译
脚本概述
当需要在很多(比如几十至几百)台机器上编译同一程序时,如果一个个地手工拷贝源码、再编译,那么效率就很低,为了能大量节省手工、并行地编译,因此写了一个脚本,该脚本基于自动化脚本语言expect(expect基于tcl)实现,基本原理是针对每个远程主机,创建一个子进程,在该子进程内先调用scp拷贝源码到远程主机,再用ssh登录到远程主机、发送cd、configure和make命令,交互期间的命令输出多用正则分析,最终的编译输出保存到当前目录output子目录下。其命令行参数说明如下:
●
第1参数为远程主机配置文件:一个多行文本文件,每行格式为IP 用户名 密码,空格符分隔,支持#注释。
●
第2参数为本地主机源码目录:要求该目录存在Makefile和configure文件。
●
第3参数为远程主机目标目录:用于存放源码的位置。
脚本实现
拷贝源码
1
proc
copy_file
{host user srcdir dstdir passwd {
to
10
} } {
2
if
[catch
"
spawn scp -rq $srcdir $user@$host:$dstdir
"
msg] {
3
send_error
"
failed to spawn scp: $msg\n
"
4
exit
1
5
}
6
7
set
timeout $
to
8
expect_after eof
{
9
send_error
"
$host scp died unexpectedly\n
"
10
exit
1
11
}
12
expect {
13
"
(yes/no)?
"
{ send
"
yes\r
"
; exp_continue }
14
-
re
"
(?:P|p)assword:
"
{ send
"
$passwd\r
"
}
15
timeout { do_timeout
"
$host scp
"
}
16
}
17
18
expect {
19
full_buffer
{ exp_continue }
20
timeou
t
{ exp_continue }
21
eof
22
}
23
}
第2行调用spawn命令执行scp命令,并用catch捕捉错误;当执行成功后,第12行用expect等待远端输出(超时默认为10秒),第13、14行自动输入用户名和密码,当过程中网络连接断开时,会匹配到第8行的eof;当输出完成连接关闭时,会匹配到第21行的eof;如果输出太多超过expect内部的buffer时,会匹配到第19行的full_buffer,这里由于为了提高效率,使用了静默方式的scp,因些实际会匹配到第20行的timeout,不管匹配到哪种情况,都要继续直到eof。
执行编译
1
proc
do_make
{host user passwd subdir {
to
10
} } {
2
if
[catch {spawn ssh $user@$host} msg ] {
3
send_error
"
failed to spawn ssh: $msg\n
"
4
exit
1
5
}
6
7
set
timeout $
to
8
expect_after eof {
9
send_error
"
$host ssh died unexpectedly\n
"
10
exit
1
11
}
12
13
expect {
14
"
*yes/no
"
{ send
"
yes\r
"
; exp_continue }
15
-
re
"
(?:P|p)assword:
"
{ send
"
$passwd\r
"
}
16
timeout { do_timeout
"
$host ssh
"
}
17
}
18
wait_cmd $spawn_id passwd
19
20
send
"
cd
$subdir\r
"
21
wait_cmd $spawn_id cd
22
23
send
"
source configure
\r
"
24
wait_cmd $spawn_id configure
25
26
send
"
make
\r
"
27
wait_cmd $spawn_id make
28
29
send
"
exit\r
"
30
expect eof
31
}
关于spawn和expect的解释与上节
拷贝源码
相同,不同的是依次发送命令cd、source configure、make,每个命令须等到命令提示符后(调用自定义函数wait_cmd)再发下一个,最后发送exit退出ssh、导致连接关闭,匹配到最后一行的eof。对于有的项目源码,可能没有或不用配置,那么configure文件可以不存在或内容为空,如果不存在导致报错也没关系,不影响make;如果configure出错,那么make也会出错。这里使用source是为了使配置在当前shell中生效。
主循环
1
set
f [open $file r]
2
set
curtime [clock seconds]
3
4
log_user
0
5
set
s {[:blank:]}
6
set
pattern
"
^(\[^#$s]+)\[$s]+(\[^$s]+)\[$s]+(\[^$s]+)
"
7
8
while
{ [gets $f line] !
=
-
1
} {
9
if
{ ![
regexp
$pattern [
string
trimleft $line] ? host user passwd] } {
10
continue
11
}
12
send_user
"
$host $user $passwd\n
"
13
if
{ ![fork] } {
14
15
set
filename output
/
${host}_[clock format $curtime
-
format %y.%m.%d_%H.%M.%S].log
16
log_file
-
noappend
-
a
$filename
17
18
copy_file $host $user $srcdir $dstdir $passwd
30
19
do_make $host $user $passwd $subdir
30
20
21
send_user
"
$host finish\n
"
22
exit
23
}
24
}
打开远程主机配置文件,读取每一行直到文件尾,忽略注释行,用正则提取IP、用户名和密码,创建子进程,按IP和当前时间命名log文件(由于前面调用log_user 0关闭了控制台输出,因此为了能记录输出到日志文件,一定要加-a选项),最后调用函数copy_file和do_make。
完整脚本下载:
autobuild.zip
posted on 2016-09-28 11:04
春秋十二月
阅读(3839)
评论(0)
编辑
收藏
引用
所属分类:
System
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
Windows异常分发与子系统图表集 -- 摘自Windows内核原理与实现
浅谈Linux共享库库函数挂钩检测
kretprobe探究思考
基于Rust构建WebAssembly
基于VSS可传输卷影拷贝的备份架构
Shell(11): 创建和删除so库软链接
关于make依赖文件的自动生成
Shell应用(10):支持开源库编译的Makefile
Shell应用(9):自动化批量编译
一种拦截Linux动态库API的方法及装置
网站导航:
博客园
IT新闻
BlogJava
博问
Chat2DB
管理
本博客所有随笔均为原创,因为不定期维护更新,所以转载请注明出处,如有问题和建议,请留言或评论,发表您的宝贵意见,藉此平台以分享交流、共同进步。
联系方式:微信theory-math
<
2023年12月
>
日
一
二
三
四
五
六
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(69)
给我留言
查看公开留言
查看私人留言
随笔分类
(156)
Algorithm(44)
C/C++(24)
Compiler(25)
Compute Theory(5)
Database(4)
Network(17)
Opensrc(13)
System(24)
随笔档案
(157)
2024年12月 (1)
2024年11月 (1)
2024年9月 (1)
2024年8月 (2)
2024年6月 (1)
2024年5月 (1)
2024年4月 (1)
2024年3月 (2)
2024年2月 (2)
2023年12月 (1)
2023年11月 (2)
2023年10月 (2)
2023年9月 (37)
2021年12月 (1)
2021年10月 (1)
2021年9月 (1)
2021年2月 (1)
2020年5月 (3)
2020年4月 (1)
2019年11月 (4)
2019年7月 (1)
2018年11月 (1)
2017年12月 (1)
2016年12月 (1)
2016年11月 (2)
2016年10月 (1)
2016年9月 (1)
2016年8月 (3)
2016年7月 (4)
2016年5月 (1)
2015年10月 (2)
2015年9月 (1)
2015年6月 (2)
2015年5月 (3)
2015年2月 (1)
2015年1月 (1)
2014年12月 (2)
2014年4月 (2)
2014年3月 (1)
2014年1月 (1)
2013年10月 (1)
2013年9月 (1)
2013年8月 (3)
2013年5月 (1)
2013年3月 (1)
2012年11月 (1)
2012年9月 (3)
2012年8月 (1)
2012年7月 (1)
2012年6月 (5)
2012年5月 (3)
2011年12月 (5)
2011年11月 (1)
2011年10月 (5)
2011年8月 (7)
2011年7月 (6)
2011年6月 (6)
2010年6月 (1)
2009年12月 (1)
2009年8月 (1)
2009年7月 (1)
2009年6月 (1)
2009年4月 (3)
文章分类
(30)
诗词作品集(30)
关注的开源项目
LLVM
编译系统
nginx
高性能Web服务器
OpenSSL
密码学库
suricata
网络IPS引擎
最新随笔
1. 不定方程的代数数论解法
2. 关于椭圆曲线的验证计算
3. 不可约多项式判别算法的改正
4. 论证有限域上平方根的求解
5. 求解离散对数问题的Terr算法
6. 简单私钥加密构造的验证及安全性分析
7. 二元有限域及其扩域上的计算
8. 简单连分数攻击RSA的迭代次数分析
9. 有限循环群的结构及生成元的判定
10. 混合线性同余发生器的引理验证
积分与排名
积分 - 408572
排名 - 56
最新评论
1. re: 一种拦截Linux原始套接字IO的方法[未登录]
很有前途和很有钱途啊。
--chipset
2. re: 一种拦截Linux原始套接字IO的方法[未登录]
@chipset
是的
--春秋十二月
3. re: 一种拦截Linux原始套接字IO的方法[未登录]
工作是做网络安全?
--chipset
4. re: 一种使用函数指针实现状态机的方法
函数指针实现状态机
--linda
5. re: 多标签视图类CTabView的设计实现
为啥代码缺少一些呢,给新手个完整点的啊
--pekingliu
6. re: 工作线程与消息循环
从消息队列取出消息 mark了
--mmocake
7. re: 一种简单的跨平台套接字管道
评论内容较长,点击标题查看
--IT搬运工
8. re: 一种简单的跨平台套接字管道
windows仅支持af_init和af_init6地址族有错别字么?
af_init和af_init6
--IT搬运工
9. re: Shell应用(8):使用awk定位反汇编输出[未登录]
厉害
--Chipset
10. re: TCP分组丢失时的状态变迁
不错
--Binky
阅读排行榜
1. 基于OpenSSL实现的安全连接(13883)
2. 字符串16进制显示(12840)
3. 基于boost asio实现的ssl socket框架(12254)
4. Linux套接字与虚拟文件系统(1):初始化和创建(8598)
5. 关于数据库的一些学习研究心得(8073)
6. 使用CString GetBuffer自适应获取计算机名称(7949)
7. 使用正则表达式解析URL(7888)
8. basic_string内存泄露问题之分析解决(7688)
9. Shell应用(4): 使用sed删除行尾的^M字符(7630)
10. nginx iocp(1):tcp异步连接(7564)
评论排行榜
1. basic_string内存泄露问题之分析解决(19)
2. 求单向链表倒序第m个元素(11)
3. 基于顺序存储实现的多叉树(1):深度优先存储(9)
4. 字符大小写转换(7)
5. 字符串16进制显示(6)
6. 面向对象锁框架的设计与实现(6)
7. Shell应用(4): 使用sed删除行尾的^M字符(5)
8. 工作线程与消息循环(5)
9. 使用正则表达式解析URL(5)
10. 十进制整数千位分隔符(4)