Como incluir todos os arquivos de um diretório no shell script (/etc/init.d/iptables neste caso)

6

Eu tenho um script /etc/init.d/iptables start|stop|restart em diferentes servidores ubuntu (que é um script de shell normal)

Para cada novo serviço, tenho que editar e inserir uma linha para abrir uma porta. Isso leva a muitas versões diferentes do script init.d em máquinas diferentes.

É possível incluir automaticamente todos os arquivos em /etc/iptables/include.d/ ?

O alvo é que deve haver apenas uma linha na função start de /etc/init.d/iptables como

include /etc/iptables/include.d/*

E depois de um arquivo adicional em /etc/iptables/include.d/ , eu simplesmente diria

/etc/init.d/iptables restart

Editar: Como Saurabh apontou, isso pode levar a problemas quando os comandos precisam de uma certa ordem. Uma configuração avançada pode ter diretórios diferentes, como:

/etc/iptables/include01.d/
/etc/iptables/include02.d/
/etc/iptables/include03.d/

e incluindo-os assim:

    include /etc/iptables/include01.d/*
    ... maybe some code goes here in the main file...
    include /etc/iptables/include02.d/*
    include /etc/iptables/include03.d/*
    
por user12096 16.07.2009 / 11:54

5 respostas

11

Adicione a seguinte linha ao script init.d.

run-parts --report /etc/iptables/include.d

Ele irá executar tudo no diretório como um script de shell (precisa ser executável).

Se você só quer executar arquivos que terminam com .port, você poderia usar algo como:

run-parts --regex '\.port$' /etc/iptables/include.d/

Se você quiser ter certeza de que o pedido está correto, você pode nomear os arquivos:

10_web.port
20_ssh.port
etc..
    
por 16.07.2009 / 12:25
3
for f in /etc/iptables/include.d/*
 . $f
done

observe o espaço entre ponto e% f

Saurabh está certo - isso não vai funcionar como você pretende, mas use alguma convenção de nomenclatura, por exemplo, 10-xxx, 20-yyy e assim por diante, e isso pode ser gerenciável.

    
por 16.07.2009 / 12:18
2

Você pode definir uma função simples no bash:

function include() {
    for FILE in $( find "$1" -type f -print | sort )
    do
        source $FILE
    done
}

e depois:

include some_dir/*

ou até mesmo:

include some_dir/*.conf
    
por 16.07.2009 / 13:40
2

Você também pode considerar construir o script iptables a partir de arquivos de modelo, um dos quais seria o script original do iptables. crie um script que leia seus arquivos de modelo nos diretórios relevantes e crie um novo script iptables a partir deles. Dessa forma, quando você precisar fazer alterações, faça isso nos modelos e execute novamente o gerador de scripts.

Usando esse método, você pode até obter marcadores de fantasia e de lugar no modelo base, que podem ser usados para sinalizar quando incluir arquivos de diretórios específicos em sua árvore de modelos.

    
por 16.07.2009 / 14:44
0

Eu não acho que você possa incluir arquivos na configuração do iptables. A escolha faz sentido, pois as regras de firewall dependem muito da ordem em que são escritas. Se apenas incluirmos os arquivos na pasta, o iptables não saberá quais regras colocar primeiro e qual depois.

    
por 16.07.2009 / 12:17