使用crontab自动化拷贝工作
一、 背景
由于开发机上缺少相应的环境,平时我们(特别是像我之类的新人)为了调试方便,往往会直接在测试机上进行开发工作,然后再拷贝到开发机上,提交到svn。然而这样会存在很多问题,有时候我们明明在测试机上测试正常,提测之后却出了问题,仔细检查可能会发现我们拷贝了文件到svn。避免这样的问题,一是在开发过程中,记录自己修改创建的文件,但这样比较繁琐;二是在开发机上开发,自测时使用测试机进行测试。毫无疑问第二种方法要好一些,但是这样往往会增加很多繁琐的拷贝工作,本文就是为了减少这样的工作而撰写。
我们首先要在测试机上建立免密码登陆开发机的信任关系。A为测试机(我的测试机是aaa@bbb.com); B为开发机(我的开发机是ccc@ddd.com);
在A上的命令:
# ssh-keygen -t rsa (机器A上操作,连续三次回车,即在本地生成了公钥和私钥,不设置密码)
# ssh ccc@ddd.com (机器A上操作,ssh登陆机器B时需要输入密码)
# mkdir .ssh;chmod 700 .ssh (机器B上操作,如果.ssh目录存在,则不需要mkdir, 注:必须将.ssh的权限设为700)
# scp ~/.ssh/id_rsa.pub ccc@ddd.com:/home/users/qinlei01/.ssh/id_rsa.pub(机器A上操作,需要输入密码)
登陆机器B,在B上的命令:
# touch ~/.ssh/authorized_keys (如果已经存在这个文件, 跳过这条)
# chmod 600 ~/.ssh/authorized_keys (# 注意: 必须将~/.ssh/authorized_keys的权限改为600, 该文件用于保存ssh客户端生成的公钥,可以修改服务器的ssh服务端配置文件/etc/ssh/sshd_config来指定其他文件名)
# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys (将id_rsa.pub的内容追加到 authorized_keys 中, 注意不要用 > ,否则会清空原有的内容,使其他人无法使用原有的密钥登录)
回到A机器测试是否能免密码登陆机器B:
# ssh ccc@ddd.com(不需要密码, 登录成功)
=====================================================================
附上A与B互相免密码登陆的方法:
机器A:192.168.0.106
机器B:192.168.0.107
1、在机器A上执行如下操作
ssh-keygen -d
然后一路回车
cd ~/.ssh
cp id_dsa.pub authorized_keys2
chmod 600 authorized_keys2
2、在B上做如上同样的操作
3、建立A到B的信任关系(即A免密码登陆B)
在A中执行(注意需要把文件改名)
scp id_dsa.pub usernameB@192.168.0.107:.ssh/a.pub
在B中的~/.ssh下执行
cat a.pub >> authorized_keys2
此时从A执行ssh到B就不用输入密码了
4、建立B到A的信任关系(即B免密码登陆A)
在B执行
scp id_dsa.pub usernameA@192.168.0.106:.ssh/a.pub
在A执行
cat a.pub >> authorized_keys2
在配置过程需要输入多次密码
此时,无论从A到B,还是从B到A,都不需要输入密码了
如果出现问题,可以删除~/.ssh所有文件(连文件夹),然后重新配置
====================================================================
三、建立拷贝文件脚本
1、在机器A某路径建立拷贝文件脚本(如/home/wiki/xx.sh),在该xx.sh中加入自己需要从开发机上拷贝的文件。例如如下简单的xx.sh(要将xx.sh设定为可执行,可简单chmod 777 xx.sh)
scp qinlei01@db-gouyi.db01:/home/users/qinlei01/xxx /home/wiki/xxx
四、 crontab添加任务
1、 在A机器输入如下命令
# crontab –e (打开crontab的任务列表文件)
2、 输入如上命令后,vi会打开一个文件(不用管他),在其中输入如下命令(如果你想每一分钟执行xx.sh的话)
*/1 * * * * /home/wiki/xx.sh
五、附录
1、crontab使用:http://vbird.dic.ksu.edu.tw/linux_basic/0430cron.php#crontab
六、完结
到现在你的xx.sh脚本将会每隔一分钟执行拷贝任务了,这样你就不需要去关心从开发机拷贝代码到测试机的繁琐事务了。如果想即时将开发机上的代码拷贝到测试机上,只需手动执行xx.sh脚本即可。
xx.sh可以根据你的需要编写一些高级的逻辑,来判断文件自上次拷贝之后是否进行了修改,如果没有修改就跳过拷贝逻辑,来处理复杂的拷贝情况,这里给出 一个实现方案:在开发机上建立一个文件yy.txt,并在开发机上运行一个脚本定时计算需要拷贝的文件的md5值,与之前保存在yy.txt中相应文件的 md5值做比较,如果md5值改变,则写入另外一个文件zz.txt,然后测试机每隔固定时间从开发机拷贝这个zz.txt文件,这样测试机就知道哪些文 件发生了改变,只需要拷贝zz.txt中的文件即可,注意zz.txt中的相应文件的md5值需要覆盖yy.txt中相应文件的md5值,便于下一次比 较。当然如果觉得拷贝zz.txt也不够快速,可以考虑使用k-v数据库来存储。
希望这篇简单的文档能对你有所帮助。