34. Perl 脚本实战-rscpup

朱雀 2022-01-27 22:37 332阅读 0赞

rscpdown 用于免交互从远程服务器上下载文件, 不能下载多个文件。 命令使用说明:

  • 命令依赖expect 环境
  • 命令携带用户名和密码, 无须交互
  • 文件名支持通配符方式批量下载多个文件
  • 命令只能下载文件, 不能下载目录
  • 命令最多只能包含5个参数, 不支持多个目标文件参数

1. 用法示例

1.1 查询单个进程

  1. $ rscpdown 127.0.0.1 zongf 123456 . /etc/group
  2. group

1.2 查询多个关键字

  1. $ rscpdown 127.0.0.1 zongf 123456 . /etc/pass* /usr/bin/expect
  2. passwd 100% 2488 4.5MB/s 00:00 ETA

2. 命令源码

  1. #!/usr/bin/perl
  2. #Desc: 从远程服务器批量下载文件. 此脚本依赖于expect 环境, 请先安装expect环境
  3. #Args: 远程服务器ip, 用户名, 密码, 本地文件夹, 远程文件名列表, [expect 命令绝对路径]
  4. #Auth: zonggf
  5. #Date: 2017-07-11
  6. use Term::ANSIColor qw(:constants);
  7. $Term::ANSIColor::AUTORESET = 1;
  8. #检查是否是查询帮助
  9. sub check_help{
  10. my $param = $ARGV[0];
  11. if("-h" eq $param || "--help" eq $param){
  12. print BOLD BLUE "Desc: "; print "从远程服务器上批量下载文件.此脚本依赖expect 环境, 需要先安装expect\n";
  13. print BOLD BLUE "Args: "; print "参数列表: 服务器ip, 用户名, 用户密码, 本地目录, 远程文件名(支持通配符), [expect 命令绝对路径]\n";
  14. print BOLD BLUE "Exam: "; print "./rscpdown root root . /tmp/hello*.txt ." \"\n\t\b\b./rscpdown root root . /tmp/hello*.txt /usr/bin/expect\n";
  15. print BOLD BLUE "Auth: "; print "zonggf\n";
  16. print BOLD BLUE "Date: "; print "2017-07-11\n";
  17. exit;
  18. }
  19. #判断传入参数个数
  20. if(@ARGV < 5){
  21. print "[error] the param cannot less 5\n";
  22. exit;
  23. }elsif(@ARGV > 5){
  24. $expect = pop @ARGV;
  25. }
  26. }
  27. #################### 主程序 ####################
  28. #校验帮助
  29. &check_help;
  30. #设置默认命令
  31. $expect = "expect";
  32. #获取脚本传入的ip, 用户名, 密码
  33. ($ip, $user, $password, $local_dir, $remote_files) = @ARGV;
  34. #拼接expect命令
  35. $cmd = "$expect -c 'spawn scp $user\@$ip:$remote_files $local_dir \n"
  36. ."expect {\n"
  37. .'"*yes/no*" { send "yes\r"; exp_continue }' . "\n"
  38. ."\"*password:*\" { send \"$password\\r\" } \n"
  39. ."}\n"
  40. ."interact\n"
  41. ."exit\n"
  42. ."'";
  43. # 执行命令
  44. @files = `$cmd`;
  45. # 处理返回结果
  46. $flag = 0;
  47. for my $el (@files){
  48. if( $el =~ /password:/ ){
  49. $flag = 1;
  50. }elsif ($flag == 1){
  51. #返回换行符为crlf, 即/r/n
  52. $el =~ s/\r\n/\n/g;
  53. #去除两侧空格
  54. $el =~ s/^\s+|\s+$//g;
  55. push (@results, $el);
  56. }
  57. }
  58. #处理返回结果
  59. unless($#results == 0 && $results[0] =~ /cannot access/){
  60. for my $el (@results){
  61. unless($el =~ /^\s*$|:$/){
  62. print "$el\n";
  63. }
  64. }
  65. }

发表评论

表情:
评论列表 (有 0 条评论,332人围观)

还没有评论,来说两句吧...

相关阅读

    相关 34. Perl 脚本实战-rscpup

    rscpdown 用于免交互从远程服务器上下载文件, 不能下载多个文件。 命令使用说明: 命令依赖expect 环境 命令携带用户名和密码, 无须交互 文件