用于读取samba配置的Linux Bash脚本

时间:2012-12-06 23:50:00

标签: bash samba

我正在尝试创建一个bash脚本来读取samba配置,循环遍历不同的“部分”并在设置变量时执行

以下是配置示例:

[global]
    workgroup = METRAN
    encrypt passwords = yes
    wins support = yes
    log level = 1 
    max log size = 1000
    read only = no
[homes] 
    browsable = no
    map archive = yes
[printers] 
    path = /var/tmp
    printable = yes
    min print space = 2000
[music]
    browsable = yes
    read only = yes
    path = /usr/local/samba/tmp
[pictures]
    browsable = yes
    read only = yes
    path = /usr/local/samba/tmp
    force user = www-data

这就是我想要做的事情(我知道这种语法是一种真正的语言,但它应该给你一个想法:

#!/bin/sh
#
CONFIG='/etc/samba/smb.conf'
sections = magicto $CONFIG    #array of sections
foreach $sections as $sectionname       #loop through the sections
  if $sectionname != ("homes" or "global" or "printers")
    if $force_user is-set
       do something with $sectionname and with $force_user
    endif
    else
       do something with $sectionname
    endelse
  endif
endforeach

3 个答案:

答案 0 :(得分:1)

这将读取每个部分并获得键值对。

#!/bin/bash
CONFIG='/etc/samba/smb.conf'
for i in homes music; do
    echo "$i"
    sed -n '/\['$i'\]/,/\[/{/^\[.*$/!p}' $CONFIG | while read -r line; do
        printf "%-15s : %s\n" "${line%?=*}" "${line#*=?}"
    done
done

<强>输出

homes
browsable  : no
map archive : yes
music
browsable  : yes
read only  : yes
path       : /usr/local/samba/tmp

<强>解释

  • sed -n '/\['$i'\]/,/\[/{/^\[.*$/!p}'

    1)/\['$i'\]/,/\[/匹配[]到下一个[

    之间的版块名称

    2){/^\[.*$/!p}匹配行^的开头,后跟[和零个或多个字符.*,直到行结束$,如果匹配则不匹配't print !p

  • ${line%?=*}从结尾(右)修剪字符串,直到第一个=和任何字符?

  • ${line#*=?}修剪字符串从开头(左)到第一个=和任何字符?

答案 1 :(得分:0)

使用Perl:

use strict;
use warnings;

sub read_conf {
  my $conf_filename = shift;
  my $section;
  my %config;
  open my $cfile, "<", $conf_filename or die ("open '$conf_filename': $!");
  while (<$cfile>) {
    chomp;
    if (/^\[([^]]+)]/) {
      $section = $1; 
    } else {
      my ($k, $v) = split (/\s*=\s*/);
      $k =~ s/^\s*//;
      $config{$section}{$k} = $v; 
    }   
  }
  close $cfile;
  return \%config;
}

sub main {
  my $conf_filename = '/etc/samba/smb.conf';
  my $conf = read_conf($conf_filename);
  foreach my $section (grep { !/homes/ and !/global/ and !/printers/} keys %$conf) {
    print "do something with: $section\n";
    foreach my $key (keys %{$conf->{$section}}) {
      my $val = $conf->{$section}{$key};
      print "$key is $val in $section\n";
    }   
  }
}

main;

答案 2 :(得分:0)

如果您对Perl感到满意,可以查看Config :: Std

http://metacpan.org/pod/Config::Std

对此问题的致意:How can I find all matches to a regular expression in Perl?