Gerência do Squid
Publicado por Jonathan Lessa (última atualização em 29/06/2011)
[ Hits: 7.681 ]
Gerenciando o Squid com opções de adicionar/remover usuários, bloquear/liberar sites, verificar status da conexão, verificar status do squid, limpar o cache do squid.
*** Descomentar as linhas abaixo no squid.conf:
auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/conf/pass.geral
auth_param basic children 5
auth_param basic realm Proxy InfoNet
*** Adicionar as linhas abaixo no squid.conf:
###
#Definindo acls para o script de Manutencao
###
acl sites_liberados_restrito url_regex "/etc/squid/conf/sites_liberados_Restrito"
acl palavras_liberadas_restrito url_regex "/etc/squid/conf/palavras_liberadas_Restrito"
acl sites_bloqueados_restrito2 dstdom_regex "/etc/squid/conf/sites_bloqueados_Restrito2"
acl sites_liberados_geral url_regex "/etc/squid/conf/sites_liberados_Geral"
acl sites_bloqueados_geral url_regex "/etc/squid/conf/sites_bloqueados_Geral"
###
#Definindo acls dos grupos
###
acl gerencia proxy_auth "/etc/squid/conf/users_Gerencia"
acl restrito proxy_auth "/etc/squid/conf/users_Restrito"
acl restrito2 proxy_auth "/etc/squid/conf/users_Restrito2"
http_access allow MAONET gerencia
http_access allow MAONET sites_liberados_geral
http_access deny MAONET sites_bloqueados_geral
http_access allow MAONET restrito2 !sites_bloqueados_restrito2
http_access allow MAONET restrito sites_liberados_restrito
http_access allow MAONET restrito palavras_liberadas_restrito
*** {01.00.001} Comandos a serem executados para devido funcionamento do script
>/etc/squid/conf/sites_liberados_Restrito
>/etc/squid/conf/palavras_liberadas_Restrito
>/etc/squid/conf/sites_bloqueados_Restrito2
>/etc/squid/conf/sites_liberados_Geral
>/etc/squid/conf/sites_bloqueados_Geral
>/etc/squid/conf/users_Gerencia
>/etc/squid/conf/users_Restrito
>/etc/squid/conf/users_Restrito2
chmod 777 /etc/squid/conf/sites_*
chmod 777 /etc/squid/conf/users_*
chmod 777 /etc/squid/conf/palavras_liberadas_Restrito
htpasswd -bc /etc/squid/conf/pass.geral infonet teste
mkdir /var/log/manutencao
>/var/log/manutencao/manutencao.log
chmod -R 777 /var/log/manutencao
mkdir /etc/squid/bkp/
chmod 777 /etc/squid/bkp/
groupadd webmaster
useradd manutencao -g webmaster
passwd manutencao SENHA_DO_USUARIO_MANUTENCAO
Obs.: Caso o IP que esteja aparecendo esteja errado no menu 9, será necessário alterar no script a linha abaixo, informando a interface de conexão correta:
internet=ppp0
*** Descrição dos Grupos: ***
Gerencia: tem acesso a irrestrito
Restrito: tem acesso somente aos sites cadastrados como liberados
Restrito2: tem acesso a todos os sites, exceto os cadastrados como bloqueados
#!/bin/bash #Srcipt para manutencao de usuarios/grupos e controle de acesso SQUID #Autor: Jonathan Lessa -InfoNet - Solucoes Internet #Data: 17/05/2010 #Definicao de variaveis arqusuarios="/etc/squid/conf/pass.geral" dirusuarios="/etc/squid/conf/" dirbackupusuarios="/etc/squid/bkp/" logfile=/var/log/manutencao/manutencao.log internet=ppp0 opcao= grupos[0]="Gerencia" grupos[1]="Restrito" grupos[2]="Restrito2" #grupos[3]="MsnBloqueado" function listarGrupos() { i=0; for grupo in ${grupos[@]} do ((++i)); echo "$i) - $grupo"; done } while true do clear echo " InfoNet - Solucoes Internet Script para manutencao de usuarios e controle de acesso SQUID Selecione a opcao desejada: 1 - Cadastrar usuario 2 - Alterar usuario 3 - Excluir usuario 4 - Listar usuarios 5 - Bloquear site 6 - Liberar/Desloquear site 7 - Listar sites Liberados/Bloqueados 8 - Manutencao do SQUID 9 - Status do sistema 0 - Sair" tput cup 18 0; tput el; read -p "Opcao: " opcao; # [[ $opcao == 0 ]] && break; i=0 existe= clear; case "$opcao" in 1 ) echo "Cadastro e Usuario"; echo "=================="; echo ""; read -p "Digite o nome do usuario: " usuario1; usuario=$(eval echo $usuario1 | tr [[:upper:]] [[:lower:]]) #existe=$( grep ^$usuario':' "$arqusuarios"); grep ^$usuario':' "$arqusuarios"; (( $? != 0)) && { read -p "Digite a senha do usuario: " senha; echo ""; echo "=================================="; echo "Selecione o gupo no qual deseja cadastrar o usuario:"; echo "=================================="; echo "$(listarGrupos)"; echo "0) - Cancelar cadastro" read -p "Grupo: " opgrupo; echo ""; case $opgrupo in [1-${#grupos[@]}] ) { grupo=${grupos[`eval echo $(( opgrupo - 1 ))`]}; arqgrupo=$dirusuarios"users_"$grupo; eval htpasswd -b "$arqusuarios" "$usuario" "$senha" 1>/dev/null 2>/dev/null; echo $usuario >> $arqgrupo; echo $(date +%d%m%Y)" = cadastrado usuario: $usuario senha: $senha grupo: $grupo" >> $logfile; echo Usuario "$usuario" cadastrado com sucesso!; service squid reload 1>/dev/null 2>/dev/null; }; ;; 0 ) echo "Cadastro Cancelado!"; ;; * ) echo "Grupo invalido"; ;; esac; } || { echo ""; echo "Usuario ja existe"; }; echo ""; read -p "Pressione Enter para voltar para o menu principal" OK; ;; 2 ) echo "Alteracao de Usuario"; echo "===================="; echo ""; read -p "informe o login do usuario: " usuario; grep '^'$usuario':' $arqusuarios 1>/dev/null 2>/dev/null; (( $? != 0 )) && { echo ""; echo "Usuario nao encontrado!"; } || { clear; echo Usuario $usuario encontrado. As alteracoes abaixo serao aplicadas a este usuario! echo "===================="; (( $? == 0 )) && { echo "Selecione uma das opcoes a seguir:"; echo "==================================" echo ""; echo "1) Inserir usuario em grupo"; echo "2) Alterar usuario de grupo"; echo "3) Excluir usuario de grupo"; echo "4) Alterar senha de usuario"; echo "0) Voltar ao Menu Principal"; echo ""; read -p "Opcao: " opusuario; case $opusuario in 1 ) clear; echo "A qual Grupo deseja adicionar o usuario ($usuario)?"; echo "$(listarGrupos)"; echo "0) - Cancelar operacao" read -p "Grupo: " opgrupo; echo ""; echo ""; case $opgrupo in [1-${#grupos[@]}] ) { grupo=${grupos[`eval echo $(( opgrupo - 1 ))`]}; arqgrupo=$dirusuarios"users_"$grupo; echo ""; grep '^'$usuario'$' $arqgrupo; (( $? == 0 )) && { echo "Este usuario ja esta neste grupo!"; } || { echo $usuario >> $arqgrupo; echo "$(date +%d%m%Y) = Usuario $usuario cadastrado no grupo: $grupo" >> $logfile; echo "Usuario $usuario cadastrado no grupo $grupo"; }; }; service squid reload 1>/dev/null 2>/dev/null; ;; 0 ) echo "Operacao cancelada!"; ;; * ) echo "Opcao Invalida!"; ;; esac; ;; 2 ) clear; echo "Migrando o usuario ($usuario) de Grupo:"; echo "============================"; echo "$(listarGrupos)"; echo "0) - Cancelar Operacao"; read -p "Grupo Atual: " opgrupoorigem; case $opgrupoorigem in [1-${#grupos[@]}] ) { grupoo=${grupos[`eval echo $(( opgrupoorigem - 1 ))`]}; arqgrupoo=$dirusuarios"users_"$grupoo; grep '^'$usuario'$' $arqgrupoo; echo ""; (( $? != 0 )) && { echo "Este usuario nao esta no grupo informado"; } || { read -p "Novo Grupo : " opgrupodestino; case $opgrupodestino in [1-${#grupos[@]}] ) { grupod=${grupos[`eval echo $(( opgrupodestino - 1 ))`]}; arqgrupod=$dirusuarios"users_"$grupod; grep '^'$usuario'$' $arqgrupod 1>/dev/null 2>/dev/null; (( $? == 0 )) && { echo ""; echo "Este usuario ja esta no Novo Grupo"; } || { eval sed -i.bkp$(date +%d-%m-%Y) /^$usuario$/d $arqgrupoo; echo $usuario >> $arqgrupod; echo $(date +%d%m%Y) " usuario $usuario movido do grupo $grupoo para o grupo $grupod" >> $logfile; echo ""; echo ""; echo "Usuario $usuario movido do grupo $grupoo para o grupo $grupod"; }; }; service squid reload 1>/dev/null 2>/dev/null; ;; 0 ) echo "Operacao Cancelada!"; ;; * ) echo "Opcao Invalida"; ;; esac; }; }; ;; 0 ) echo "Operacao Cancelada!"; ;; * ) echo "Opcao Invalida"; ;; esac; ;; 3 ) clear; clear; echo "Excluindo o usuario ($usuario) de Grupo:"; echo "================================"; echo "$(listarGrupos)"; echo "0) - Cancelar Operacao" read -p "Grupo: " opgrupo; case $opgrupo in [1-${#grupos[@]}] ) { grupo=${grupos[`eval echo $(( opgrupo - 1 ))`]}; arqgrupo=$dirusuarios"users_"$grupo; grep '^'$usuario'$' $arqgrupo 1>/dev/null 2>/dev/null; (( $? == 0 )) && { sed -i.bkp$(date +%d-%m-%Y) /^$usuario$/d $arqgrupo; echo $(date +%d%m%Y) " usuario $usuario removido do grupo $grupo" >> $logfile; echo ""; echo ""; echo "Usuario $usuario removido do grupo $grupo"; service squid reload 1>/dev/null 2>/dev/null; } || { echo""; echo "Usuario nao encontrado neste Grupo!"; }; }; ;; 0 ) echo "Operacao Cancelada!" ;; * ) echo "Opcao invalida!"; ;; esac; ;; 4 ) clear; echo "ALteracao de Senha"; echo "=================="; echo ""; echo "Usuario: $usuario"; read -p "Digite a nova senha: " senha; htpasswd -b $arqusuarios $usuario $senha 1>/dev/null 2>/dev/null; echo "$(date) => Senha do usuario $usuario alterada para $senha" >> $logfile; echo "Senha Alterada!"; service squid reload 1>/dev/null 2>/dev/null; ;; 0 ) ;; * ) echo "Opcao Invalida"; ;; esac; mv -f $dirusuarios*.bkp* $dirbackupusuarios 1>/dev/nulll 2>/dev/null; }; }; echo ""; read -p "Pressione Enter para voltar para o menu principal" OK; ;; 3 ) echo "Exclusao de Usuario"; echo "=================="; echo ""; read -p "Digite o nome do usuario que deseja excluir: " usuario; grep '^'$usuario':' $arqusuarios 1>/dev/null 2>/dev/null; (( $? != 0 )) && { echo "Usuario nao encontrado!"; } || { read -p "Tem certeza que deseja excluir $usuario do acesso a internet? (S/n): " resp; case $resp in [sS] ) eval htpasswd -D $arqusuarios $usuario; for arqgrupos in $(grep -r "^$usuario$" $dirusuarios | cut -d: -f1) do eval sed -i.bkp$(date +%d-%m-%Y) /^$usuario$/d $arqgrupos 1>/dev/null 2>/dev/null; mv -f $dirusuarios"*.bkp*" $dirbackupusuarios 1>/dev/null 2>/dev/null; done; echo "" && echo "Usuario removido"; service squid reload 1>/dev/null 2>/dev/null; ;; [nN] ) echo "" && echo Exclusao Cancelada; ;; * ) echo "Opcao Invalida. Operacao cancelada." ;; esac; } echo ""; read -p "Pressione Enter para voltar para o menu principal" OK; ;; 4 ) clear; echo "Selecione o grupo para listar os usuarios" echo "$(listarGrupos)"; echo "0) - Todos"; # while true # do read -p "Opcao: " opgrupo; case "$opgrupo" in [0-${#grupos[@]}] ) { [ $opgrupo = 0 ] && { clear echo "===================="; echo "Listagem de Usuarios"; echo "===================="; echo ""; contgrupo=0; for grupo in ${grupos[@]} do eval echo "Usuarios do grupo" ${grupos[$contgrupo]}; echo "-------------------------------"; eval cat -n "/etc/squid/conf/users_"${grupos[$contgrupo]}; echo ""; echo "-------------------------------"; (( ++contgrupo )); (( $contgrupo == ${#grupos[@]} )) || { tput sc ; echo "Pressione Enter para listar o proximo Grupo" ; read ok ; tput rc; tput el; }; done; } || { clear; echo "===================="; echo "Listagem de Usuarios"; echo "===================="; echo ""; echo "Usuarios do grupo" ${grupos[`eval echo $(( opgrupo -1 ))`]}; echo "--------------------------------"; cat -n $dirusuarios"users_"${grupos[`eval echo $(( opgrupo -1 ))`]}; echo ""; echo "--------------------------------"; }; };; * ) echo "Opcao invalida!" ;; esac; echo ""; read -p "Pressione enter para voltar ao menu principal..."; ;; 5 ) clear; echo "Bloqueio de Site"; echo "================" && echo ""; echo "digite a URL a ser bloqueada (OBS.: Nao digite o 'www.' Ex.: playboy.com.br ou batepapo.uol.com.br)" && echo ""; read -p "Site: " opsite; [[ -z $opsite ]] || { echo "Selecione o grupo para efetuar o bloqueio do site" echo "$(listarGrupos)"; echo "0) - Todos" && echo ""; read -p "Opcao: " opgrupo && echo ""; case "$opgrupo" in [1-${#grupos[@]}] ) { echo $opsite >> $dirusuarios"sites_bloqueados_""${grupos[`eval echo $(( opgrupo -1 ))`]}"; echo "$(date +%d%m%Y) => a URL $opsite foi bloqueada para o grupo ${grupos[`eval echo $(( opgrupo -1 ))`]}" >> $logfile; echo "Site bloqueado para o grupo "${grupos[`eval echo $(( opgrupo -1 ))`]}; service squid reload 1>/dev/null 2>/dev/null; }; ;; 0 ) echo $opsite >> $dirusuarios"sites_bloqueados_Geral"; echo "Site $opsite inserido na lista de bloqueio geral!"; echo "$(date +%d%m%Y) => a URL $opsite foi bloqueada para todos os grupos" >> $logfile; service squid reload 1>/dev/null 2>/dev/null; ;; * ) echo "Opcao Invalida!"; ;; esac; }; echo "" && read -p "Pressione enter para voltar ao menu principal..."; ;; 6 ) clear; echo "Liberar/Desbloquear Site"; echo "========================" && echo ""; echo "digite a URL a ser liberada/desbloqueada (OBS.: Nao digite o 'www.' Ex.: playboy.com.br ou batepapo.uol.com.br)" && echo ""; read -p "Site: " opsite; [[ -z $opsite ]] || { echo "$(listarGrupos)"; echo "0) - Todos" && echo ""; echo "Selecione o grupo para efetuar o desbloqueio/liberacao do site"; read -p "Grupo: " opgrupo && echo ""; case "$opgrupo" in [1-${#grupos[@]}] ) { grupo=${grupos[`eval echo $(( opgrupo -1 ))`]}; arqgrupo=$dirusuarios"sites_bloqueados_"$grupo; eval sed -i.bkp$(date +%d-%m-%Y) /^$opsite$/d $arqgrupo; echo "$(date +%d%m%Y) => a URL $opsite foi desbloqueada para o grupo $grupo" >> $logfile; echo $opsite >> $dirusuarios"sites_liberados_"$grupo; echo "Site liberado para o grupo $grupo"; service squid reload 1>/dev/null 2>/dev/null; } ;; 0 ) { eval sed -i.bkp$(date +%d%m%Y) /^$opsite$/d $dirusuarios"sites_bloqueados_Geral"; echo "$(date +%d%m%Y) => a URL $opsite foi desbloqueada para todos os gruposo" >> $logfile; echo $opsite >> $dirusuarios"sites_liberados_Geral"; echo "Site liberado para todos!"; echo "$(date +%d%m%Y) => a URL $opsite foi liberada para todos os gruposo" >> $logfile; service squid reload 1>/dev/null 2>/dev/null; } ;; * ) echo "Opcao Invalida!"; ;; esac; mv -f $dirusuarios"*.bkp*" $arqbackupusuarios 1>/dev/null 2>/dev/null; }; echo "" && read -p "Pressione Enter para voltar ao Menu Principal.."; ;; 7 ) clear; echo "Listagem de sites"; echo "================="; echo "Deseja listar os sites (L)iberados ou (B)loqueados?"; read -p "Opcao: " oplistar; echo ""; listar=""; case $oplistar in [Ll] ) listar=liberados; ;; [Bb] ) listar=bloqueados; ;; * ) echo "Opcao Invalida"; esac; [[ ! -z $listar ]] && { echo "Selecione o grupo para listar os sites $listar"; echo "$(listarGrupos)"; echo "0) - Todos"; read -p "Opcao: " opgrupo; case "$opgrupo" in [1-${#grupos[@]}] ) { grupo=${grupos[`eval echo $(( opgrupo -1 ))`]}; arqgrupo=$dirusuarios"sites_"$listar"_"$grupo; echo ">>> Sites $listar para o grupo: $grupo"; echo "=============================="; more $arqgrupo; echo "==============================" && echo ""; } ;; 0 ) { echo ">>> Sites $listar Geral"; echo "=============================="; more $dirusuarios"sites_"$listar"_Geral"; echo "==============================" && echo ""; } ;; * ) echo "Opcao Invalida!!!"; ;; esac; }; echo "" && read -p "Pressione enter para voltar ao menu principal..."; ;; 8 ) clear echo "Manutencao do SQUID" echo echo "Selecione a opcao desejada:" echo # echo "1 - Gerar relatorio de acesso agora" echo "1 - Limpar o cache" echo "2 - Reiniciar o SQUID" echo "3 - Parar o iptables" echo "4 - Iniciar ou reiniciar o iptables" echo "0 - Voltar ao menu principal" read -p "Opcao: " op8; case $op8 in # 1 ) echo "Gerando relatorio... Aguarde!" # data=`date -d yesterday "+%d/%m/%Y"`-`date "+%d/%m/%Y"` # /usr/bin/sarg -i -f /etc/sarg/sarg-daily.conf -d $data # echo "Operacao concluida" && sleep 2 # ;; 1 ) echo "Aguarde... limpando o cache do SQUID"; service squid stop; rm -fr /var/spool/squid/*; service squid start ; echo "Cache excluido com sucesso!"; ;; 2 ) echo "Aguarde... Reiniciando o SQUID" service squid restart; echo "SQUID reiniciado com sucesso"; ;; 3 ) echo "Parando o iptables..." service iptables stop 1>/dev/null 2>/dev/null && echo""; echo "O iptables foi desligado"; ;; 4 ) echo "Reiniciando o iptables" /etc/rc.d/firewall.sh 1>/dev/null 2>/dev/null && echo""; echo "O iptables foi inicializado"; ;; 0 ) echo "Cancelando Operacao..." ;; * ) echo "Opcao Invalida"; ;; esac; echo "" && read -p "Pressione Enter para voltar ao Menu Principal"; ;; 9 ) conexao=inativa squid=parado clear echo "Obtendo Informacoes do sistema... Aguarde!" #ifconfig | grep ppp0; ping -c 2 200.241.52.1 | grep "100% packet loss" 1>/dev/null 2>/dev/null; (( $? != 0)) && { conexao=ativa; ip=$(ifconfig $internet | grep inet | awk '{print $2}' | awk -F : '{print $2}'); } || { echo "Aguarde! conectando..." && /etc/rc.d/velox_test.pl; #ifconfig | grep ppp0; ping -c 2 200.241.52.1 | grep "100% packet loss" 1>/dev/null 2>/dev/null; (( $? != 0)) && { conexao=ativa; ip=$(ifconfig $internet | grep inet | awk '{print $2}' | awk -F : '{print $2}'); echo "Conexao estabelecida"; echo "IP da conexao: $ip"; }; }; echo "" && echo "Data do sistema: $(date +%A,\ %d\ de\ %B\ de\ %Y\ Hora:\ %H:%M)"; echo "" && echo "Status da conexao: $conexao"; [[ $conexao == "inativa" ]] && { echo "" && echo "Nao foi possivel se comunicar com o servidor da InfoNet."; echo "" && echo "Entre em contato com o Suporte Tecnico da InfoNet: (79) 2106-8000"; } || { echo "" && echo "Conexao com a internet OK"; echo "IP da conexao: $ip"; }; echo ""; echo "-----------------" echo "Analise do disco:"; echo "-----------------" echo "Tamanho total do HD: $(df -h | sed 's/[ ]\+/:/g' | grep "/"$ | cut -d: -f2)"; echo "Espaco utilizado: $(df -h | sed 's/[ ]\+/:/g' | grep "/"$ | cut -d: -f3) = $(df -h | sed 's/[ ]\+/:/g' | grep "/"$ | cut -d: -f5) em uso"; echo "Espaco disponivel: $(df -h | sed 's/[ ]\+/:/g' | grep "/"$ | cut -d: -f4)" echo infhd=$(echo $(df -h | grep "/"$) | cut -d" " -f5); hd=$(echo $infhd | cut -d" " -f2 | cut -d% -f1); (( $hd >= 95 )) && { echo "" && echo "Atencao! pouco espaco em disco. Limpando o disco... Aguarde!"; service squid stop; cp -a /var/log/squid/access.log /var/log/access.log; rm -f /var/log/squid/*; mv /var/log/access.log /var/log/squid/access.log; rm -rf /var/spool/squid/*; service squid start; echo "" && echo "Limpeza de disco efetuada com sucesso..." }; echo ""; service squid status | grep "morto" 1>/dev/null 2>/dev/null; (( $? != 0 )) && { echo "SQUID esta rodando"; } || { echo "O SQUID esta parado. Iniciando o SQUID... Aguarde!"; killall -9 squid; service squid start; } echo "" && read -p "Pressione enter para voltar ao menu principal"; ;; 10 ) clear echo "Bloqueio de MSN" echo"" echo "1 - Bloquear Usuarios" echo "2 - Desbloquear Usuarios" echo "3 - Listar Usuarios Desbloqeuados" echo "0 - Retornar ao Menu Principal" read -p "Opcao: " opcaomsn && echo ""; case $opcaomsn in 1 ) echo "Digite o login do usuario que deseja bloquear" && echo ""; read -p "Usuario: " usuariomsn; grep '^'$usuariomsn':' $arqusuarios 1>/dev/null 2>/dev/null; (( $? == 0 )) && { echo $usuariomsn >> $dirusuarios"users_bloqueio_MSN"; echo "$(date) => o MSN foi bloqueado para o usuario $usuariomsn">>$logfile; echo ""; echo "============================" echo ""; echo "Usuario $usuariomsn bloqueado para acesso ao MSN"; echo ""; } || echo "Usuario nao encontrado!"; ;; 2 ) echo "Digite o login do usuario que deseja desbloquear" && echo ""; read -p "Usuario: " usuariomsn && echo ""; grep '^'$usuariomsn'$' $dirusuarios"users_bloqueio_MSN" 1>/dev/null 2>/dev/null; (( $? == 0 )) && { sed -i.bkp /^$usuariomsn$/d $dirusuarios"users_bloqueio_MSN"; echo "$(date +%d%m%Y) => o MSN foi desbloqueado para o usuario $usuariomsn">>$logfile; echo ""; echo ""; echo "Usuario $usuariomsn desbloqueado para acesso ao MSN"; } || echo "Usuario não encontrado"; ;; 3 ) echo "Usuarios bloqueados para acesso ao MSN:"; echo "======================================="; echo ""; cat -n $dirusuarios"users_bloqueio_MSN" | more; echo ""; ;; 0 ) echo "Operacao Cancelada"; ;; * ) echo "Opcao Invalida!"; ;; esac; echo ""; read -p "Pressione Enter para voltar ao Menu Principal..."; ;; 0 ) echo "Encerrando o script..." sleep 2; exit; ;; esac; done
Fazer backup de todas base de dados no PostgreSQL
Find em arquivos compactados (grep em arquivos tgz)
SCRIPT PARA AUTOMAÇÃO DE ATUALIZAÇÃO EM AMBIENTE DEBIAN OU DERIVADOS.
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Criando uma VPC na AWS via CLI
Multifuncional HP imprime mas não digitaliza
Dica básica para escrever um Artigo.
Como Exibir Imagens Aleatórias no Neofetch para Personalizar seu Terminal
Função que recebe 20 números inteiros e retorna o 6° maior elemento do... (2)
Melhorando a precisão de valores flutuantes em python[RESOLV... (15)