如何将失败的git pullpush操作通过expect脚本实现自动重启?
摘要:问题的提出 最近使用 github 上传、下载项目代码时,经常会卡很久,有时候在命令行打了 git push 然后就去上厕所了,结果等我回来的时候,发现 push 早已经失败了,还得重新提交一下。如果有一个工具,可以不停的重启失败的 git
问题的提出
最近使用 github 上传、下载项目代码时,经常会卡很久,有时候在命令行打了 git push 然后就去上厕所了,结果等我回来的时候,发现 push 早已经失败了,还得重新提交一下。如果有一个工具,可以不停的重启失败的 git push 直到它成功才退出,那就好了。
什么是 expect
在介绍使用 expect 重启 git 操作之前,先简单说明一下这个命令。其实它并不是一个新潮的东西,在很早以前就存在了,以至于现在一些系统默认都不带这个命令了,需要自己手工安装下:
$ sudo yum install expect
$ expect -v
expect version 5.44.1.15
简单的说,expect 就是完成一些需要与用户交互的任务,例如 telnet、ftp、ssh 远程登录机器的时候,这些命令会要求用户输入用户名、密码等相关信息,而这些,是无法通过 shell 脚本来完成的。这是因为这些命令是从控制终端而不是标准输入上读取的,所以无法事先将信息重定向到标准输入从而实现自动化运行。而 expect 就是用来解决这类问题的,下面是一个使用 expect 进行 ssh 登录的例子:
1 #!/usr/bin/expect -f
2 set ipaddr "localhost"
3 set passwd "iforgot"
4
5 spawn ssh root@$ipaddr
6 expect {
7 "yes/no" { send "yes\r"; exp_continue}
8 "password:" { send "$passwd\r" }
9 }
10
11 expect "]# "
12 send "touch a.txt\r"
13 send "exit\r"
14 expect eof
15 exit
expect 脚本里有这么几个关键动作:
spawn :启动需要执行的命令;
expect :解析命令输出,并根据下面的匹配语句进入子控制块;
send :向命令发送信息,这些信息相当于是命令从控制终端读取的;
interact :继续命令与控制终端的交互,此时用户可以正常向命令输入信息(本例未展示)。
……
好了,熟悉了 expect 的用法后,有人可能有疑问了,这个 git pull/push 操作也不涉及密码,用它做什么呢?这就是因人而异了,有些人是因为密码的关系用它,而我只看中了它的 expect 动作。
