Agora com uma parte do arquivo dá pra ver melhor o que vc quer :)
veja se é isso.
$ cp csf.conf csf.conf-original
$ for regra in TCP_IN UDP_IN TCP6_IN UDP6_IN; do
NETWORKPORT1=10
exp="^$regra = .*[\",]{1}$NETWORKPORT1[\",]{1}"
[[ "$(cat csf.conf)" =~ $exp ]] && { sed -i "/$regra/ s/$NETWORKPORT1//;
s/\",/\"/; s/,,/,/;
s/,\"/\"/" csf.conf;} || { sed -i "/$regra/ s/\"$/,$NETWORKPORT1\"/" csf.conf;}
done
Para inclusão da porta, o teste da expressão entra no || já que a porta não
existe.
Para exclusão, entra no && já que a porta existe e vai casar com a expressão.
Pode ter faixas de portas separadas por dois-pontos misturadas na mesma regra,
por exemplo na regra TPC_IN? Se puder daí complica, o meu exemplo não funciona.
Abraços Paulo Bettega
On 25-06-2014 13:51, Arkan Add address@hidden [shell-script] wrote:
> Sem problemas,
>
> Preciso editar algumas linhas dentro daquele arquivo (csf.conf) em /etc/csf/.
>
> Hoje preciso criar um script manualmente com as portas que quero liberar e gero
aquela linha "sed -i
> 's/^TCP_IN =.*/TCP_IN = "227,280,9090,10500,57413"/' csf.conf"para
substituir a linha existente.
>
> Por exemplo,
>
> Se eu configuro um serviço que utiliza a porta 10, pego as TCP/UDP_IN
TCP6/UDP6_IN... , adiciona a
> porta 10, edito e executo a linha "sed -i 's/^TCP_IN =.*/TCP_IN =
"227,280,9090,10500,57413,10"/'
> csf.conf" Alterando o campo TCP_IN para o protocolo correspondete.
>
> E para remover realizo o mesmo procedimento, somente retirando as portas que
de
>
> /etc/csf/csf.conf
> ...
> # Lists of ports in the following comma separated lists can be added using a
> # colon (e.g. 30000:35000).
>
> # Allow incoming TCP ports
> TCP_IN = "80,10000,33650,33651"
>
> # Allow outgoing TCP ports
> TCP_OUT = "1:65535"
>
> # Allow incoming UDP ports
> UDP_IN = "33651"
>
> # Allow outgoing UDP ports
> # To allow outgoing traceroute add 33434:33523 to this list
> UDP_OUT = "1:65535"
>
> # Allow incoming PING
> ICMP_IN = "1"
>
> # Set the per IP address incoming ICMP packet rate
> # To disable rate limiting set to "0"
> ICMP_IN_RATE = "1/s"
>
> # Allow outgoing PING
> ICMP_OUT = "1"
>
> # Set the per IP address outgoing ICMP packet rate (hits per second allowed),
> # e.g. "1/s"
> # To disable rate limiting set to "0"
> ICMP_OUT_RATE = "0"
>
>
###############################################################################
> ...
>
> No exemplo do Paulo, ele consegue inserir a variavel na linha, mas ele seta
a linha com os valores a
> serem pesquisados, como variavel.
>
>
>
> On Wednesday, June 25, 2014 9:54 AM, "'Julio C. Neves' address@hidden
[shell-script]"
> <address@hidden> wrote:
>
>
> Cara que bobeada, eu ia fazer em awk e depois achei melhor fazer em sed.
Como já estava com um sono
> danado, acho que misturei tudo e fiz uma grande besteira e gerei um
cruzamento de 'aff maria' com
> 'cruz credo'.
>
> Pesquisei no arquivo pq foi isso que imaginei que vc queria. O problema é
que seu exemplo foi meio
> incoerente com o que vc está falando. Seu exemplo foi:
>
> sed -i 's/^TCP_IN =.*/TCP_IN = "227,280,9090,10500,57413"/' csf.conf
>
> Por favor explique melhor a que linha vc se refere. O que vc deseja na
saída, algumas linhas
> editadas ou o arquivo /etc/csf.conf editado?
>
> Algumas dicas:
> 1- A barra vertical dentro de uma expressão regular equivale a um 'ou'
lógico então para pesquisar
> as cadeias que vc citou, pode-se separar as linhas da seguinte maneira:
> grep -E
'^(TCP_IN|TCP_OUT|UDP_IN|UDP_OUT|TCP6_IN|TCP6_OUT|UDP6_IN|UDP6_OUT)=' /etc/csf.conf
>
> 2- Vc tb pode especificar as linhas que deseja alterar, passando o inicio
delas por parâmetro,
> colocando logo no início do script o seguinte:
> RegExp=^\($(tr ' ' '|' <<< "$@")\)\ =
> Fiz um testezinho no prompt para vc entender:
> $ set - TCP_IN TCP_OUT UDP_IN # passando os parâmetros TCP_IN TCP_OUT UDP_IN
para o
> shell do prompt
> $ RegExp=^\($(tr ' ' '|' <<< "$@")\)\ = # Gerando a Expressão Regular
> $ echo "$RegExp" # Mostrando que ER está pronta para ser usada
> ^(TCP_IN|TCP_OUT|UDP_IN) =
>
> Abcs,
> Julio
> *@juliobash*
> *Próximos cursos de Shell*
> *Cidade LocalPeríodo*
> *Rio de JaneiroEDX <http://edx.srv.br/>02 a 06/06*
> *São Paulo4Linux <http://www.4linux.com.br/>21 a 25/07*
> Dou treinamento de /Shell/ em qualquer cidade.
> Para mais detalhes, me mande um e-mail <mailto:address@hidden>.
>
>
>
> Em 24 de junho de 2014 23:48, Arkan Add address@hidden
<mailto:address@hidden>
> [shell-script] <address@hidden <mailto:address@hidden>> escreveu:
>
> __
> Julio,
>
> ++ sudo grep '\b51211\b' /etc/csf/csf.conf
> ++ sudo sed -i.veio '/^TCP_IN/; s/$/,51211' /etc/csf/csf.conf
> sed: -e expression #1, char 10: unknown command: `;'
> ++ echo Incluindo porta 51211
> Incluindo porta 51211
>
> Houve falha na adiçao da regra. Vi que voce procurou pelo valor no arquivo e
não na linha, é
> possivel procurar somente na linha ou linhas? Eu terei que adicionar esta
mesma variavel nas
> linhas que se iniciam com TCP_IN = , TCP_OUT = , UDP_IN = , UDP_OUT = ,
TCP6_IN = , TCP6_OUT = ,
> UDP6_IN = , UDP6_OUT = .
>
> Para remover este valor do csf.conf é que creio que esta mais complicado.
>
> Precisara ler o valor das linhas "network port1: , network port2:" dentro do
arquivo
> /etc/$NEWUSER1.info, voltar no /etc/csf/csf.conf e remove-las das linhas
TCP_IN = , TCP_OUT = ,
> UDP_IN = , UDP_OUT = , TCP6_IN = , TCP6_OUT = , UDP6_IN = , UDP6_OUT = .
>
>
>
>
> On Tuesday, June 24, 2014 10:44 PM, "'Julio C. Neves' address@hidden
> <mailto:address@hidden> [shell-script]" <address@hidden
> <mailto:address@hidden>> wrote:
>
>
> grep "\b$NETWORKPORT1\b" /etc/csf.conf || {
> sed -i.veio "/^TCP_IN/; s/$/,$NETWORKPORT1"/etc/csf.conf
> echo Incluindo porta $NETWORKPORT1
> csf -r
> echo /etc/csf.conf está OK
> }
>
> Abcs,
> Julio
> *@juliobash*
> *Próximos cursos de Shell*
> *Cidade LocalPeríodo*
> *Rio de JaneiroEDX <http://edx.srv.br/>02 a 06/06*
> *São Paulo4Linux <http://www.4linux.com.br/>21 a 25/07*
> Dou treinamento de /Shell/ em qualquer cidade.
> Para mais detalhes, me mande um e-mail <mailto:address@hidden>.
>
>
>
> Em 24 de junho de 2014 22:21, address@hidden <mailto:address@hidden>
[shell-script]
> <address@hidden <mailto:address@hidden>> escreveu:
>
> __
> Estou precisando resolver uma questão de manipulação de texto para um
projeto pessoal de
> automação aqui. Basicamente tenho um script que cria usuarios
automaticamente e estou
> precisando adicionar uma função para liberar portas no firewall para os
serviços que este
> script habilita.
>
> Utilizo o csf como firewall e consigo refazer toda uma linha com o comando
abaixo:
>
> sed -i 's/^TCP_IN =.*/TCP_IN = "227,280,9090,10500,57413"/' csf.conf
>
> Os campos que preciso modificar são campos dentros das "".
>
> Por exemplo:
>
> Eu recebo a porta a porta pela variavel $NETWORKPORT1
>
> Supondo que o valor da variavel seja 50, preciso checar se ele existe na
linha TCP_IN dentro
> do /etc/csf.conf, se não existir, adiciona-lo e realizar o refresh de regras
executando um
> "csf -r".
>
> Também preciso realizar o contrario, verificar se um valor existe nesta
mesma linha,
> remove-lo e realizar o refresh nas regras.
>
> Qual a melhor forma de realizar tais funçoes?
>
>
>
>