Last active
June 13, 2023 05:18
-
-
Save viniciusgonmelo/2c8b3c618adcccc244c1fabfff99f173 to your computer and use it in GitHub Desktop.
Configura o firewall com o ufw
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env perl | |
# Script: ufw-config | |
# Descrição: Configura o firewall com o ufw | |
use 5.010; | |
use strict; | |
use warnings; | |
use Carp qw(croak); | |
use Getopt::Long; | |
use Readonly; | |
Readonly my %PORTS => ( | |
'SSH' => { port => 22, protocol => 'tcp' }, | |
'HTTP' => { port => 80, protocol => 'tcp' }, | |
'HTTPS' => { port => 443, protocol => 'tcp' }, | |
# Adicione outras portas conforme necessário | |
); | |
sub display_ports { | |
say 'Selecione as portas que você deseja abrir (separe com espaços):'; | |
my $counter = 1; | |
for my $key ( sort keys %PORTS ) { | |
say "$counter. $PORTS{$key}{port}/$PORTS{$key}{protocol} ($key)"; | |
$counter++; | |
} | |
} | |
sub enable_port { | |
my ( $port, $protocol ) = @_; | |
system("ufw allow $port/$protocol") == 0 or croak "Falha ao habilitar a porta $port/$protocol"; | |
} | |
sub parse_user_input { | |
my ($input) = @_; | |
my @selected_ports; | |
for my $item (split /\s+/, $input) { | |
if ($item =~ /^\d+$/) { | |
my $index = $item - 1; | |
if (my $key = (sort keys %PORTS)[$index]) { | |
push @selected_ports, $key; | |
} else { | |
say "Erro: opção inválida: $item"; | |
exit 1; | |
} | |
} elsif ($item =~ /^(\d+)\/(tcp|udp)$/i) { | |
my $new_port = { port => $1, protocol => lc($2) }; | |
push @selected_ports, $new_port unless $new_port ~~ @selected_ports; | |
} else { | |
say "Erro: entrada inválida: $item"; | |
exit 1; | |
} | |
} | |
return @selected_ports; | |
} | |
sub get_additional_ports { | |
say "Deseja adicionar outras portas? (S/N)"; | |
chomp(my $response = <STDIN>); | |
my @additional_ports; | |
if (lc($response) eq 's') { | |
say "Informe as portas adicionais no formato '80/tcp' ou '255/udp', separadas por espaços:"; | |
chomp(my $additional_ports_input = <STDIN>); | |
@additional_ports = parse_user_input($additional_ports_input); | |
} | |
return @additional_ports; | |
} | |
sub main { | |
# Verifica se o usuário está executando o script com privilégios de administrador | |
if ($> != 0) { | |
say "Erro: você precisa executar este script como usuário root ou com privilégios de administrador."; | |
exit 1; | |
} | |
display_ports(); | |
say "Por favor, insira o número correspondente à opção desejada (separe com espaços):"; | |
chomp(my $user_input = <STDIN>); | |
my @selected_ports = parse_user_input($user_input); | |
my @additional_ports = get_additional_ports(); | |
push @selected_ports, @additional_ports; | |
if (!@selected_ports) { | |
say "Erro: nenhuma porta selecionada."; | |
exit 1; | |
} | |
configure_firewall(@selected_ports); | |
say "\nFirewall configurado com sucesso!"; | |
} | |
main(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment