diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_1/dados.txt b/noturno/lab/Daniel_Esmeraldo/atividade_1/dados.txt new file mode 100644 index 0000000..f548945 --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_1/dados.txt @@ -0,0 +1,20 @@ +Ana Silva, 25, ana.silva@gmail.com +Bruno Costa, trinta e dois, bruno.c@yahoo.com +Carlos Souza, 19, c.souza@outlook.com +Daniela Lima, vinte e sete, dani.lima@gmail.com +Eduardo Rocha, 45, edu.rocha@yahoo.com +Fernanda Alves, quarenta, fe.alves@outlook.com +Gabriel Neves, 21, gabi.neves@gmail.com +Helena Porto, dezoito, h.porto@yahoo.com +Igor Mendes, 34, igor.mendes@outlook.com +Juliana Farias, vinte e nove, ju.farias@gmail.com +Kevin Santos, 22, kevin.santos@yahoo.com +Larissa Gomes, trinta e cinco, lari.gomes@outlook.com +Maurício Vaz, 50, mau.vaz@gmail.com +Natália Reis, quarenta e dois, naty.reis@yahoo.com +Otávio Cruz, 27, otavio.cruz@outlook.com +Patrícia Belo, vinte e quatro, patri.belo@gmail.com +Ricardo Dias, 38, ric.dias@yahoo.com +Sabrina Leite, trinta e um, sabrina.l@outlook.com +Tiago Nunes, 26, tiago.n@gmail.com +Vanessa Meira, dezenove, vanessa.m@yahoo.com diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_1/grep1.txt b/noturno/lab/Daniel_Esmeraldo/atividade_1/grep1.txt new file mode 100644 index 0000000..e162a22 --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_1/grep1.txt @@ -0,0 +1,7 @@ +Ana Silva, 25, ana.silva@gmail.com +Daniela Lima, vinte e sete, dani.lima@gmail.com +Gabriel Neves, 21, gabi.neves@gmail.com +Juliana Farias, vinte e nove, ju.farias@gmail.com +Maurício Vaz, 50, mau.vaz@gmail.com +Patrícia Belo, vinte e quatro, patri.belo@gmail.com +Tiago Nunes, 26, tiago.n@gmail.com diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_1/grep2.txt b/noturno/lab/Daniel_Esmeraldo/atividade_1/grep2.txt new file mode 100644 index 0000000..8675490 --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_1/grep2.txt @@ -0,0 +1,10 @@ +Bruno Costa, trinta e dois, bruno.c@yahoo.com +Daniela Lima, vinte e sete, dani.lima@gmail.com +Fernanda Alves, quarenta, fe.alves@outlook.com +Helena Porto, dezoito, h.porto@yahoo.com +Juliana Farias, vinte e nove, ju.farias@gmail.com +Larissa Gomes, trinta e cinco, lari.gomes@outlook.com +Natália Reis, quarenta e dois, naty.reis@yahoo.com +Patrícia Belo, vinte e quatro, patri.belo@gmail.com +Sabrina Leite, trinta e um, sabrina.l@outlook.com +Vanessa Meira, dezenove, vanessa.m@yahoo.com diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_1/grep3.txt b/noturno/lab/Daniel_Esmeraldo/atividade_1/grep3.txt new file mode 100644 index 0000000..d6b2404 --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_1/grep3.txt @@ -0,0 +1 @@ +19 diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_1/grep4.txt b/noturno/lab/Daniel_Esmeraldo/atividade_1/grep4.txt new file mode 100644 index 0000000..0e16ffb --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_1/grep4.txt @@ -0,0 +1 @@ +Ana Silva, 25, ana.silva@gmail.com diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_1/perguntas_resposta.txt b/noturno/lab/Daniel_Esmeraldo/atividade_1/perguntas_resposta.txt new file mode 100644 index 0000000..54c6d3f --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_1/perguntas_resposta.txt @@ -0,0 +1,8 @@ +- Qual é a diferença entre `grep "padrão"` e `grep -E "padrão"`? + O grep padrão utiliza Expressões Regulares Básicas (BRE), nele símbolos especiais são lidos como texto normal, para utilizá-los é necessário colocar um "\" antes. + O grep -E ativa as Expressões Regulares Estendidas (ERE), nele símbolos especiais são lidos como símbolos espciais diretamente. É a forma recomendada para buscas complexas. +- Como usar regex para encontrar e-mails? + Utilizar a estrutura do email: usuário + @ + provedor + ponto + extensão + Comando: grep "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,} nome_arquivo +- O que `grep -i` faz? + O -i vem de Ignore Case, isso faz com que ele ignore maiúsculas e minúsculas. Então grep -i "Rodrigo" retornaria, por exemplo: rodrigo, RODrigO, RODRIGO. diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_1/script.sh b/noturno/lab/Daniel_Esmeraldo/atividade_1/script.sh new file mode 100644 index 0000000..1aa2f5b --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_1/script.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +cat > dados.txt << EOF +Ana Silva, 25, ana.silva@gmail.com +Bruno Costa, trinta e dois, bruno.c@yahoo.com +Carlos Souza, 19, c.souza@outlook.com +Daniela Lima, vinte e sete, dani.lima@gmail.com +Eduardo Rocha, 45, edu.rocha@yahoo.com +Fernanda Alves, quarenta, fe.alves@outlook.com +Gabriel Neves, 21, gabi.neves@gmail.com +Helena Porto, dezoito, h.porto@yahoo.com +Igor Mendes, 34, igor.mendes@outlook.com +Juliana Farias, vinte e nove, ju.farias@gmail.com +Kevin Santos, 22, kevin.santos@yahoo.com +Larissa Gomes, trinta e cinco, lari.gomes@outlook.com +Maurício Vaz, 50, mau.vaz@gmail.com +Natália Reis, quarenta e dois, naty.reis@yahoo.com +Otávio Cruz, 27, otavio.cruz@outlook.com +Patrícia Belo, vinte e quatro, patri.belo@gmail.com +Ricardo Dias, 38, ric.dias@yahoo.com +Sabrina Leite, trinta e um, sabrina.l@outlook.com +Tiago Nunes, 26, tiago.n@gmail.com +Vanessa Meira, dezenove, vanessa.m@yahoo.com +EOF + +grep "gmail.com" dados.txt > grep1.txt +grep -v "[0-9]" dados.txt > grep2.txt +grep -c "a" dados.txt > grep3.txt +grep "^A" dados.txt > grep4.txt diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_2/config.txt b/noturno/lab/Daniel_Esmeraldo/atividade_2/config.txt new file mode 100644 index 0000000..f38fd8c --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_2/config.txt @@ -0,0 +1,10 @@ +SERVIDOR=localhost +# Configurações do Banco de Dados +BANCO=producao +# Porta de acesso +PORTA=8080 +TIMEOUT=30 +# Modo de debug +DEBUG=false +# Limite de conexões +MAX_CONN=100 diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_2/perguntas_resposta.txt b/noturno/lab/Daniel_Esmeraldo/atividade_2/perguntas_resposta.txt new file mode 100644 index 0000000..54d8cf2 --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_2/perguntas_resposta.txt @@ -0,0 +1,7 @@ +- Por que usar `sed` em vez de editar o arquivo manualmente? + O sed permite automação, imagina ter que alterar o IP de 1000 servidores diferente manualmente, demoraria muito tempo. O sed permite automatizar isso. +- Qual é a diferença entre `sed 's/old/new/'` e `sed 's/old/new/g'`? + Sem o g, o sed altera apenas a primeira ocorrência da palavra em cada linha. + Com o g (global), o sed altera todas as ocorrências da palavra em cada linha. +- Como usar `sed` para fazer backup antes de modificar? + Usar o sed -i.bak 's/old/new/' nome_arquivo, esse comando altera o arquivo original e cria um backup do mesmo: nome_arquivo.bak diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_2/script.sh b/noturno/lab/Daniel_Esmeraldo/atividade_2/script.sh new file mode 100644 index 0000000..336eb97 --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_2/script.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +cat > config.txt << EOF +SERVIDOR=localhost +# Configurações do Banco de Dados +BANCO=producao +# Porta de acesso +PORTA=8080 +TIMEOUT=30 +# Modo de debug +DEBUG=false +# Limite de conexões +MAX_CONN=100 +EOF + +sed 's/localhost/192.168.1.1/' config.txt +sed '/^#/d' config.txt +sed -n '5,10p' config.txt +sed 's/^/SISTEMA_/' config.txt diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_3/perguntas_resposta.txt b/noturno/lab/Daniel_Esmeraldo/atividade_3/perguntas_resposta.txt new file mode 100644 index 0000000..dc9318f --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_3/perguntas_resposta.txt @@ -0,0 +1,9 @@ +- Por que usar `awk` em vez de `cut` ou `grep`? + O grep é bom em achar linhas inteiras, mas não lida bem com colunas. + O cut é bom pra separar colunas simples, mas é limitidado. Não consegue usar a lógica. + Já o awk é uma ferramenta de análise de dados completa. Ele lida muito bem com colunas, sabe fazer operações e usar a lógica. Além de formatar o texto de saída de uma forma mais bonita. +- Como usar `awk` para processar arquivos CSV? + É só utilizar o parâmetro -F (Field Separator) com uma "," ou ";" ou "|". +- Qual é a diferença entre `awk` e `sed`? + O sed (Stream Editor) é focado em edição e transformação. É ótimo para substituir palavras, deletar linhas ou inserir texto em posições específicas. + O awk é focado em extração e processamento de dados. É o melhor para gerar relatórios, somar valores e trabalhar com tabelas e colunas. diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_3/script.sh b/noturno/lab/Daniel_Esmeraldo/atividade_3/script.sh new file mode 100644 index 0000000..555b2a7 --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_3/script.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +cat > vendas.txt << EOF +produto:preco:quantidade +Roteador Cisco:1245:5 +Switch Gerenciável:857:10 +Cabo de Rede Cat6:453:2 +Servidor Dell:15321:1 +Firewall Fortigate:4512:2 +Conector RJ45:87:15 +Access Point:984:8 +Patch Panel:322:4 +Rack de Parede:559:3 +Nobreak 1500VA:1124:5 +Placa de Rede Gigabit:123:20 +Fibra Óptica:1847:1 +Transceiver SFP+:256:12 +Testador de Cabos:193:6 +Alicate de Crimpagem:78:10 +Organizador de Cabos:49:25 +Teclado Mecânico:352:7 +Monitor 24 Polegadas:899:12 +HD Externo 2TB:427:9 +Câmera IP:381:14 +EOF + +awk -F: 'NR>1 && $2 > 100 { print $1 "|" $2 "|" $3}' vendas.txt +awk -F: 'NR>1 { print "Total:", $2 * $3 }' vendas.txt +awk -F: 'NR>1 { total_geral += $2 * $3 } END { print "Total Geral:", total_geral }' vendas.txt +awk -F: 'NR>1 { contador ++ } END { print "Produtos:", contador }' vendas.txt diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_3/vendas.txt b/noturno/lab/Daniel_Esmeraldo/atividade_3/vendas.txt new file mode 100644 index 0000000..4d5cdc0 --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_3/vendas.txt @@ -0,0 +1,21 @@ +produto:preco:quantidade +Roteador Cisco:1245:5 +Switch Gerenciável:857:10 +Cabo de Rede Cat6:453:2 +Servidor Dell:15321:1 +Firewall Fortigate:4512:2 +Conector RJ45:87:15 +Access Point:984:8 +Patch Panel:322:4 +Rack de Parede:559:3 +Nobreak 1500VA:1124:5 +Placa de Rede Gigabit:123:20 +Fibra Óptica:1847:1 +Transceiver SFP+:256:12 +Testador de Cabos:193:6 +Alicate de Crimpagem:78:10 +Organizador de Cabos:49:25 +Teclado Mecânico:352:7 +Monitor 24 Polegadas:899:12 +HD Externo 2TB:427:9 +Câmera IP:381:14 diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_4/log.txt b/noturno/lab/Daniel_Esmeraldo/atividade_4/log.txt new file mode 100644 index 0000000..46f73da --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_4/log.txt @@ -0,0 +1,20 @@ +2025-01-15 08:23:45 [INFO] Usuário admin fez login +2025-01-15 08:45:12 [ERROR] Falha de conexão com banco de dados +2025-01-15 09:02:30 [ERROR] Timeout na requisição API +2025-01-15 09:15:22 [INFO] Backup concluído +2025-01-15 09:30:17 [WARN] Uso de CPU acima de 80% +2025-01-15 09:45:08 [ERROR] Falha de conexão com banco de dados +2025-01-15 10:00:01 [INFO] Usuário jose fez logout +2025-01-15 10:22:44 [ERROR] Arquivo não encontrado: config.xml +2025-01-15 10:45:33 [WARN] Pouco espaço em disco (15% livre) +2025-01-15 11:05:19 [ERROR] Timeout na requisição API +2025-01-15 11:30:02 [INFO] Relatório gerado com sucesso +2025-01-15 11:55:48 [ERROR] Falha de conexão com banco de dados +2025-01-15 12:20:15 [INFO] Usuário admin fez logout +2025-01-15 12:45:33 [ERROR] Permission denied: /var/log/syslog +2025-01-15 13:10:22 [WARN] Conexão lenta detectada +2025-01-15 13:35:07 [ERROR] Timeout na requisição API +2025-01-15 14:00:44 [INFO] Sincronização completa +2025-01-15 14:25:16 [ERROR] Falha de conexão com banco de dados +2025-01-15 14:50:39 [CRITICAL] Serviço web caiu +2025-01-15 15:15:03 [INFO] Serviço web reiniciado diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_4/perguntas_resposta.txt b/noturno/lab/Daniel_Esmeraldo/atividade_4/perguntas_resposta.txt new file mode 100644 index 0000000..d370c2c --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_4/perguntas_resposta.txt @@ -0,0 +1,10 @@ +- Como o kernel gerencia o buffer entre pipes? + Imagine o "|" como um cano fisico ligando os programas. O kernel do linux criar um buffer (uma área de memória temporária) para esse cano. + Quando o primeiro comando produz dados, o kernel os armazena nesse buffer até que o segundo programa esteja pronto para ler. + Se o buffer ficar cheio, o kernel coloca o primeiro comando em "pausa" até que o segundo programa consuma dados e abra um pouco de espaço. +- Por que `sort|uniq` é mais eficiente que `uniq`? + Porque quando usamos o uniq sozinho, ele não consegue contar os mesmo erros. Para isso acontecer eles tem que ficar linhas próximas. Usando ele sozinho teremos: 1 Erro A, 1 Erro B, 1 Erro A + Quando usamos o sort | uniq, o sort junta esses erroas em linhas próximas. Usando dessa forma teremos: 2 Erro A, 1 Erro B +- Como redirecionar stderr e stdout para arquivos diferentes? + Para stderr: comando 2> erros.txt + Para stdout: comando > sucessos.txt (1 implícito) diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_4/relatorio_erros.txt b/noturno/lab/Daniel_Esmeraldo/atividade_4/relatorio_erros.txt new file mode 100644 index 0000000..7336685 --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_4/relatorio_erros.txt @@ -0,0 +1,4 @@ + 4 Falha de conexão com banco de dados + 3 Timeout na requisição API + 1 Permission denied: /var/log/syslog + 1 Arquivo não encontrado: config.xml diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_4/script.sh b/noturno/lab/Daniel_Esmeraldo/atividade_4/script.sh new file mode 100644 index 0000000..eaace28 --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_4/script.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +cat > log.txt << EOF +2025-01-15 08:23:45 [INFO] Usuário admin fez login +2025-01-15 08:45:12 [ERROR] Falha de conexão com banco de dados +2025-01-15 09:02:30 [ERROR] Timeout na requisição API +2025-01-15 09:15:22 [INFO] Backup concluído +2025-01-15 09:30:17 [WARN] Uso de CPU acima de 80% +2025-01-15 09:45:08 [ERROR] Falha de conexão com banco de dados +2025-01-15 10:00:01 [INFO] Usuário jose fez logout +2025-01-15 10:22:44 [ERROR] Arquivo não encontrado: config.xml +2025-01-15 10:45:33 [WARN] Pouco espaço em disco (15% livre) +2025-01-15 11:05:19 [ERROR] Timeout na requisição API +2025-01-15 11:30:02 [INFO] Relatório gerado com sucesso +2025-01-15 11:55:48 [ERROR] Falha de conexão com banco de dados +2025-01-15 12:20:15 [INFO] Usuário admin fez logout +2025-01-15 12:45:33 [ERROR] Permission denied: /var/log/syslog +2025-01-15 13:10:22 [WARN] Conexão lenta detectada +2025-01-15 13:35:07 [ERROR] Timeout na requisição API +2025-01-15 14:00:44 [INFO] Sincronização completa +2025-01-15 14:25:16 [ERROR] Falha de conexão com banco de dados +2025-01-15 14:50:39 [CRITICAL] Serviço web caiu +2025-01-15 15:15:03 [INFO] Serviço web reiniciado +EOF + +grep "ERROR" log.txt +grep "ERROR" log.txt | cut -d' ' -f4- | sort | uniq -c +grep "ERROR" log.txt | cut -d' ' -f4- | sort | uniq -c | sort -rn | head -5 > relatorio_erros.txt diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_5/config.sh b/noturno/lab/Daniel_Esmeraldo/atividade_5/config.sh new file mode 100644 index 0000000..24c6329 --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_5/config.sh @@ -0,0 +1,31 @@ +#!/bin/bash +# Script de configuração do sistema +# Autor: Atividade V - Estudos Linux + +# Configureções de rede +SERVIDOR="localhost" +PORTA="8080" +PROTOCOLO="http" + +# Configurações de banco de dados +DB_HOST="localhost" +DB_USER="admin" +DB_PASS="senha123" +DB_NAME="meubanco" + +# Configurações de logging +LOG_DIR="/var/log/myapp" +LOG_LEVEL="INFO" +MAX_LOG_SIZE="10MB" + +# Configurações de timeout +CONNECTION_TIMEOUT=30 +READ_TIMEOUT=60 +WRITE_TIMEOUT=30 + +# Configurações de cache +CACHE_ENABLED="true" +CACHE_TTL=3600 +CACHE_SIZE="256MB" + +echo "Configurações carregadas com sucesso!" diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_5/editor_exercicios.md b/noturno/lab/Daniel_Esmeraldo/atividade_5/editor_exercicios.md new file mode 100644 index 0000000..5939437 --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_5/editor_exercicios.md @@ -0,0 +1,9 @@ + # Diferenças entre nano e vim + nano: Apenas um modo, baixa curva de aprendizado, atalhos mostrados na tela, boa para edições simples, personalização limitada, mais leve. + vim: Multiplos modos, alta curva de aprendizado, maior produtividade quando dominada, personalização altamente configurável, mais pesado, porém mais poderoso. + # Quando usar cada um + nano: Edição rápida, primeiro contato com o terminal, está sem internet e não lembra comandos (atalhos visíveis) + vim: Prgramar/ desenvolver código, edição complexa (muito arquivos seguidos), fazer substituições complexas em texto. + # Atalhos mais úteis + nano: Ctrl + 0 salva; Ctrl + X sai; Ctrl + W busca; Ctrl + K corta linha inteira; Alt + A inicia seleção de texto; Alt + 6 copia texto selecionado; Ctrl + G Ajuda (Help). + vim: :w salva; :q sai; :wq salva e sai; /busca busca; dd deleta linha; u desfaz (undo); Ctrl + r refaz (redo); diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_5/perguntas_resposta.txt b/noturno/lab/Daniel_Esmeraldo/atividade_5/perguntas_resposta.txt new file mode 100644 index 0000000..865f3cb --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_5/perguntas_resposta.txt @@ -0,0 +1,10 @@ +- Qual editor é melhor para editar configs do sistema? + Depende da situação, se for uma edição muito rápida, usa o nano. + Agora se for uma edição complexa, que demora, usa o vim. +- Como usar vim em modo não-interativo (via `sed`)? + Basta utiliza o sed -i 's/old/new/' nome_arquivo para alterar o arquivo original. +- Por que `visudo` é importante? + É uma das ferramentas de segurança mais críticas do Linux. + Se você cometer um erro de digitação no arquivo de permissões usando um editor comum e salva, você pode perder o acesso ao root. O visudo verifica se há um erro de digitação antes de salva. + Ele também impede que duas pessoas editem as permissões ao mesmo tempo, evitando que uma sobrescreva a alteração da outra. + O visudo também garante que o arquivo mantenha as permissões de leiturea corretas, impedindo que usuários comuns vejam regras e privilégios. diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_6/perguntas_resposta.txt b/noturno/lab/Daniel_Esmeraldo/atividade_6/perguntas_resposta.txt new file mode 100644 index 0000000..ad3f5be --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_6/perguntas_resposta.txt @@ -0,0 +1,23 @@ +- Qual é a diferença entre permissões de arquivo e permissões de diretório? + Os símbolos são iguais, mas o significado muda. + Permissões de Arquivo: + r: Permite ler o conteúdo do arquivo. + w: Permite alterar o conteúdo do arquivo. + x: Permite executar o conteúdo do arquivo. + Permissões de diretório: + r: Permite listar os arquivos do diretório. + w: Permite adicionar ou remover arquivos no diretório. + x: Permite acessar o diretório. +- O que é setuid, setgid e sticky bit? + São permissões especiais para casos específicos: + setuid (4): Quando aplicado a um arquivo executável, ele executa com as permissões do dono do arquivo. + setgid (2): Em arquivos, roda com permissões do grupo dono. Em diretórios, fazem com que os novos arquivos criados alí herdem o grupo da pasta pai. + sticky bit (1): Usado em pastas públicas (como /tmp). Garante que apenas o dono do arquivo possa deletá-lo, mesmo que outros usuários tenham acesso de escrita. +- Como o umask afeta as permissões padrão? + O umask (user mask) é um "filtro" que retira permissões no momento da criação de um arquivo. + Se o seu umask for 022 e o sistema tentar criar permissões 666 para arquivos e 777 para diretórios: + Arquivo: 666 - 022 = 644 (Dono Lê e escreve, o resto só lê). + Diretório: 777 - 022 = 755 (Dono faz tudo, o resto lê e entra). +- Por que não usar 777 em produção? + Usar 777 para um projeto em grupo é um grande erro de segurança. Qualquer usuário teria como deletar/modificar arquivos. + Utilizando dessa forma, facilitaria para um invasor fazer o que quisesse, como injetar códigos maliciosos. diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_6/script.sh b/noturno/lab/Daniel_Esmeraldo/atividade_6/script.sh new file mode 100644 index 0000000..0962ef0 --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_6/script.sh @@ -0,0 +1,55 @@ +#!/bin/bash + +mkdir -p /testes && cd /testes + +useradd -m -s /bin/bash Usuario1 +useradd -m -s /bin/bash Usuario2 +useradd -m -s /bin/bash Usuario3 + +groupadd adm +groupadd dev +groupadd rh + +usermod -aG adm Usuario1 +usermod -aG dev,rh Usuario2 +usermod -aG dev Usuario3 + +touch arquivo1.txt arquivo2.txt arquivo3.txt arquivo4.txt +chmod 644 arquivo1.txt +chmod 755 arquivo2.txt +chmod 600 arquivo3.txt +chmod 700 arquivo4.txt + +su -c "cat arquivo1.txt" Usuario1 >> test_results.txt 2>&1 +su -c "cat arquivo2.txt" Usuario1 >> test_results.txt 2>&1 +su -c "cat arquivo3.txt" Usuario1 >> test_results.txt 2>&1 +su -c "cat arquivo4.txt" Usuario1 >> test_results.txt 2>&1 +su -c "echo 'teste' >> arquivo1.txt" Usuario1 >> test_results.txt 2>&1 +su -c "echo 'teste' >> arquivo2.txt" Usuario1 >> test_results.txt 2>&1 +su -c "echo 'teste' >> arquivo3.txt" Usuario1 >> test_results.txt 2>&1 +su -c "echo 'teste' >> arquivo4.txt" Usuario1 >> test_results.txt 2>&1 + +su -c "cat arquivo1.txt" Usuario2 >> test_results.txt 2>&1 +su -c "cat arquivo2.txt" Usuario2 >> test_results.txt 2>&1 +su -c "cat arquivo3.txt" Usuario2 >> test_results.txt 2>&1 +su -c "cat arquivo4.txt" Usuario2 >> test_results.txt 2>&1 +su -c "echo 'teste' >> arquivo1.txt" Usuario2 >> test_results.txt 2>&1 +su -c "echo 'teste' >> arquivo2.txt" Usuario2 >> test_results.txt 2>&1 +su -c "echo 'teste' >> arquivo3.txt" Usuario2 >> test_results.txt 2>&1 +su -c "echo 'teste' >> arquivo4.txt" Usuario2 >> test_results.txt 2>&1 + +su -c "cat arquivo1.txt" Usuario3 >> test_results.txt 2>&1 +su -c "cat arquivo2.txt" Usuario3 >> test_results.txt 2>&1 +su -c "cat arquivo3.txt" Usuario3 >> test_results.txt 2>&1 +su -c "cat arquivo4.txt" Usuario3 >> test_results.txt 2>&1 +su -c "echo 'teste' >> arquivo1.txt" Usuario3 >> test_results.txt 2>&1 +su -c "echo 'teste' >> arquivo2.txt" Usuario3 >> test_results.txt 2>&1 +su -c "echo 'teste' >> arquivo3.txt" Usuario3 >> test_results.txt 2>&1 +su -c "echo 'teste' >> arquivo4.txt" Usuario3 >> test_results.txt 2>&1 + +cat > permissoes_significado << EOF +Permissões: + r: O usuário poderá ler o arquivo + w: O usuário poderá alterar o arquivo + x: O usuário poderá executar o arquivo +EOF diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_7/relatorio.txt b/noturno/lab/Daniel_Esmeraldo/atividade_7/relatorio.txt new file mode 100644 index 0000000..07806cc --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_7/relatorio.txt @@ -0,0 +1,2 @@ +Buscando arquivos com permissão 777... +Buscando arquivos com permissão setuid... diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_7/script.sh b/noturno/lab/Daniel_Esmeraldo/atividade_7/script.sh new file mode 100644 index 0000000..f4f219d --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_7/script.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +echo Buscando arquivos com permissão 777... > relatorio.txt +find /home -perm 777 >> relatorio.txt 2>/dev/null +echo Buscando arquivos com permissão setuid... >> relatorio.txt +find / -perm /4000 >> relatorio.txt 2>/dev/null +echo Buscando usuários com UID 0... >> relatorio.txt +awk -F: '$3 == 0 { print $1 }' /etc/passwd >> relatorio.txt 2>/dev/null diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_8/perguntas_resposta.txt b/noturno/lab/Daniel_Esmeraldo/atividade_8/perguntas_resposta.txt new file mode 100644 index 0000000..c55a77c --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_8/perguntas_resposta.txt @@ -0,0 +1,12 @@ +- Qual é a diferença entre ext4, btrfs e xfs? + Esses são formatos diferentes para organizar dados no disco: + ect4: É o padrão do Linux. É extremamente estável, confiável e compatível com quase tudo. É a escolha segura para a maioria dos usuários domésticos. + xfs: Focado em performance e estabilidade. Lida muito com arquivos gigantes e grande volume de dados. Ele é o padrão em distribuições mepresariais como o Red Hat. + btrfs: Ele é o sistema "moderno". Ele traz varias funções como snapshots, compressão de dados nativa e suporte fácil a RAID. +- Como funciona um loop device? + Um loop device é um arquivo virtual que permite você a montar ele como se fosse um disco rígido. + Você criar um arquivo vazio com o dd, formata ele com o mkfs.ext4 e "engana" o sistema para que ele trate esse arquivo como uma partição real. +- O que é /etc/fstab e por que é importante? + O fstab é um arquivo que contem todos as partições que o Linux deve montar automaticamente durante a inicialização. + Sem ele, toda vez que você ligasse o computador, teria que digitar comandos manualmente para acessar seus arquivos ou seu disco de backup. + RISCO: um erro de digitação nesse arquivo pode fazer o Linux parar de iniciar, pois ele vai tentar montar um arquivo que não existe e travar no processo. diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_8/script.sh b/noturno/lab/Daniel_Esmeraldo/atividade_8/script.sh new file mode 100644 index 0000000..4eab61f --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_8/script.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +df -h + +mkdir disco_diretorio + +dd if=/dev/zero of=disco_virtual.img bs=1M count=100 +mkfs.ext4 -F disco_virtual.img + +mount -o loop disco_virtual.img disco_diretorio +cp /etc/passwd /etc/group disco_diretorio +sudo umount disco_diretorio diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_9/documentacao.md b/noturno/lab/Daniel_Esmeraldo/atividade_9/documentacao.md new file mode 100644 index 0000000..d69f6a6 --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_9/documentacao.md @@ -0,0 +1,328 @@ +# Gerenciador de Arquivos + +Script de gerenciamento de arquivos e diretórios desenvolvido em Bash. Oferece uma interface interativa no terminal com menus de navegação, permitindo realizar operações comuns do sistema de arquivos sem precisar memorizar comandos manualmente. + +--- + +## Requisitos + +- Sistema operacional Linux ou macOS +- Bash 4.0 ou superior +- Permissões adequadas para executar operações de `chmod` e `chown` (algumas funções podem exigir `sudo`) + +--- + +## Como executar + +```bash +# Dê permissão de execução ao script +chmod +x gerenciador.sh + +# Execute o script +./gerenciador.sh +``` + +--- + +## Estrutura do Menu + +``` +GERENCIADOR DE ARQUIVOS +| +|-- Arquivo +| |-- Adicionar arquivo +| |-- Buscar arquivo +| |-- Visualizar conteudo +| | |-- Visualizar todo o conteudo +| | |-- Visualizar as N primeiras linhas +| | |-- Visualizar as N ultimas linhas +| | `-- Buscar por uma palavra +| `-- Deletar arquivo +| +|-- Diretorio +| |-- Adicionar diretorio +| |-- Buscar diretorio +| `-- Deletar diretorio +| +|-- Copiar item +|-- Mover/renomear item +|-- Listar +|-- Gerenciar permissoes +|-- Gerenciar proprietarios +|-- Compactar +|-- Descompactar +|-- Navegar +|-- Backup +|-- Gerar relatorio +|-- Ajuda +`-- Sair +``` + +--- + +## Funcoes + +### `adicionar_arquivo` + +Cria um novo arquivo vazio no diretorio atual. + +- Solicita o nome do arquivo ao usuario +- Verifica se ja existe um arquivo ou diretorio com o mesmo nome +- Cria o arquivo com `touch` caso o nome esteja disponivel +- Registra a operacao no `log.txt` + +--- + +### `buscar_arquivo` + +Busca um arquivo pelo nome a partir do diretorio atual. + +- Solicita o nome do arquivo ao usuario +- Utiliza `find` para localizar arquivos recursivamente +- Exibe o caminho completo caso encontrado +- Registra a operacao no `log.txt` + +--- + +### `deletar_arquivo` + +Remove um arquivo do sistema. + +- Solicita o nome do arquivo ao usuario +- Verifica se o arquivo existe +- Pede confirmacao antes de deletar (`s/n`) +- Remove o arquivo com `rm` apos confirmacao +- Registra a operacao no `log.txt` + +--- + +### `visualizar_conteudo` + +Exibe o conteudo de um arquivo com diferentes modos de visualizacao. + +- Solicita o nome do arquivo ao usuario +- Exibe um submenu com as opcoes abaixo: + +| Opcao | Descricao | +|------------------------------|--------------------------------------------------------| +| Visualizar todo o conteudo | Exibe o arquivo completo com `cat` | +| N primeiras linhas | Exibe as N primeiras linhas com `head` | +| N ultimas linhas | Exibe as N ultimas linhas com `tail` | +| Buscar por uma palavra | Busca um padrao no arquivo com `grep` | + +**Funcoes auxiliares de visualizacao:** + +- `visualizar_head [arquivo]`: usa `head -n N` para exibir as primeiras linhas. Padrao: 10 linhas. +- `visualizar_tail [arquivo]`: usa `tail -n N` para exibir as ultimas linhas. Padrao: 10 linhas. +- `visualizar_grep [arquivo]`: usa `grep -i -n --color=always` para busca case-insensitive com numeracao de linhas. + +--- + +### `adicionar_diretorio` + +Cria um novo diretorio no local atual. + +- Solicita o nome do diretorio ao usuario +- Verifica se ja existe algum item com o mesmo nome +- Cria o diretorio com `mkdir` +- Registra a operacao no `log.txt` + +--- + +### `buscar_diretorio` + +Busca um diretorio pelo nome a partir do diretorio atual. + +- Solicita o nome do diretorio ao usuario +- Utiliza `find -type d` para localizar diretorios recursivamente +- Exibe o caminho completo caso encontrado +- Registra a operacao no `log.txt` + +--- + +### `deletar_diretorio` + +Remove um diretorio e todo o seu conteudo. + +- Solicita o nome do diretorio ao usuario +- Exibe um aviso sobre a remocao permanente de todo o conteudo interno +- Pede confirmacao antes de deletar (`s/n`) +- Remove o diretorio com `rm -r` apos confirmacao +- Registra a operacao no `log.txt` + +--- + +### `listar` + +Lista todos os arquivos e diretorios do diretorio atual. + +- Executa `ls -la` para exibir permissoes, proprietarios, tamanho e data +- Registra a operacao no `log.txt` + +--- + +### `gerenciar_permissoes` + +Altera as permissoes de um arquivo ou diretorio. + +- Solicita o nome do item e o codigo de permissao (ex: `755`, `644`) +- Valida se o codigo esta no formato octal correto (3 ou 4 digitos de 0 a 7) +- Aplica a permissao com `chmod` +- Registra a operacao no `log.txt` + +**Exemplos de permissoes comuns:** + +| Codigo | Significado | +|--------|--------------------------| +| 644 | rw-r--r-- (arquivo padrao) | +| 755 | rwxr-xr-x (executavel) | +| 600 | rw------- (privado) | +| 700 | rwx------ (diretorio privado) | + +--- + +### `gerenciar_proprietarios` + +Altera o proprietario e/ou grupo de um arquivo ou diretorio. + +- Solicita o nome do item, o novo usuario e opcionalmente o novo grupo +- Valida se o usuario existe com `id` +- Valida se o grupo existe com `getent group` (quando informado) +- Aplica a alteracao com `chown` +- Registra a operacao no `log.txt` + +--- + +### `copiar_item` + +Copia um arquivo ou diretorio para um destino especificado. + +- Solicita a origem e o destino +- Detecta se a origem e arquivo (`cp -i`) ou diretorio (`cp -r -i`) +- O parametro `-i` solicita confirmacao em caso de sobrescrita +- Registra a operacao no `log.txt` + +--- + +### `mover_renomear_item` + +Move ou renomeia um arquivo ou diretorio. + +- Solicita a origem e o caminho/nome de destino +- Utiliza `mv -i` para evitar sobrescrita acidental +- Serve tanto para mover (caminho diferente) quanto para renomear (mesmo diretorio, nome diferente) +- Registra a operacao no `log.txt` + +--- + +### `compactar` + +Compacta um arquivo ou diretorio no formato `.tar.gz`. + +- Solicita o nome do item a compactar e o nome do arquivo de saida (sem extensao) +- Gera um arquivo `.tar.gz` com `tar -czf` +- Registra a operacao no `log.txt` + +--- + +### `descompactar` + +Extrai o conteudo de um arquivo `.tar.gz`. + +- Solicita o nome do arquivo (sem a extensao `.tar.gz`) +- Verifica se o arquivo existe e possui a extensao correta +- Solicita o diretorio de destino (Enter para o diretorio atual) +- Extrai com `tar -xzf` +- Registra a operacao no `log.txt` + +--- + +### `navegar` + +Muda o diretorio de trabalho atual do script. + +- Solicita o caminho do diretorio ao usuario +- Verifica se o diretorio existe +- Executa `cd` e exibe o novo caminho com `pwd` +- Registra a operacao no `log.txt` + +> **Observacao:** a navegacao afeta apenas o processo do script. O diretorio do terminal de onde o script foi chamado nao e alterado. + +--- + +### `backup` + +Cria uma copia de segurança de um arquivo ou diretorio com timestamp. + +- Solicita o nome do item a fazer backup +- Cria o diretorio `backup/` no local atual, se nao existir +- Gera a copia com nome no formato `_YYYYMMDD_HHMMSS` +- Registra a operacao no `log.txt` + +--- + +### `gerar_relatorio` + +Exibe um relatorio completo sobre o diretorio atual. + +O relatorio inclui: + +- Quantidade de arquivos +- Quantidade de diretorios +- Espaco total utilizado (`du -sh`) +- Listagem detalhada com permissoes (`ls -la`) +- Historico completo de operacoes do `log.txt` + +--- + +### `ajuda` + +Exibe uma tela de ajuda com o resumo de todas as funcionalidades e instrucoes de uso. + +--- + +### `sair` + +Encerra o programa. + +- Registra o encerramento no `log.txt` +- Executa `exit 0` + +--- + +## Log de Operacoes + +Todas as acoes realizadas sao registradas automaticamente no arquivo `log.txt`, no diretorio de trabalho atual do script. + +**Formato de cada entrada:** + +``` +YYYY-MM-DD HH:MM:SS - +``` + +**Exemplo:** + +``` +2025-05-03 14:32:10 - daniel criou arquivo relatorio.txt +2025-05-03 14:33:05 - daniel procurou por arquivo config.sh +2025-05-03 14:35:22 - daniel removeu o arquivo relatorio.txt +``` + +O inicio e o encerramento do programa tambem sao registrados com uma linha separadora para facilitar a leitura do historico. + +--- + +## Variaveis Globais + +| Variavel | Descricao | +|-----------|-----------------------------------------------------------------------| +| `USUARIO` | Nome do usuario atual. Obtido via `$USER` ou `whoami` como fallback | + +--- + +## Observacoes + +- O script utiliza o comando `select` do Bash para gerar os menus interativos, o que garante compatibilidade com terminais padrao. +- Operacoes de `chown` e alteracoes de permissoes em arquivos de sistema podem exigir privilegios de superusuario (`sudo`). +- A funcao `navegar` altera o diretorio apenas dentro do contexto de execucao do script. +- O arquivo `log.txt` e criado automaticamente na primeira operacao realizada, no diretorio de onde o script for executado. diff --git a/noturno/lab/Daniel_Esmeraldo/atividade_9/script.sh b/noturno/lab/Daniel_Esmeraldo/atividade_9/script.sh new file mode 100644 index 0000000..73c26f9 --- /dev/null +++ b/noturno/lab/Daniel_Esmeraldo/atividade_9/script.sh @@ -0,0 +1,527 @@ +#!/bin/bash + +USUARIO=${USER:-$(whoami)} + +adicionar_arquivo() { + read -p "Informe o nome do arquivo a adicionar: " nome_arquivo + + if [ -e "$nome_arquivo" ]; then + echo "Há um arquivo/diretório já existente com o mesmo nome." + else + touch "$nome_arquivo" + echo "Arquivo $nome_arquivo criado com êxito." + echo "$(date '+%Y-%m-%d %H:%M:%S') - $USUARIO criou arquivo $nome_arquivo" >> log.txt + fi +} + +buscar_arquivo() { + read -p "Informe o nome do arquivo a buscar: " nome_arquivo + resultado=$(find . -type f -name "$nome_arquivo" 2>/dev/null) + + if [ -n "$resultado" ]; then + echo "$resultado" + else + echo "Arquivo não encontrado." + fi + + echo "$(date '+%Y-%m-%d %H:%M:%S') - $USUARIO procurou por arquivo $nome_arquivo" >> log.txt +} + +deletar_arquivo() { + read -p "Informe o nome do arquivo a deletar: " nome_arquivo + if [ -f "$nome_arquivo" ]; then + read -p "Você realmente deseja deletar o arquivo $nome_arquivo? (s/n): " confirm + if [ "$confirm" == "s" ]; then + rm "$nome_arquivo" + echo "Arquivo $nome_arquivo deletado." + echo "$(date '+%Y-%m-%d %H:%M:%S') - $USUARIO removeu o arquivo $nome_arquivo" >> log.txt + fi + else + echo "Arquivo não encontrado." + fi +} + +visualizar_head() { + local nome_arquivo="$1" + read -p "Informe quantas linhas deseja visualizar [padrão 10]: " linhas + linhas=${linhas:-10} + head -n "$linhas" "$nome_arquivo" +} + +visualizar_tail() { + local nome_arquivo="$1" + read -p "Informe quantas linhas deseja visualizar [padrão 10]: " linhas + linhas=${linhas:-10} + tail -n "$linhas" "$nome_arquivo" +} + +visualizar_grep() { + local nome_arquivo="$1" + read -p "Informe a palavra ou padrão a buscar: " padrao + if [ -z "$padrao" ]; then + echo "Padrão não encontrado" + return 1 + fi + grep -i -n --color=always "$padrao" "$nome_arquivo" +} + +visualizar_conteudo() { + read -p "Informe o nome do arquivo: " nome_arquivo + if [ ! -f "$nome_arquivo" ]; then + echo "Arquivo não encontrado" + return 1 + fi + + while true; do + clear + PS3="Escolha uma opção: " + select opcao in "Visualizar todo o conteúdo" "Visualizar as N primeiras linhas" "Visualizar as N últimas linhas" "Buscar por uma palavra" "Voltar"; do + case $opcao in + "Visualizar todo o conteúdo") + clear + cat "$nome_arquivo" + echo "" + read -p "Pressione ENTER para continuar..." + ;; + "Visualizar as N primeiras linhas") + clear + visualizar_head "$nome_arquivo" + echo "" + read -p "Pressione ENTER para continuar..." + ;; + "Visualizar as N últimas linhas") + clear + visualizar_tail "$nome_arquivo" + echo "" + read -p "Pressione ENTER para continuar..." + ;; + "Buscar por uma palavra") + clear + visualizar_grep "$nome_arquivo" + echo "" + read -p "Pressione ENTER para continuar..." + ;; + "Voltar") + return 0 + ;; + *) + echo "Opção inválida." + echo "" + read -p "Pressione ENTER para continuar..." + ;; + esac + + break + done + done +} + +adicionar_diretorio() { + read -p "Informe o nome do diretorio a adicionar: " nome_diretorio + + if [ -e "$nome_diretorio" ]; then + echo "Há um arquivo/diretório já existente com o mesmo nome." + else + mkdir "$nome_diretorio" + echo "$nome_diretorio criado com êxito." + echo "$(date '+%Y-%m-%d %H:%M:%S') - $USUARIO criou diretório $nome_diretorio" >> log.txt + fi +} + +buscar_diretorio() { + read -p "Informe o nome do diretório a buscar: " nome_diretorio + resultado=$(find . -type d -name "$nome_diretorio" 2>/dev/null) + + if [ -n "$resultado" ]; then + echo "$resultado" + else + echo "Diretório não encontrado." + fi + + echo "$(date '+%Y-%m-%d %H:%M:%S') - $USUARIO procurou por diretório $nome_diretorio" >> log.txt +} + +deletar_diretorio() { + read -p "Informe o nome do diretório a deletar: " nome_diretorio + if [ -d "$nome_diretorio" ]; then + echo "ATENÇÃO! TODOS OS ARQUIVOS DENTRO DE $nome_diretorio SERÃO DELETADOS" + read -p "Você realmente deseja deletar o diretório $nome_diretorio? (s/n): " confirm + if [ "$confirm" == "s" ]; then + rm -r "$nome_diretorio" + echo "Diretório $nome_diretorio deletado." + echo "$(date '+%Y-%m-%d %H:%M:%S') - $USUARIO removeu o diretório $nome_diretorio" >> log.txt + fi + else + echo "Diretório não encontrado." + fi +} + +listar() { + ls -la + echo "$(date '+%Y-%m-%d %H:%M:%S') - $USUARIO listou os arquivos/diretórios" >> log.txt +} + +gerenciar_permissoes() { + read -p "Informe o nome do arquivo/diretório a gerenciar permissão: " nome + read -p "Informe as permissões que o arquivo/diretório terá (Ex: 755): " permissoes + if [ -e "$nome" ]; then + if [[ "$permissoes" =~ ^[0-7]{3,4}$ ]]; then + chmod "$permissoes" "$nome" + echo "Permissão alterada com êxito." + echo "$(date '+%Y-%m-%d %H:%M:%S') - $USUARIO alterou a permissão do arquivo/diretório $nome para $permissoes" >> log.txt + else + echo "Formato inválido. Use 755, 644, etc." + fi + else + echo "Arquivo/diretório não encontrado." + fi +} + +gerenciar_proprietarios() { + read -p "Informe o nome do arquivo/diretório: " nome + read -p "Informe o novo proprietário (usuário): " dono + read -p "Informe o novo grupo (opcional, Enter para pular): " grupo + + if ! id "$dono" &>/dev/null; then + echo "Usuário $dono não existe!" + return 1 + fi + + if [ -n "$grupo" ] && ! getent group "$grupo" &>/dev/null; then + echo "Grupo $grupo não existe!" + return 1 + fi + + if [ -e "$nome" ]; then + if [ -n "$grupo" ]; then + chown "$dono:$grupo" "$nome" + echo "Proprietário alterado para $dono:$grupo" + echo "$(date '+%Y-%m-%d %H:%M:%S') - $USUARIO alterou proprietário do arquivo/diretório $nome para $dono:$grupo" >> log.txt + else + chown "$dono" "$nome" + echo "Proprietário alterado para $dono" + echo "$(date '+%Y-%m-%d %H:%M:%S') - $USUARIO alterou proprietário do arquivo/diretório $nome para $dono" >> log.txt + fi + else + echo "Arquivo/diretório não encontrado." + fi +} + +gerar_relatorio() { + echo "================================RELATÓRIO================================" + echo "Quantidade de arquivos: $(ls -l | grep "^-" | wc -l)" + echo "Quantidade de diretórios: $(ls -l | grep "^d" | wc -l)" + echo "Espaço total usado: $(du -sh . 2>/dev/null | cut -f1)" + echo "" + echo "=== PERMISSÕES DOS ARQUIVOS ===" + ls -la + echo "" + echo "=== LOG DE OPERAÇÕES ===" + if [ -f "log.txt" ]; then + cat log.txt + else + echo "Nenhum log encontrado ainda." + fi +} + +copiar_item() { + read -p "Informe item de origem a copiar: " item_origem + read -p "Informe o destino: " destino + if [ -e "$item_origem" ]; then + if [ -f "$item_origem" ]; then + cp -i "$item_origem" "$destino" + elif [ -d "$item_origem" ]; then + cp -r -i "$item_origem" "$destino" + else + echo "Tipo de arquivo não suportado para cópia (ex: link, dispositivo)." + return 1 + fi + if [ $? -eq 0 ]; then + echo "Cópia concluída com êxito." + echo "$(date '+%Y-%m-%d %H:%M:%S') - $USUARIO copiou o item $item_origem para o destino $destino" >> log.txt + else + echo "Cópia fracassada." + fi + else + echo "Origem não encontrada." + fi +} + +mover_renomear_item() { + read -p "Informe o item de origem a mover/renomear: " item_origem + read -p "Informe o caminho [mover] ou nome [renomear]: " caminho_nome + if [ -e "$item_origem" ]; then + mv -i "$item_origem" "$caminho_nome" + if [ $? -eq 0 ]; then + echo "Processo concluído com êxito." + echo "$(date '+%Y-%m-%d %H:%M:%S') - $USUARIO moveu/renomeou o item $item_origem para $caminho_nome" >> log.txt + else + echo "Processo fracassado." + fi + else + echo "Origem não encontrada." + fi +} + +compactar() { + read -p "Informe o nome do arquivo/diretorio a compactar: " origem + if [ ! -e "$origem" ]; then + echo "Arquivo/diretório não encontrado." + return 1 + fi + read -p "Informe o nome do arquivo compactado (sem extensão): " saida + tar -czf "$saida.tar.gz" "$origem" + if [ $? -eq 0 ]; then + echo "Arquivo/diretório $origem compactado com êxito." + echo "$(date '+%Y-%m-%d %H:%M:%S') - $USUARIO compactou o arquivo/diretório $origem" >> log.txt + else + echo "Falha ao compactar arquivo/diretório $origem." + fi +} + +descompactar() { + read -p "Informe o nome do arquivo .tar.gz: " arquivo + if [ ! -e "$arquivo.tar.gz" ]; then + echo "Arquivo $arquivo não encontrado." + return 1 + fi + + if [[ ! "$arquivo" =~ \.tar\.gz$ ]] && [[ ! "$arquivo" =~ \.tgz$ ]]; then + echo "O arquivo não parece ser um .tar.gz ou .tgz. Verifique a extensão." + return 1 + fi + + read -p "Informe o diretório de destino (Enter para atual): " destino + if [ -z "$destino" ]; then + tar -xzf "$arquivo" + else + mkdir -p "$destino" + tar -xzf "$arquivo" -C "$destino" + fi + if [ $? -eq 0 ]; then + echo "Descompactado com êxito." + echo "$(date '+%Y-%m-%d %H:%M:%S') - $USUARIO descompactou o arquivo $arquivo" >> log.txt + else + echo "Falha ao descompactar o arquivo $arquivo." + fi +} + +navegar() { + read -p "Informe o caminho do diretório a navegar: " caminho + if [ -d "$caminho" ]; then + cd "$caminho" + echo "Agora você está em: $(pwd)" + echo "$(date '+%Y-%m-%d %H:%M:%S') - $USUARIO navegou para $caminho" >> log.txt + else + echo "Diretório não encontrado." + fi +} + +backup() { + read -p "Informe o arquivo/diretório a fazer backup: " origem + if [ ! -e "$origem" ]; then + echo "Arquivo/diretório não encontrado." + return 1 + fi + mkdir -p backup + data=$(date '+%Y%m%d_%H%M%S') + nome_base=$(basename "$origem") + destino="backup/${nome_base}_${data}" + if [ -f "$origem" ]; then + cp "$origem" "$destino" + elif [ -d "$origem" ]; then + cp -r "$origem" "$destino" + fi + if [ $? -eq 0 ]; then + echo "Backup concluído com êxito." + echo "$(date '+%Y-%m-%d %H:%M:%S') - $USUARIO fez o backup do arquivo/diretório $origem" >> log.txt + else + echo "Backup fracassado." + fi +} + +ajuda() { + cat << 'EOF' +================================ AJUDA ================================ +GERENCIADOR DE ARQUIVOS - Versão 1.0 + +FUNCIONALIDADES: + +- Arquivo: Adicionar, Buscar, Visualizar conteúdo, Deletar +- Diretório: Adicionar, Buscar, Deletar +- Copiar item (arquivos/diretórios) +- Mover/Renomear item +- Listar conteúdo do diretório atual +- Gerenciar permissões (chmod) - use códigos como 755, 644 +- Gerenciar proprietários (chown) - usuário e opcional grupo +- Gerar relatório (estatísticas + log) +- Compactar/Descompactar (.tar.gz) +- Navegar (mudar de diretório) +- Backup (cria cópia com timestamp) +- Ajuda (esta tela) + +COMO USAR: +- Navegue pelo menu usando números. +- Opção "Voltar" retorna ao menu anterior. +- Todas as ações são registradas em log.txt. +EOF + echo "" + read -p "Pressione ENTER para continuar..." +} + +sair() { + echo "$(date '+%Y-%m-%d %H:%M:%S') - $USUARIO ---------------Usuário encerrou o programa---------------" >> log.txt + exit 0 +} + +echo "$(date '+%Y-%m-%d %H:%M:%S') - $USUARIO ---------------Usuário iniciou o programa---------------" >> log.txt + +while true; do + clear + echo "----------------------GERENCIADOR DE ARQUIVOS----------------------" + PS3="Escolha uma opção: " + select opcao in "Arquivo" "Diretório" "Copiar item" "Mover/renomear item" "Listar" "Gerenciar permissões" "Gerenciar proprietários" "Compactar" "Descompactar" "Navegar" "Backup" "Gerar relatório" "Ajuda" "Sair"; do + case $opcao in + "Arquivo") + clear + PS3="Escolha uma opção: " + select opcao in "Adicionar arquivo" "Buscar arquivo" "Visualizar conteúdo" "Deletar arquivo" "Voltar"; do + case $opcao in + "Adicionar arquivo") + clear + adicionar_arquivo + echo "" + read -p "Pressione ENTER para continuar..." + ;; + "Buscar arquivo") + clear + buscar_arquivo + echo "" + read -p "Pressione ENTER para continuar..." + ;; + "Visualizar conteúdo") + clear + visualizar_conteudo + ;; + "Deletar arquivo") + clear + deletar_arquivo + echo "" + read -p "Pressione ENTER para continuar..." + ;; + "Voltar") + break + ;; + esac + + break + done + ;; + "Diretório") + clear + PS3="Escolha uma opção: " + select opcao in "Adicionar diretório" "Buscar diretório" "Deletar diretório" "Voltar"; do + case $opcao in + "Adicionar diretório") + clear + adicionar_diretorio + echo "" + read -p "Pressione ENTER para continuar..." + ;; + "Buscar diretório") + clear + buscar_diretorio + echo "" + read -p "Pressione ENTER para continuar..." + ;; + "Deletar diretório") + clear + deletar_diretorio + echo "" + read -p "Pressione ENTER para continuar..." + ;; + "Voltar") + break + ;; + esac + + break + done + ;; + "Copiar item") + clear + copiar_item + echo "" + read -p "Pressione ENTER para continuar..." + ;; + "Mover/renomear item") + clear + mover_renomear_item + echo "" + read -p "Pressione ENTER para continuar..." + ;; + "Listar") + clear + listar + echo "" + read -p "Pressione ENTER para continuar..." + ;; + "Gerenciar permissões") + clear + gerenciar_permissoes + echo "" + read -p "Pressione ENTER para continuar..." + ;; + "Gerenciar proprietários") + clear + gerenciar_proprietarios + echo "" + read -p "Pressione ENTER para continuar..." + ;; + "Compactar") + clear + compactar + echo "" + read -p "Pressione ENTER para continuar..." + ;; + "Descompactar") + clear + descompactar + echo "" + read -p "Pressione ENTER para continuar..." + ;; + "Navegar") + clear + navegar + echo "" + read -p "Pressione ENTER para continuar..." + ;; + "Backup") + clear + backup + echo "" + read -p "Pressione ENTER para continuar..." + ;; + "Gerar relatório") + clear + gerar_relatorio + echo "" + read -p "Pressione ENTER para continuar..." + ;; + "Ajuda") + clear + ajuda + ;; + "Sair") + sair + ;; + *) + echo "Opção inválida." + echo "" + read -p "Pressione ENTER para continuar..." + ;; + esac + + break + done +done