Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4212492
  • 博文数量: 291
  • 博客积分: 8003
  • 博客等级: 大校
  • 技术积分: 4275
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-30 18:28
文章分类

全部博文(291)

文章存档

2017年(1)

2013年(47)

2012年(115)

2011年(121)

2010年(7)

分类: LINUX

2011-05-08 16:51:58

对于运维来说,同时管理多台机器是很辛苦的事情,特别是CDN运维需要把1000台机器上的日志下载到一台机器上,靠人工一个个下载非常费劲,为此我写了一个从多台机器批量下载到本机的小程序。

下载完后把文件放到自动按照ip生成的目录。

其中用到了expect:
  Expect在这个程序里就是用来帮助自动输入scp的密码,Expect主要用于把需要人工交互的程序变为程序自动化完成,这个对于运维批量部署系统,批量无人值守安装,批量执行命令,批量上传下载
 现代的Shell对程序提供了最小限度的控制(开始,停止,等等),而把交互的特性留给了用户。 这意味着有些程序,你不能非交互的运行,比如说passwd。 有一些程序可以非交互的运行,但在很大程度上丧失了灵活性,比如说fsck。这表明Unix的工具构造逻辑开始出现问题。Expect恰恰填补了其中的一些裂痕,解决了在Unix环境中长期存在着的一些问题。

  Expect使用Tcl作为语言核心。不仅如此,不管程序是交互和还是非交互的,Expect都能运用。


1.multi_scp_download.sh的源代码
  1. #用来通过scp批量下载目标机器文件或者目录到指定目录
  2. #下载完毕后分别把文件在指定目录下按照ssh_host的ip生成目录里
  3. #例如:/root/download/1.1.1.1/a.txt /root/download/2.2.2.2/a.txt
  4. #配置文件格式:
  5. #ssh_hosts=("1.1.1.1" "2.2.2.2")
  6. #ssh_ports=("22" "22")
  7. #ssh_users=("root" "root")
  8. #ssh_passwords=("23" "322")
  9. #执行:sh multi_scp_download.sh conf_file_path target local_dir
  10. if [ -z "$3" ]
  11. then
  12. echo "sh multi_scp_download.sh conf_file_path target local_dir";
  13. exit;
  14. fi
  15. #upload shell script file path
  16. scp_upload=scp_upload.sh
  17. #configure file path
  18. conf_file=$1
  19. #remote host'target file or dir path
  20. scp_target=$2
  21. #then local file path or dir path
  22. scp_local_dir=$3
  23. #判断conf_file配置文件是存在
  24. if [ ! -e "$conf_file" ]
  25. then
  26. echo "$conf_file is not exists";
  27. exit;
  28. fi
  29. if [ ! -d "$scp_local_dir" ]
  30. then
  31. echo "$scp_local_dir is not exists and must be a dir";
  32. exit;
  33. fi
  34. #read configure file
  35. source $conf_file
  36. for((i=0;i<${#ssh_hosts[@]};i++))
  37. do
  38. #remote ssh host
  39. ssh_host=${ssh_hosts[$i]};
  40. if [ "$ssh_host" != "" ]
  41. then
  42. #remote ssh port
  43. ssh_port=${ssh_ports[$i]};
  44. #remote ssh user
  45. ssh_user=${ssh_users[$i]};
  46. #remote ssh password
  47. ssh_password=${ssh_passwords[$i]};
  48. scp_local_dir_host=$scp_local_dir/$ssh_host/
  49. mkdir -p $scp_local_dir_host
  50. echo "["`date +"%F %T"`"] (scp -r $ssh_user@$ssh_host:$ssh_port:$scp_target $scp_local_dir_host) start"
  51. #scp file or dir
  52. /usr/bin/expect scp_download.sh "$ssh_host" "$ssh_port" "$ssh_user" "$ssh_password" "$scp_target" "$scp_local_dir_host"
  53. echo "["`date +"%F %T"`"] (scp -r $ssh_user@$ssh_host:$ssh_port:$scp_target $scp_local_dir_host) end"
  54. echo ""
  55. else
  56. echo "ssh_host[$i]=null"
  57. fi
  58. done
2.scp_download.sh的源代码
  1. #!/usr/bin/expect
  2. #host
  3. set scphost "[lindex $argv 0]"
  4. #ssh端口
  5. set port "[lindex $argv 1]"
  6. #ssh用户名
  7. set scpuser "[lindex $argv 2]"
  8. #ssh密码
  9. set scppw "[lindex $argv 3]"
  10. #要在远程机器上的要下载到本地的文件名或者目录
  11. set target "[lindex $argv 4]"
  12. #要下载的文件名或者目录
  13. set file "[lindex $argv 5]"
  14. spawn scp -r -P $port $scpuser@$scphost:$target $file
  15. #设置超时时间,防止远程机器防火墙没有开,而挂起
  16. set timeout 30
  17. expect {
  18. #respose: "root@1.2.3.4's password:",自动输入密码
  19. "*password*" {
  20. set timeout 30
  21. send "$scppw\r"
  22. }
  23. #the first connect will respose "Are you sure you want to continue connecting (yes/no)? yes"
  24. "*yes*" {
  25. set timeout 30
  26. send "yes\r"
  27. set timeout 30
  28. expect "*password*"
  29. set timeout 30
  30. send "$scppw\r"
  31. }
  32. busy {send_user "\n";exit;}
  33. failed {send_user "\n";exit;}
  34. timeout {send_user "\n";exit;}
  35. }
  36. #Permission denied not try again,回报出错信息
  37. expect {
  38. "*denied*" {
  39. send_user "\n"
  40. exit
  41. }
  42. "*No such file*" {
  43. send_user "\n"
  44. exit
  45. }
  46. busy {send_user "\n";exit;}
  47. failed {send_user "\n";exit;}
  48. timeout {send_user "\n";exit;}
  49. }
  50. exit
3.配置文件格式scp.conf
  1. ssh_hosts=("1.1.1.1" "2.2.2.2")
  2. ssh_ports=("22" "22")
  3. ssh_users=("root" "root")
  4. ssh_passwords=(’abc' 'efg')
4.运行代码
找一台机器可以和要上传的机器联通,安装好expact
把scp_download.sh,multi_download.sh,scp.conf放到同一个目录下,运行multi_scp_download.sh即可
5.运行效果
《scp批量上传文件到多台机器上》:
 
大家多多支持,下周我会再发《scp批量在多台机器上执行命令》
阅读(3515) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~