├── README.md └── serverLogonInfo.sh /README.md: -------------------------------------------------------------------------------- 1 | # serverLogonInfo.sh 2 | 3 | ## 📝 Descrição 4 | Este script foi desenvolvido para exibir informações detalhadas após o logon em servidores Linux. Inicialmente, foi criado para funcionar em sistemas das famílias .deb e .rpm, sendo implementado, neste exemplo específico, em um servidor Ubuntu Server 22.04 com Zabbix instalado para monitoramento. 5 | 6 | ![exemplo](https://github.com/matheusseman/ServerLogonInfo/assets/119596051/c89745ea-2974-4022-84c4-f46ae0aac937) 7 | 8 | ## 💡 Funcionalidades 9 | Na sua versão inicial, o script fornece as seguintes informações após o logon do usuário: 10 | 11 | - Nome do servidor 12 | - Tempo ligado (uptime) 13 | - Distribuição Linux 14 | - Descrição da função do servidor 15 | - Impacto na infraestrutura de rede 16 | - Endereço IP local 17 | - Endereço IP público 18 | - Informações sobre partições 19 | - Estado dos serviços do servidor 20 | 21 | ## 🚩 Dependências 22 | O script depende dos seguintes pacotes: 23 | - `bc` 24 | - `curl` 25 | 26 | Se estas dependências não estiverem instaladas, o script solicitará a permissão para instalá-las automaticamente. 27 | 28 | ## 🔧 Configuração 29 | Para que o script tenha seu funcionamento correto, devem ser respeitados alguns critérios: 30 | - O script deve ser alocado no diretório `/usr/local/bin`. 31 | - Deve receber permissão de execução com `chmod a+x /usr/local/bin/serverLogonInfo.sh`. 32 | - Sua execução deve ser adicionada ao arquivo `.bashrc` de cada usuário para exibir as informações após o login. 33 | 34 | ## ✏️ Personalização 35 | Durante a primeira execução, algumas perguntas serão feitas para personalizar o script conforme o servidor. No entanto, é necessário adicionar manualmente algumas informações, realizando as alterações a seguir: 36 | - Atualize o array `SERVICOS` com os nomes dos serviços cujo estado deseja exibir. 37 | - Atualize o array `PARTICOES` com as partições das quais deseja obter informações. 38 | 39 | ## 💻 Uso 40 | O script oferece algumas opções de argumento para facilitar seu uso: 41 | 42 | ### 📃 Opções de argumento: 43 | - `--help` | `-help` | `help` | `-h`: Fornece uma lista de ajuda; 44 | - `--version` | `-version` | `version` | `-v`: Exibe informações de versionamento e licença do script; 45 | 46 | ### 📑 Exemplos de uso: 47 | - Para exibir a ajuda: 48 | ```bash 49 | ./serverLogonInfo.sh --help 50 | 51 | ## 🚀 Futuras Implementações 52 | Está prevista a adição de informações sobre rotinas de backup Veeam ao script. Essas informações serão apresentadas de outro repositório que será adicionado ao GitHub, incluindo o script responsável por obter as informações das rotinas de backup, as alterações necessárias no script `serverLogonInfo.sh` e a posterior configuração do monitoramento Zabbix para tais informações. 53 | -------------------------------------------------------------------------------- /serverLogonInfo.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ########################################################################################################################## 3 | #------------------------------------------------------------------------------------------------------------------------# 4 | #--------------------------------------------------- INFORMAÇÕES---------------------------------------------------------# 5 | #------------------------------------------------------------------------------------------------------------------------# 6 | # Arquivo ~~~~ serverLogonInfo.sh 7 | # Descrição ~~ Script desenvolvido para exibição de informações importantes do host após o início de sessão. 8 | # Autor ~~~~~~ Matheus Seman < mateusseman@gmail.com> 9 | #------------------------------------------------------------------------------------------------------------------------# 10 | ########################################################################################################################## 11 | #------------------------------------------------------------------------------------------------------------------------# 12 | ########################################################################################################################## 13 | #------------------------------------------------------------------------------------------------------------------------# 14 | #------------------------------------------------------ ARRAYS ----------------------------------------------------------# 15 | # Arrays dinâmicos (Devem ser alterados/adicionados para se adequar a infraestrutura da rede) #--------------------------# 16 | declare -A PARTICOES=( 17 | [raiz]="/" 18 | [boot]="/boot" 19 | ) # Partições para verificação de, adicione mais no formato [descricao]="mountpoint" 20 | 21 | declare -a SERVICOS=( 22 | "zabbix-server" "ssh" "apache2" "mysql" 23 | ) # Serviços para validação no servidor, adicione mais no formato "serviçoA" "serviçoB" (deve se utilizar o nome exato do serviço) 24 | 25 | # Arrays estáticos #-----------------------------------------------------------------------------------------------------# 26 | declare -A CORES=( 27 | [none]="\033[m" 28 | [vermelho]="\033[1;31m" 29 | [verde]="\033[1;32m" 30 | [amarelo]="\033[1;33m" 31 | [azul]="\033[1;34m" 32 | [branco]="\033[1;37m" 33 | ) # Cores para melhor visualizaçao dos dados 34 | 35 | declare -A DEPENDENCIAS=( 36 | [bc]="/usr/bin/bc" 37 | [curl]="/usr/bin/curl" 38 | ) # Dependencias necessárias para execução do script 39 | #------------------------------------------------------------------------------------------------------------------------# 40 | ########################################################################################################################## 41 | #------------------------------------------------------------------------------------------------------------------------# 42 | #---------------------------------------------------- VARIÁVEIS ---------------------------------------------------------# 43 | VERSAO=v1.3 # Versão do script 44 | HOST_NOME=$(hostname) # Armazena o hostname do host 45 | ENDERECO_PUBLICO=$(curl -s ifconfig.me 2>/dev/null) # Endereço público do host 46 | ENDERECO_LOCAL=$(hostname -I | awk '{print $1}') # Endereço local do host 47 | SCRIPT=${0##*/} # Retorna o nome do script 48 | SCRIPT_DIR=/usr/local/bin # Local aonde o script é armazenado 49 | FUNC_SERVIDOR="" # Descrição da função do servidor 50 | IMPAC_SERVIDOR="" # Impacto do servidor na rede 51 | DISTRO_INFO="" # Armazena as informações da distribuição do host 52 | PARTICOES_INFO="" # Armaza informações da raiz do sistema 53 | SERVICOS_INFO="" # Armazena as informações dos serviços 54 | SERVICOS_QNT=0 # Armazena a quantidade dos serviços em execução 55 | #------------------------------------------------------------------------------------------------------------------------# 56 | ########################################################################################################################## 57 | #------------------------------------------------------------------------------------------------------------------------# 58 | #---------------------------------------------------- FUNÇOES -----------------------------------------------------------# 59 | #------------------------------------------------------------------------------------------------------------------------# 60 | function _principal_() { 61 | #--------------------------------------------------------------------------------------------------------------------# 62 | # Verificações de dependências #-------------------------------------------------------------------------------------# 63 | _verifInstalacao_ 64 | 65 | # Levantamento de informações do S.O #-------------------------------------------------------------------------------# 66 | for particao in "${!PARTICOES[@]}" ; do # Percorre o array PARTICOES 67 | _verifParticao_ $(df ${PARTICOES[$particao]} | grep -v Filesystem | awk '{print $1}') 68 | done 69 | 70 | _verifDistro_ 71 | _verifServicos_ 72 | 73 | # Saída principal do script #----------------------------------------------------------------------------------------# 74 | clear ; _divisor_ "-" 75 | echo -e " 76 | ${CORES[vermelho]}\t\t\t ACESSO RESTRITO${CORES[none]} 77 | 78 | Este servidor é exclusivo da empresa XYZ seguindo as diretrizes 79 | \t\t\t de segurança. 80 | 81 | Apenas pessoal autorizado tem acesso, e todas as atividades são 82 | \tregistradas para garantir a conformidade e segurança. 83 | " 84 | _divisor_ "-" 85 | echo -e "\nServidor: $HOST_NOME (${CORES[amarelo]}Ligado há $uptimeServidor${CORES[none]})" 86 | echo -e "Distribuição: $DISTRO_INFO" 87 | echo -e "Função: $FUNC_SERVIDOR" 88 | echo -e "Impacto infraestrutura: $IMPAC_SERVIDOR" 89 | echo -e "Endereço local: $ENDERECO_LOCAL" 90 | echo -e "Endereço público: $ENDERECO_PUBLICO" 91 | echo -e "$PARTICOES_INFO" 92 | echo -e "Estado serviços (${CORES[amarelo]}$SERVICOS_QNT${CORES[none]}): \n$SERVICOS_INFO" 93 | _divisor_ "-" 94 | #--------------------------------------------------------------------------------------------------------------------# 95 | } # Funçao para exibição das informações 96 | 97 | function _versaoScript_() { 98 | #--------------------------------------------------------------------------------------------------------------------# 99 | echo -e "Script desenvolvido para exibição de informações importantes do host após o início de sessão. (GNU Linux) - ${CORES[amarelo]}$SCRIPT $VERSAO${CORES[none]}" 100 | echo "Copyright (C) 2024 Free Software Foundation." 101 | echo "Este software é livre, você é livre para alterá-lo e redistribuí-lo." 102 | echo -e "Escrito e desenvolvido por ${CORES[amarelo]}Matheus Seman${CORES[none]}." 103 | #--------------------------------------------------------------------------------------------------------------------# 104 | } # Funçao para informações sobre a versão do script 105 | 106 | function _ajudaScript_() { 107 | #--------------------------------------------------------------------------------------------------------------------# 108 | echo " 109 | Uso: ./$SCRIPT 110 | GNU "$SCRIPT" foi desenvolvido para exibição de informações importantes após o login do usuário... 111 | 112 | Exemplos: 113 | 114 | Opções de argumento: 115 | 116 | --help | -help | help | -h Fornece uma lista de ajuda; 117 | 118 | --version | -version | version | -v Exibe Informações de versionamento e licença do script; 119 | 120 | Enviar report de bugs para < mateusseman@gmail.com >. 121 | " 122 | #--------------------------------------------------------------------------------------------------------------------# 123 | } # Função para ajuda na execução script 124 | 125 | function _divisor_() { 126 | #--------------------------------------------------------------------------------------------------------------------# 127 | echo -e "${CORES[amarelo]}#${CORES[branco]}----------------------------------------------------------------------${CORES[amarelo]}#${CORES[none]}" 128 | #--------------------------------------------------------------------------------------------------------------------# 129 | } # Função para exibição do separador de texto 130 | 131 | function _verifInstalacao_() { 132 | #--------------------------------------------------------------------------------------------------------------------# 133 | # Validação de dependências #----------------------------------------------------------------------------------------# 134 | local instalacaoValidacao="false" # Variável de controle 135 | for dependencia in "${!DEPENDENCIAS[@]}" ; do # Percorre o array com as dependências do script 136 | if [[ ! -e "${DEPENDENCIAS[$dependencia]}" ]] ; then # Caso a dependencia não esteja instalada 137 | if [[ $instalacaoValidacao = "false" ]] ; then 138 | while true ; do 139 | read -p "Para execução do script, os pacotes bc e curl devem ser adicionados. Deseja prosseguir? [S/N]: " instalacaoForm 140 | case $instalacaoForm in 141 | "não" | "nao" | "Não" | "Nao" | "NÃO" | "NAO" | "n" | "N") 142 | echo -e "${CORES[branco]}[ ${CORES[amarelo]}!${CORES[none]} ${CORES[branco]}]${CORES[none]} ~ Cancelando instalação..." ; sleep 1 ; exit 0 143 | ;; 144 | "sim" | "Sim" | "SIM" | "s" | "S") 145 | instalacaoValidacao="true" 146 | break 147 | ;; 148 | *) 149 | echo -e "[ ${CORES[vermelho]}✖${CORES[none]} ] ~ Opção inválida..." ; sleep 1 150 | ;; 151 | esac 152 | done 153 | fi 154 | 155 | #------------------------------------------------------------------------------------------------------------# 156 | # Instalação da dependência #--------------------------------------------------------------------------------# 157 | if [[ $instalacaoValidacao = "true" ]] ; then 158 | if [ "$(id -u)" != "0" ] ; then # Caso o usuário não seja administrador 159 | echo -e "[ ${CORES[vermelho]}✖${CORES[none]} ] ~ Operação permitida apenas para administradores, abortando..." ; exit 0 160 | else 161 | echo -e "\n${CORES[branco]}[ ${CORES[amarelo]}!${CORES[none]} ${CORES[branco]}]${CORES[none]} ~ Baixando/instalando pacote $dependencia..." ; sleep 1 162 | 163 | # Em distribuições de família Debian #---------------------------------------------------------------# 164 | if [[ -e "/usr/bin/apt" ]] ; then 165 | apt-get install $dependencia -y ; echo # Faz a instalação das dependencias 166 | if [[ $? = 1 ]] ; then 167 | echo -e "[ ${CORES[vermelho]}✖${CORES[none]} ] ~ Falha na instalação dos pacotes, abortando..." ; sleep 1 ; exit 0 168 | fi 169 | 170 | # Em distribuições de família RedHat #---------------------------------------------------------------# 171 | elif [[ -e "/usr/bin/yum" ]] ; then 172 | yum install $dependencia -y ; echo # Faz a instalação das dependencias 173 | if [[ $? = 1 ]] ; then 174 | echo -e "[ ${CORES[vermelho]}✖${CORES[none]} ] ~ Falha na instalação dos pacotes, abortando..." ; sleep 1 ; exit 0 175 | fi 176 | fi 177 | fi 178 | fi 179 | fi 180 | done 181 | 182 | # Ações para primeira execução do script #---------------------------------------------------------------------------# 183 | if [[ $FUNC_SERVIDOR = "" ]] ; then 184 | # Função do servidor #-------------------------------------------------------------------------------------------# 185 | _divisor_ "-" ; echo 186 | 187 | while true ; do 188 | read -p "Descreva de forma sucinta a função do servidor: " funcServidor 189 | if [[ ! -z $funcServidor ]] ; then 190 | instalacaoValidacao="true" 191 | sed -i "s/^FUNC_SERVIDOR=.*/FUNC_SERVIDOR=\"$funcServidor\"/" "$0" 192 | break 193 | 194 | else 195 | echo -e "[ ${CORES[vermelho]}✖${CORES[none]} ] ~ Valor inválido! Informe a função do servidor.\n" ; sleep 1 196 | fi 197 | done 198 | fi 199 | if [[ $IMPAC_SERVIDOR = "" ]] ; then 200 | # Impacto do servidor #------------------------------------------------------------------------------------------# 201 | while true; do 202 | local regexpImpacto='^[AMB]' # Expressão regular para verificar a primeira letra (A, M, B) 203 | read -p "Qual o impacto do mesmo na rede ao qual está instalado? [Alto, Médio, Baixo]: " impacServidor 204 | 205 | local impactServidorForm=$(echo "${impacServidor:0:1}" | tr '[:lower:]' '[:upper:]') # Obtém o primeiro caractere da variável e formata para maiúsculo 206 | if [[ $impactServidorForm =~ $regexpImpacto ]]; then # Verifica se o primeiro caractere corresponde à expressão regular 207 | # Cria um arquivo temporário para a atualização 208 | case $impactServidorForm in 209 | "A") 210 | sed -i "s/^IMPAC_SERVIDOR=.*/IMPAC_SERVIDOR=\"\${CORES[vermelho]}Alto\${CORES[none]}\"/" "$0" ; break 211 | ;; 212 | "M") 213 | sed -i "s/^IMPAC_SERVIDOR=.*/IMPAC_SERVIDOR=\"\${CORES[amarelo]}Médio\${CORES[none]}\"/" "$0" ; break 214 | ;; 215 | "B") 216 | sed -i "s/^IMPAC_SERVIDOR=.*/IMPAC_SERVIDOR=\"\${CORES[azul]}Baixo\${CORES[none]}\"/" "$0" ; break 217 | ;; 218 | esac 219 | instalacaoValidacao="true" 220 | else 221 | echo -e "[ ${CORES[vermelho]}✖${CORES[none]} ] ~ Valor inválido, preencha com Alto, Médio ou Baixo." ; sleep 1 222 | fi 223 | done 224 | fi 225 | 226 | # Finalização da instalação/configuração #---------------------------------------------------------------------------# 227 | if [[ $instalacaoValidacao = "true" ]] ; then 228 | echo ; _divisor_ "-" 229 | 230 | echo -e "\n[ ${CORES[verde]}✓${CORES[none]} ] ~ Instalação finalizada!" 231 | echo -e "[ ${CORES[amarelo]}!${CORES[none]} ] ~ Adicione manualmente a execução do script ao arquivo .bashrc dos usuários." 232 | echo -e " Exemplo: " 233 | echo -e " [ Conteúdo arquivo /home/usuario/.bashrc ]\n" 234 | echo -e " [ ... ] # Conteúdo já existente no arquivo\n" 235 | echo -e " # Script para amostra de informações no login" 236 | echo -e " /usr/loca/bin/serverLogonInfo.sh\n" 237 | exit 0 238 | fi 239 | #--------------------------------------------------------------------------------------------------------------------# 240 | } # Função para instalação personalizada do script 241 | 242 | function _verifDistro_() { 243 | #--------------------------------------------------------------------------------------------------------------------# 244 | # Validação de distribuição #----------------------------------------------------------------------------------------# 245 | if [ -f /etc/os-release ] ; then # Se houver /etc/os-release 246 | source /etc/os-release # Usando /etc/os-release para obter informações 247 | DISTRO_INFO+="$NAME" 248 | DISTRO_INFO+=" $VERSION" 249 | 250 | # Família Redhat #---------------------------------------------------------------------------------------------------# 251 | elif [ -f /etc/redhat-release ] ; then # Se houver /etc/redhat-release (para distribuições Red Hat) 252 | DISTRO_INFO+=$(cat /etc/redhat-release) 253 | 254 | # Família Debian #---------------------------------------------------------------------------------------------------# 255 | elif [ -f /etc/debian_version ] ; then # Se houver /etc/debian_version (para distribuições Debian) 256 | DISTRO_INFO+="Debian" 257 | DISTRO_INFO+=$(cat /etc/debian_version) 258 | 259 | # Desconhecido #-----------------------------------------------------------------------------------------------------# 260 | else 261 | DISTRO_INFO+="Não foi possível identificar a distribuição." 262 | fi 263 | # Variáveis internas de controle #-----------------------------------------------------------------------------------# 264 | uptimeServidor=$(echo $(uptime) | awk '{print $3}' | tr -d ',') # Obtém o tempo de atividade do servidor 265 | uptimeUnid=$(uptime | awk '{print $4}' | tr -d ',') # Obtém a unidade de tempo (min, day, days, etc.) 266 | case $uptimeUnid in # Verifica a unidade de tempo e formata a string uptimeServidor adequadamente 267 | "min") 268 | uptimeServidor+=" minutos" 269 | ;; 270 | "day" | "days") 271 | uptimeServidor+=" dia" 272 | if [[ $uptimeServidor != "1" ]]; then 273 | uptimeServidor+="s" 274 | fi 275 | ;; 276 | *) 277 | uptimeServidor+=" horas" 278 | ;; 279 | esac 280 | #--------------------------------------------------------------------------------------------------------------------# 281 | } # Função para levantamento de informações da distribuição 282 | 283 | function _verifParticao_() { 284 | # Variáveis internas de controle #-----------------------------------------------------------------------------------# 285 | local particao="$1" # Argumento passado na chamada da função _verifParticao_ $1 286 | local pontoMontagem=$(df -h | grep $particao | awk {'print $6'}) # Obtem o ponto de montagem da partição passada como parametro 287 | local particaoTotal=$(df -h "$particao" | awk 'NR==2 {print $2}') # Obtem a quantidade total de espaço da partição 288 | local particaoLivre=$(df -h "$particao" | awk 'NR==2 {print $4}') # Obtem a quantidade livre de espaço da partição 289 | local particaoLivrePorc=$(df -h "$particao" | awk 'NR==2 {print $5}') # Obtem a disponibilidade de espaço em % na partição 290 | local particaoPorcForm=$(df -h "$particao" | awk 'NR==2 {print $5}' | tr -d "%") # Obtem a disponibilidade de espaço em % na partição formata para melhor visualização 291 | local criticidadePorc="${CORES[none]}" # Cor da saída stout 292 | 293 | # Validação de espaço disponível #----------------------------------------------------------------------------------# 294 | if (( $(echo "$particaoPorcForm < 70" | bc -l) )); then # Caso a disponibilidade de espaço na partição em % seja menor que 70% 295 | criticidadePorc="${CORES[verde]}" # Verde 296 | elif (( $(echo "$particaoPorcForm >= 70 && $particaoPorcForm <= 85" | bc -l) )); then # Caso a disponibilidade de espaço na partição em % enteja entre 70% e 85% 297 | criticidadePorc="${CORES[amarelo]}" # Amarelo 298 | else # Caso a disponibilidade de espaço na partição em % seja maior que 85% 299 | criticidadePorc="${CORES[vermelho]}" # Vermelho 300 | fi 301 | 302 | # Envio dos parametros para variável global #-----------------------------------------------------------------------# 303 | PARTICOES_INFO+="\nInformações partição ${CORES[amarelo]}$pontoMontagem${CORES[none]}:\n" 304 | PARTICOES_INFO+=" ⤷ total: $particaoTotal\n" 305 | PARTICOES_INFO+=" ⤷ livre: $particaoLivre\n" 306 | PARTICOES_INFO+=" ⤷ utilizado: $criticidadePorc$particaoLivrePorc${CORES[none]}\n" 307 | } # Função para levantamento de informações das partições 308 | 309 | function _verifServicos_() { 310 | #-------------------------------------------------------------------------------------------------------------------# 311 | for servico in "${SERVICOS[@]}"; do # Listagem do array SERVICOS 312 | ((SERVICOS_QNT++)) 313 | servicoNome=$servico 314 | if [[ $(command -v systemctl) ]] ; then # Se o systemctl estiver disponível (sistema que usa systemd) 315 | servicoStatus=$(systemctl is-active "$servicoNome" &>/dev/null) 316 | if [[ $? = 0 ]] ; then 317 | servicoStatus="${CORES[verde]}Ativo${CORES[none]}" 318 | else 319 | servicoStatus="${CORES[vermelho]}Inativo${CORES[none]}" 320 | fi 321 | elif [[ -e "/etc/init.d/$servicoNome" ]] ; then # Se o init.d estiver presente (sistema que não usa systemd) 322 | servicoStatus=$(/etc/init.d/"$servicoNome" status | grep -q "active") 323 | if [[ $? = 0 ]] ; then 324 | servicoStatus="${CORES[verde]}Ativo${CORES[none]}" 325 | else 326 | servicoStatus="${CORES[vermelho]}Inativo${CORES[none]}" 327 | fi 328 | else 329 | servicoStatus="${CORES[vermelho]}Desconhecido${CORES[none]}" 330 | fi 331 | SERVICOS_INFO+=" ⤷ $servicoNome: $servicoStatus\n" 332 | done 333 | #--------------------------------------------------------------------------------------------------------------------# 334 | } # Função para verificação de status de serviços em execução no servidor 335 | 336 | #------------------------------------------------------------------------------------------------------------------------# 337 | case $1 in 338 | "--version" | "--versao" | "version" | "versao" | "-v") # Opção para versionamento do script 339 | _versaoScript_ 340 | ;; 341 | "--help" | "-help" | "help" | "-h") # Opção para ajuda 342 | _ajudaScript_ 343 | ;; 344 | *) # Opção principal, quando não passado parametros 345 | _principal_ 346 | ;; 347 | esac --------------------------------------------------------------------------------