Nas partes anteriores vimos os fundamentos do terminal e as utilidades de rede, compressão e processos. Neste último capítulo colocamos o chapéu de administrador: **gestão de memória, disco e interfaces**, **gerenciamento de pacotes**, **usuários e permissões de administração**, **segurança**, **programação de comandos** e algumas **firulas** finais.
Aviso: Este post foi traduzido para o português usando um modelo de tradução automática. Por favor, me avise se encontrar algum erro.
📚 **Esta entrada faz parte da série _Introdução ao terminal_**, dividida em três capítulos que se leem em ordem:
> * Parte 1: Navegación, archivos y comandos
* Parte 2: Red, compresión y procesos
* 👉 **Parte 3: Administración del sistema**
Gestão de memória RAM
Se só quisermos obter informações da memória, podemos usar o comando free
InputPython!freeCopied
total usado libre compartido búfer/caché disponibleMemoria: 32774516 6563544 20091804 276296 6119168 25479600Swap: 2097148 0 2097148
Mas como essa informação não é muito fácil de digerir, adicionamos o flag -h (human) para que seja mais fácil de ler
InputPython!free -hCopied
total usado libre compartido búfer/caché disponibleMemoria: 31Gi 6,3Gi 19Gi 270Mi 5,8Gi 24GiSwap: 2,0Gi 0B 2,0Gi
Gestão do disco rígido
Para obter informações do disco rígido, fazemos uso do comando du. Se apenas introduzirmos este comando no terminal, ele nos dará informações sobre todas as pastas da nossa máquina; por isso, para não obter informação em excesso, é necessário introduzir um caminho que queiramos escanear.
InputPython!du ~/Documentos/web/portafolio/posts/Copied
8 /home/wallabot/Documentos/web/portafolio/posts/__pycache__1648 /home/wallabot/Documentos/web/portafolio/posts/notebooks_translated4288 /home/wallabot/Documentos/web/portafolio/posts/html_files336 /home/wallabot/Documentos/web/portafolio/posts/prueba/tocompress1132 /home/wallabot/Documentos/web/portafolio/posts/prueba16 /home/wallabot/Documentos/web/portafolio/posts/introduccion_python/__pycache__28 /home/wallabot/Documentos/web/portafolio/posts/introduccion_python11232 /home/wallabot/Documentos/web/portafolio/posts/
Assim como antes, adicionamos o flag -h (human) para que seja mais fácil de ler
InputPython!du ~/Documentos/web/portafolio/posts/ -hCopied
8,0K /home/wallabot/Documentos/web/portafolio/posts/__pycache__1,7M /home/wallabot/Documentos/web/portafolio/posts/notebooks_translated4,2M /home/wallabot/Documentos/web/portafolio/posts/html_files336K /home/wallabot/Documentos/web/portafolio/posts/prueba/tocompress1,2M /home/wallabot/Documentos/web/portafolio/posts/prueba16K /home/wallabot/Documentos/web/portafolio/posts/introduccion_python/__pycache__28K /home/wallabot/Documentos/web/portafolio/posts/introduccion_python11M /home/wallabot/Documentos/web/portafolio/posts/
Gestão de interfaces
No Ubuntu, por padrão iniciamos em uma interface gráfica, mas podemos abrir outras interfaces, que não serão gráficas, pressionando CTRL+ALT+F<num> onde o número pode ir de 1 a 6. Apenas a 2 terá a interface gráfica e a 1 será o início de sessão
Ao lidar com várias interfaces, podemos não saber em qual nos encontramos, então, introduzindo o comando tty, ele nos dirá em qual estamos
InputPython!ttyCopied
/dev/pts/0
Gestão de pacotes
Repositórios PPA (Arquivos de Pacotes Pessoais)
No Linux, o gerenciamento de pacotes é feito por meio de repositórios. Esta é uma lista de endereços onde se encontram os binários dos nossos programas. Assim, quando queremos atualizar ou instalar nossos programas (depois explicaremos como), o que o sistema operacional fará é ver a lista desses repositórios e ir aos endereços indicados para buscar os binários
Esta lista de repositórios se encontra em /etc/apt/sources.list e dentro da pasta /etc/apt/sources.list.d. Vamos ver esta lista.
InputPythonterminal("cat /etc/apt/sources.list", max_lines_output=10)Copied
# deb cdrom:[Ubuntu 20.04.2.0 LTS _Focal Fossa_ - Release amd64 (20210209.1)]/ focal main restricted# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to# newer versions of the distribution.deb http://es.archive.ubuntu.com/ubuntu/ focal main restricted# deb-src http://es.archive.ubuntu.com/ubuntu/ focal main restricted## Major bug fix updates produced after the final release of the## distribution.deb http://es.archive.ubuntu.com/ubuntu/ focal-updates main restricted...deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /# deb-src https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /deb https://apt.kitware.com/ubuntu/ focal main# deb-src https://apt.kitware.com/ubuntu/ focal main
As primeiras linhas que incluem a palavra cd-rom são referências ao CD de instalação, sempre vêm com as palavras deb cdrom: embora tenha sido instalado pela rede ou de um USB.
A partir daqui começam a aparecer diversas linhas que começam com deb ou deb-src. Em deb encontram-se os binários e em deb-src encontra-se o código-fonte.
Todo endereço válido de repositório tem um destes formatos:
- deb http://direção_do_servidor/nome_da_pasta nome_da_versão (main ou universe ou multiverse ou main restricted, etc)
- deb-src http://direccion_del_servidor/nombre_carpeta nombre_de_version (main ou universe ou multiverse ou main restricted, etc)
Os seis tipos de repositórios do Ubuntu são:
- Principal
O repositório Main está ativado por padrão e contém apenas software livre e de código aberto ou FOSS por suas siglas em inglês (Free and Open-Source Software).
- Universo
Como Main, Universe también ofrece FOSS. A diferença é que, neste repositório, não é a Ubuntu quem garante atualizações regulares de segurança, mas sim a comunidade que se encarrega do seu suporte. Vem ativado por padrão, mas nem sempre. Alguns sistemas operativos o têm desativado por padrão e talvez tenhamos de o ativar se estivermos a executar uma Live Session. Se não o tivermos adicionado, podemos fazê-lo com este comando:
sudo add-apt-repository universeO que encontramos em «Universe»? Eu diria que a maior parte do software que vale a pena, entre o qual temos VLC e OpenShot.
- Multiverso
A partir daqui vêm os repositórios do Ubuntu com menos liberdade. Multiverse contém software que já não é FOSS e o Ubuntu não pode ativar este repositório por padrão por problemas legais e de licenças. Por outro lado, também não pode fornecer patches e atualizações. Com isso em mente, temos de avaliar se o adicionamos ou não, algo que poderemos fazer com este comando:
sudo add-apt-repository multiverse- Restrito
Nos repositórios do Ubuntu poderemos encontrar software livre e de código aberto, mas isso não é possível quando se trata de algo relacionado com o hardware. Nos repositórios Restricted encontraremos drivers, como os das placas gráficas, painéis táteis ou placas de rede.
sudo add-apt-repository restricted- Parceiro
Este repositório contém software proprietário compilado pela Ubuntu de seus parceiros.
- Repositórios de terceiros do Ubuntu
Por fim, temos os repositórios de terceiros. O Ubuntu tenta oferecer sempre a melhor experiência de usuário e esse é um dos motivos pelos quais rejeita determinado software. Também há desenvolvedores que preferem ter um controle total sobre o que oferecem e, por esse motivo, criam seus próprios repositórios.
Adicionar repositórios
Se estamos no Ubuntu, podemos adicionar um repositório usando o comando add-apt-repository <repository>. Mas, como em outras distribuições que não sejam o Ubuntu, não temos esse comando.
Atualizar os repositórios
Por meio do comando apt update poderemos atualizar para as últimas versões dos pacotes que temos em nosso repositório.
Atualizar os pacotes
Por meio do comando apt upgrade poderemos atualizar os programas que tivermos instalados e dos quais antes tenhamos atualizado seu repositório
Atualizar o kernel
Se usamos o comando apt dist-upgrade, também serão atualizados os pacotes do kernel
Cuidado!: Atualizar pacotes do kernel pode fazer com que alguns pacotes quebrem
Lembrete: Ao atualizar pacotes do kernel, para que tenham efeito é necessário reiniciar o computador
Busca de pacotes
Com o comando apt search <paquete> podemos encontrar pacotes
InputPythonterminal("apt search vlc", max_lines_output=10)Copied
Ordenando...Buscar en todo el texto...anacrolix-dms/focal 1.1.0-1 amd64Go UPnP DLNA Digital Media Server with basic video transcodingcubemap/focal 1.4.3-1build1 amd64scalable video reflector, designed to be used with VLCdvblast/focal 3.4-1 amd64Simple and powerful dvb-streaming application...x264/focal 2:0.155.2917+git0a84d98-2 amd64video encoder for the H.264/MPEG-4 AVC standard
Lista de pacotes instalados
Para ver quais pacotes temos instalados, podemos usar dpkg -l, isso nos dará uma lista de todos os pacotes que temos instalados em nosso computador
InputPythonterminal("dpkg -l", max_lines_output=10)Copied
Deseado=desconocido(U)/Instalar/eliminaR/Purgar/retener(H)| Estado=No/Inst/ficheros-Conf/desempaqUetado/medio-conF/medio-inst(H)/espera-disparo(W)/pendienTe-disparo|/ Err?=(ninguno)/requiere-Reinst (Estado,Err: mayúsc.=malo)||/ Nombre Versión Arquitectura Descripción+++-==========================================-=====================================-============-===========================================================================================================================================================================================================================================================================================================================================================================================================================================ii accountsservice 0.6.55-0ubuntu12~20.04.5 amd64 query and manipulate user account informationii acl 2.2.53-6 amd64 access control list - utilitiesii acpi-support 0.143 amd64 scripts for handling many ACPI eventsii acpid 1:2.0.32-1ubuntu1 amd64 Advanced Configuration and Power Interface event daemonii adduser 3.118ubuntu2 all add and remove users and groups...ii zip 3.0-11build1 amd64 Archiver for .zip filesii zlib1g:amd64 1:1.2.11.dfsg-2ubuntu1.5 amd64 compression library - runtimeii zlib1g:i386 1:1.2.11.dfsg-2ubuntu1.5 i386 compression library - runtimeii zlib1g-dev:amd64 1:1.2.11.dfsg-2ubuntu1.5 amd64 compression library - development
Se quisermos procurar se temos um pacote instalado, podemos usar o comando anterior e criar um pipe e procurar o nome do pacote com grep
InputPythonterminal("dpkg -l | grep vlc")Copied
Deseado=desconocido(U)/Instalar/eliminaR/Purgar/retener(H)| Estado=No/Inst/ficheros-Conf/desempaqUetado/medio-conF/medio-inst(H)/espera-disparo(W)/pendienTe-disparo|/ Err?=(ninguno)/requiere-Reinst (Estado,Err: mayúsc.=malo)||/ Nombre Versión Arquitectura Descripción+++-==============-============-============-=================================ii grep 3.4-1 amd64 GNU grep, egrep and fgrepii vlc 3.0.9.2-1 amd64 multimedia player and streamer
Instalar pacotes baixados e não de repositórios
Em algumas ocasiões, quando você quer instalar um programa, o que fazem é te dar um arquivo .deb, por isso, para instalá-lo, usamos o comando dpkg -i <file.deb>
Administrador de usuários
Informações do usuário ativo com id
Por meio do comando id posso ver qual usuário eu sou
InputPython!idCopied
uid=1000(wallabot) gid=1000(wallabot) grupos=1000(wallabot),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),120(lpadmin),131(lxd),132(sambashare),998(docker)
Com este comando posso ver meu id, a ID de grupo gid e os grupos aos quais pertenço. Nas distribuições baseadas em Debian, aos usuários é atribuída uma ID a partir de 1000, enquanto ao usuário root é atribuída a ID 0
Informações do usuário ativo com whoami
Outro comando para saber qual usuário sou é whoami
InputPython!whoamiCopied
wallabot
Arquivo com as informações de todos os usuários
As informações dos usuários estão no arquivo /etc/passwd
InputPythonterminal("cat /etc/passwd", max_lines_output=10)Copied
root:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinbin:x:2:2:bin:/bin:/usr/sbin/nologinsys:x:3:3:sys:/dev:/usr/sbin/nologinsync:x:4:65534:sync:/bin:/bin/syncgames:x:5:60:games:/usr/games:/usr/sbin/nologinman:x:6:12:man:/var/cache/man:/usr/sbin/nologinlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologinmail:x:8:8:mail:/var/mail:/usr/sbin/nologinnews:x:9:9:news:/var/spool/news:/usr/sbin/nologin...sshd:x:126:65534::/run/sshd:/usr/sbin/nologinnvidia-persistenced:x:127:135:NVIDIA Persistence Daemon,,,:/nonexistent:/usr/sbin/nologinfwupd-refresh:x:128:136:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologinglances:x:129:137::/var/lib/glances:/usr/sbin/nologin
Alterar a senha de um usuário
Se eu quiser alterar a senha de um usuário, é preciso usar o comando passwd <user> <password>. Se o usuário não for especificado, será usado o valor retornado pelo comando whoami.
Criar usuários com useradd
Para criar um novo usuário usa-se o comando useradd <user name>, vamos criar um novo usuário
InputPython!sudo useradd usertest1Copied
Vamos ver se está no arquivo com todos os usuários
InputPython!cat /etc/passwd | grep usertestCopied
usertest1:x:1001:1001::/home/usertest1:/bin/sh
Como vemos, o usuário foi criado com o id 1001, o seguinte ao que meu usuário wallabot tinha, que era o último
No entanto, ao criar este usuário, ele não nos pediu para atribuir uma senha. Além disso, se olharmos o que há dentro de home
InputPython!ls /homeCopied
wallabot
Só existe a pasta do usuário wallabot, mas não a do usuário test1
Criar usuários com adduser
Portanto, vamos ver outro comando para criar usuários que exige uma senha e também cria uma pasta em home. Este comando é adduser
InputPython!sudo adduser usertest2Copied
[sudo] contraseña para wallabot:Añadiendo el usuario `usertest2' ...Añadiendo el nuevo grupo `usertest2' (1002) ...Añadiendo el nuevo usuario `usertest2' (1002) con grupo `usertest2' ...Creando el directorio personal `/home/usertest2' ...Copiando los ficheros desde `/etc/skel' ...Nueva contraseña:Vuelva a escribir la nueva contraseña:passwd: contraseña actualizada correctamenteCambiando la información de usuario para usertest2Introduzca el nuevo valor, o presione INTRO para el predeterminadoNombre completo []:Número de habitación []:Teléfono del trabajo []:Teléfono de casa []:Otro []:¿Es correcta la información? [S/n] s
Se olharmos no arquivo com todos os usuários
InputPython!cat /etc/passwd | grep usertestCopied
usertest1:x:1001:1001::/home/usertest1:/bin/shusertest2:x:1002:1002:,,,:/home/usertest2:/bin/bash
Vemos que o usuário usertest2 foi criado
InputPython!ls /homeCopied
usertest2 wallabot
E vemos que foi criada uma pasta para ele em home
Para apagar um usuário, é preciso usar o comando userdel <username>
InputPython!sudo userdel usertest1Copied
InputPython!sudo userdel usertest2Copied
Vamos ver se estão no arquivo com todos os usuários.
InputPython!cat /etc/passwd | grep usertestCopied
Vemos que já não aparece nada, na verdade vemos o final desse arquivo.
InputPython!tail /etc/passwdCopied
geoclue:x:122:127::/var/lib/geoclue:/usr/sbin/nologinpulse:x:123:128:PulseAudio daemon,,,:/var/run/pulse:/usr/sbin/nologingnome-initial-setup:x:124:65534::/run/gnome-initial-setup/:/bin/falsegdm:x:125:130:Gnome Display Manager:/var/lib/gdm3:/bin/falsewallabot:x:1000:1000:wallabot,,,:/home/wallabot:/bin/bashsystemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologinsshd:x:126:65534::/run/sshd:/usr/sbin/nologinnvidia-persistenced:x:127:135:NVIDIA Persistence Daemon,,,:/nonexistent:/usr/sbin/nologinfwupd-refresh:x:128:136:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologinglances:x:129:137::/var/lib/glances:/usr/sbin/nologin
Criar um usuário administrador
Primeiro vamos criar um novo usuário, que no início não será administrador
InputPython!sudo adduser noadminCopied
Añadiendo el usuario `noadmin' ...Añadiendo el nuevo grupo `noadmin' (1001) ...Añadiendo el nuevo usuario `noadmin' (1001) con grupo `noadmin' ...Creando el directorio personal `/home/noadmin' ...Copiando los ficheros desde `/etc/skel' ...Nueva contraseña:Vuelva a escribir la nueva contraseña:passwd: contraseña actualizada correctamenteCambiando la información de usuario para noadminIntroduzca el nuevo valor, o presione INTRO para el predeterminadoNombre completo []:Número de habitación []:Teléfono del trabajo []:Teléfono de casa []:Otro []:¿Es correcta la información? [S/n] s
Vamos ver a quais grupos pertence o usuário que acabamos de criar; para isso usamos o comando groups <user>
InputPython!groups noadminCopied
noadmin : noadmin
Como vemos, ele está apenas no grupo noadmin, que é um grupo criado ao criar o usuário
Vamos ver a quais grupos meu usuário pertence
InputPython!groups wallabotCopied
wallabot : wallabot adm cdrom sudo dip plugdev lpadmin lxd sambashare docker
Como vemos, meu usuário pertence a vários grupos mais, entre eles a um chamado sudo. Os usuários que tenham acesso a esse grupo têm poderes de administrador, então para que o novo usuário que criamos tenha esses poderes é preciso adicioná-lo ao grupo sudo
Para adicionar um usuário a um grupo há duas maneiras: uma é com o comando gpasswd -a <user> <group>
InputPython!sudo gpasswd -a noadmin sudoCopied
Añadiendo al usuario noadmin al grupo sudo
Vamos agora ver a quais grupos pertence o usuário noadmin
InputPython!groups noadminCopied
noadmin : noadmin sudo
Como vemos, já pertence ao grupo sudo, portanto já teria poderes de administrador
Removemos o usuário noadmin do grupo sudo com o comando gpasswd -d <user> <group>
InputPython!sudo gpasswd -d noadmin sudoCopied
Eliminando al usuario noadmin del grupo sudo
Vemos que noadmin já não pertence ao grupo sudo
InputPython!groups noadminCopied
noadmin : noadmin
O segundo comando para adicionar um usuário a um grupo é usermod -aG <group> <user>
InputPython!sudo usermod -aG sudo noadminCopied
Vamos ver a quais grupos pertence o utilizador noadmin
InputPython!groups noadminCopied
noadmin : noadmin sudo
Removemos o usuário noadmin do grupo sudo e o excluímos
InputPython!sudo gpasswd -d noadmin sudoCopied
Eliminando al usuario noadmin del grupo sudo
InputPython!sudo userdel noadminCopied
Histórico de comandos
history
Se, no terminal, introduzirmos o comando history, veremos um histórico dos comandos utilizados
InputPython!historyCopied
1009 docker build . nvidia/cuda1010 docker build --help1011 docker build --build-arg nvidia/cuda1012 docker build --build-arg [nvidia/cuda]1013 cd ../docker/1014 docker ps -a1015 docker rm boring_wescoff1016 docker compose up -d1017 docker compose exec deepstream61 bash1018 cd ......1996 ps1997 ps aux1998 camerasIP.sh1999 sudo su2000 sudo useradd usertest2001 sudo userdel usertest2002 sudo useradd usertest2003 sudo userdel usertest2004 sudo su2005 sudo apt install history2006 history2007 clear2008 history
Se quisermos executar um dos comandos do histórico, fazemos isso com !<num comando>, por exemplo, se eu quiser voltar a executar o comando 1996
InputPython! !1996Copied
PID TTY TIME CMD6610 pts/0 00:00:00 bash20826 pts/0 00:00:00 ps
reverse-i-search
Uma maneira mais refinada de buscar no histórico é digitar CTRL+r. Ao fazer isso, aparecerá a seguinte mensagem no console
InputPython!reverse-i-search)`':Copied
Dessa forma, à medida que você vai escrevendo, irão aparecendo comandos que correspondem ao que você digitou. Por exemplo, se eu digitar if, aparece a última vez que usei ifconfig.
Se voltarmos a introduzir CTRL+r irão aparecendo correspondências mais antigas
Remover comandos do histórico
Há comandos como ls, cd, pwd que não nos acrescentam muito por estarem no histórico, por isso é possível configurar para que não sejam guardados no histórico. Para isso, modificamos o arquivo ~/.bashrc e adicionamos a linha HISTIGNORE="pwd:ls:cd"
Segurança
Firewall ufw
O Ubuntu vem com o firewall ufw instalado, mas para verificá-lo usamos o seguinte comando
InputPython!sudo ufw statusCopied
Estado: inactivo
Como vemos, por defecto está inativo, por isso vamos criar um conjunto de regras. Por exemplo, vamos começar abrindo a porta 22 (SSH), para isso usamos o comando sudo allow <port> comment "<coment>", com o qual abrimos uma porta e adicionamos um comentário
InputPython!sudo ufw allow 22 comment 'ssh'Copied
Regla añadidaRegla añadida (v6)
Como vemos, abriu a porta 22 para IPv4 e IPv6. Vamos agora ativar ufw com o comando ufw enable
InputPython!sudo ufw enableCopied
El cortafuegos está activo y habilitado en el arranque del sistema
Se quisermos ver as regras que temos no firewall, usamos o comando ufw status
InputPython!sudo ufw enableCopied
Hasta Acción Desde----- ------ -----22 ALLOW Anywhere # ssh22 (v6) ALLOW Anywhere (v6) # ssh
Também podemos dizer para ele mostrar as regras numeradas com o comando ufw status numbered
InputPython!sudo ufw status numberedCopied
Estado: activoHasta Acción Desde----- ------ -----[ 1] 22 ALLOW IN Anywhere # ssh[ 2] 22 (v6) ALLOW IN Anywhere (v6) # ssh
Como elas estão numeradas, podemos remover uma usando o comando ufw delete <rule number>, então para excluir a regra para IPv6 fazemos
InputPython!sudo ufw delete 2Copied
Estado: activoBorrando:allow 22 comment 'ssh'¿Continuar con la operación (s|n)? sRegla eliminada (v6)
Voltamos a ver o estado
InputPython!sudo ufw status numberedCopied
Estado: activoHasta Acción Desde----- ------ -----[ 1] 22 ALLOW IN Anywhere # ssh
Vemos que, de fato, a regra número 2 foi eliminada.
Se queremos habilitar a conexão SSH a partir de um único IP, usamos a flag from <IP>
InputPython!sudo ufw allow from 192.168.1.103 proto tcp to any port 22 comment 'ssh ip'Copied
Regla añadida
Volvamos a verificar as regras
InputPython!sudo ufw status numberedCopied
Estado: activoHasta Acción Desde----- ------ -----[ 1] 22 ALLOW IN Anywhere # ssh[ 2] 22/tcp ALLOW IN 192.168.1.103 # ssh ip
Se quisermos apagar todas as regras, usamos o comando reset
InputPython!sudo ufw resetCopied
Estado: activoReiniciando todas las reglas a sus valores predeterminados instalados.¿Continuar con la operación (s|n)? sRespaldando «user.rules» en «/etc/ufw/user.rules.20221205_171730»Respaldando «before.rules» en «/etc/ufw/before.rules.20221205_171730»Respaldando «after.rules» en «/etc/ufw/after.rules.20221205_171730»Respaldando «user6.rules» en «/etc/ufw/user6.rules.20221205_171730»Respaldando «before6.rules» en «/etc/ufw/before6.rules.20221205_171730»Respaldando «after6.rules» en «/etc/ufw/after6.rules.20221205_171730»
Voltamos a verificar o estado
InputPython!sudo ufw status numberedCopied
Estado: inactivo
Vemos que já não há nenhuma regra
Para desativar o firewall, usamos o comando ufw disable
InputPython!sudo ufw disableCopied
El cortafuegos está detenido y deshabilitado en el arranque del sistema
Voltemos a verificar o estado
InputPython!sudo ufw statusCopied
Estado: inactivo
Auditoria de segurança com Lynis
Para instalar o Lynis, você precisa usar o comando sudo apt install lynis
Para fazer uma auditoria do seu sistema, é preciso usar o comando lynis audit system. Isso começa a fazer uma varredura de todo o sistema e te o reporta.
Não vou mostrar o resultado da análise do meu sistema para não expor na Internet as minhas vulnerabilidades
Programação de comandos
Programação de comandos periódicos com cron
Com o comando cron podemos agendar comandos para que sejam executados periodicamente. Para isso temos que editar o arquivo /etc/crontab
InputPython!cat /etc/crontabCopied
# /etc/crontab: system-wide crontab# Unlike any other crontab you don't have to run the `crontab'# command to install the new version when you edit this file# and files in /etc/cron.d. These files also have username fields,# that none of the other crontabs do.SHELL=/bin/shPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin# Example of job definition:# .---------------- minute (0 - 59)# | .------------- hour (0 - 23)# | | .---------- day of month (1 - 31)# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat# | | | | |# * * * * * user-name command to be executed17 * * * * root cd / && run-parts --report /etc/cron.hourly25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )#
Como se pode ver, neste arquivo há uma série de comandos que são executados periodicamente. O formato destes comandos é o seguinte
<minuto> <hora> <dia do mês> <mês> <dia da semana> <usuário> <comando>Para criar corretamente a data em que você quer que o comando seja executado, há muitas páginas online que te ajudam a escrevê-lo corretamente, como por exemplo crontab guru
Programação de comandos de uma única execução com at
Quando queremos que no futuro seja executado um comando, mas não queremos que isso seja feito periodicamente, e sim apenas uma única vez, podemos usar o comando at. Por exemplo, você liga uma máquina da Azure ou da Amazon, pela qual cobram, e quer ter certeza de que ela vai ser desligada e de que não vai chegar uma surpresa na fatura; você pode deixar programado que à noite ela se desligue. Assim, mesmo que você se esqueça de desligá-la, ela se desligará sozinha
Fazemos um ls na pasta /tmp
InputPython!ls -l /tmpCopied
total 60-rw------- 1 wallabot wallabot 0 sep 24 08:51 config-err-QM3AAe-rw-r--r-- 1 root root 2049 sep 24 08:51 glances-root.logdrwx------ 2 wallabot wallabot 4096 sep 24 09:06 pyright-9853-BG3nXEXw0Taodrwxrwxr-x 3 wallabot wallabot 4096 sep 24 09:06 python-languageserver-cancellationdrwx------ 3 root root 4096 sep 24 08:51 snap-private-tmpdrwx------ 2 wallabot wallabot 4096 sep 24 08:51 ssh-mHjlSPPoqCp7drwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-colord.service-rpjPridrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-fwupd.service-FzPoQfdrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-geoclue.service-F6pMWidrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-ModemManager.service-Orf6Bidrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-switcheroo-control.service-1QXRqjdrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-systemd-logind.service-lL35tgdrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-systemd-resolved.service-iaswSidrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-systemd-timesyncd.service-Yet8ljdrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-upower.service-oTL7Ggdrwx------ 2 wallabot wallabot 4096 sep 24 09:31 tracker-extract-files.1000
Agora vamos programar para que seja criado um novo arquivo em /tmp dentro de 5 minutos
InputPython!at 09:55 touch /tmp/at.txtCopied
warning: commands will be executed using /bin/shat> touch /tmp/at.txtat> <EOT>job 1 at Sun Sep 24 09:55:00 2023
Como vemos, há que escrever at <time> e na linha seguinte o comando que queremos que seja executado
Vemos agora os arquivos que há em /tmp
InputPython!ls -l /tmpCopied
total 60-rw-rw-r-- 1 wallabot wallabot 0 sep 24 09:55 at.txt-rw------- 1 wallabot wallabot 0 sep 24 08:51 config-err-QM3AAe-rw-r--r-- 1 root root 2049 sep 24 08:51 glances-root.logdrwx------ 2 wallabot wallabot 4096 sep 24 09:06 pyright-9853-BG3nXEXw0Taodrwxrwxr-x 3 wallabot wallabot 4096 sep 24 09:06 python-languageserver-cancellationdrwx------ 3 root root 4096 sep 24 08:51 snap-private-tmpdrwx------ 2 wallabot wallabot 4096 sep 24 08:51 ssh-mHjlSPPoqCp7drwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-colord.service-rpjPridrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-fwupd.service-FzPoQfdrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-geoclue.service-F6pMWidrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-ModemManager.service-Orf6Bidrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-switcheroo-control.service-1QXRqjdrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-systemd-logind.service-lL35tgdrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-systemd-resolved.service-iaswSidrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-systemd-timesyncd.service-Yet8ljdrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-upower.service-oTL7Ggdrwx------ 2 wallabot wallabot 4096 sep 24 09:31 tracker-extract-files.1000
Como vemos, há um at.txt que foi criado às 09:55
Atalhos de teclado
A seguir, mostram-se alguns atalhos de teclado úteis no uso do terminal
- Ctrl+a: leva o cursor para o início da linha de comandos.
- Ctrl+e: leva o cursor ao final da linha de comandos.
- Ctrl+l: limpa o terminal, semelhante ao que faz o comando
clear. - Ctrl+u: limpa desde a posição do cursor até o início da linha. Se estiver no final, limpa a linha inteira.
- Ctrl+k: limpa desde a posição do cursor até o final da linha. Se estiver no início, limpa a linha inteira.
- Ctrl+h: faz o mesmo que a tecla backspace, apaga o caractere imediatamente anterior à posição do cursor.
- Ctrl+w: apaga a palavra imediatamente anterior ao cursor.
- Alt+d ou Esc+d: apaga a próxima palavra depois do cursor.
- Ctrl+p: estabelece a linha de comandos com o último comando introduzido.
- Ctrl+r: inicia a busca de comandos usados anteriormente, digitando parte de um comando usado anteriormente que tenhamos realizado, incluindo as opções e parâmetros. Faça uma busca pressionando novamente a combinação de teclas e encontraremos correspondências anteriores.
- Ctrl+c: termina o processo que está sendo executado, útil para recuperar o controle do sistema.
- Ctrl+d: sai do terminal, semelhante ao comando
exit. - Ctrl+z: suspende a execução do processo que está sendo executado e o coloca em segundo plano; com o comando fg, poderemos voltar a continuar sua execução.
- Ctrl+t: troca a posição dos dois caracteres antes do cursor, útil para corrigir erros de digitação.
- Esc+t: intercambia a posição das duas palavras antes do cursor, útil para corrigir erros de digitação.
- Alt+f: move o cursor para o início da próxima palavra na linha, o mesmo que Ctrl+right no terminal GNOME.
- Alt+b: move o cursor para o início da palavra anterior da linha, o mesmo que Ctrl+left no terminal do GNOME.
- Tab: autocompleta comandos ou caminhos de diretórios ou arquivos.
- Ctrl+Shift+F: abre um diálogo para fazer uma busca de texto na saída do terminal.
- Ctrl+Shift+g: procura a próxima ocorrência da pesquisa anterior no terminal.
- Ctrl+Shift+h: procura a ocorrência anterior da busca anterior no terminal.
- Ctrl+Shift+c: copia o texto selecionado do terminal para a área de transferência.
- Ctrl+Shift+v: cola o texto da área de transferência na linha de comando.
- Up: define na linha de comando o comando anterior do histórico, assim como Ctrl+p.
- Down: estabelece na linha de comando o seguinte comando do histórico.
- Mouse Esquerdo: seleciona linhas de texto do terminal.
- Ctrl+Botón izquierdo del ratón: seleciona blocos de texto do terminal.
Sistema de pastas no Linux
Na imagem a seguir, podemos ver como é o sistema de pastas no Linux
Esta imagem foi extraída da publicação no LinkedIn de Roberto Morais
Fricadas
Você esqueceu de usar sudo
¿Nunca te aconteceu de ir usar um comando que tinha que executar com sudo, mas você esqueceu de escrever sudo? Pois bem, depois de receber o erro correspondente, se você fizer sudo !! o comando anterior será executado com sudo
InputPython!apt updateCopied
Leyendo lista de paquetes... HechoE: No se pudo abrir el fichero de bloqueo «/var/lib/apt/lists/lock» - open (13: Permiso denegado)E: No se pudo bloquear el directorio /var/lib/apt/lists/W: Se produjo un problema al desligar el fichero /var/cache/apt/pkgcache.bin - RemoveCaches (13: Permiso denegado)W: Se produjo un problema al desligar el fichero /var/cache/apt/srcpkgcache.bin - RemoveCaches (13: Permiso denegado)
Como se pode ver, ao executar sudo update nos dá um erro, mas se agora executarmos sudo !! será executado sudo apt update
InputPython!sudo !!Copied
[sudo] contraseña para wallabot:
Mensagens do kernel
Com o comando dmesg (display kernel ring buffer messages) podemos ver as mensagens do kernel. Por exemplo, isto é muito útil para ver se foi conectado um dispositivo USB, ou para depurar erros HW do nosso computador
InputPython!dmesg | tailCopied
[ 35.812312] input: LogiOps Virtual Input as /devices/virtual/input/input33[ 35.916406] input: LogiOps Virtual Input as /devices/virtual/input/input34[ 36.002064] input: LogiOps Virtual Input as /devices/virtual/input/input35[ 63.879806] input: MX Master 3 as /devices/virtual/misc/uhid/0005:046D:B023.0006/input/input36[ 63.879931] logitech-hidpp-device 0005:046D:B023.0006: input,hidraw3: BLUETOOTH HID v0.15 Keyboard [MX Master 3] on 4c:77:cb:1d:66:d0[ 63.902120] logitech-hidpp-device 0005:046D:B023.0006: HID++ 4.5 device connected.[ 69.604899] input: MX Keys Keyboard as /devices/virtual/misc/uhid/0005:046D:B35B.0007/input/input37[ 69.605221] input: MX Keys Mouse as /devices/virtual/misc/uhid/0005:046D:B35B.0007/input/input38[ 69.606204] hid-generic 0005:046D:B35B.0007: input,hidraw4: BLUETOOTH HID v0.13 Keyboard [MX Keys] on 4c:77:cb:1d:66:d0[ 188.285030] input: T9 (AVRCP) as /devices/virtual/input/input40
Com a flag --follow podemos ver em tempo real as novas mensagens que forem sendo geradas
InputPython!dmesg --followCopied
[ 0.000000] Linux version 5.15.0-84-generic (buildd@lcy02-amd64-005) (gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #93~20.04.1-Ubuntu SMP Wed Sep 6 16:15:40 UTC 2023 (Ubuntu 5.15.0-84.93~20.04.1-generic 5.15.116)[ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-5.15.0-84-generic root=UUID=59002381-d88d-44a6-b83d-8c5a226ce058 ro quiet splash vt.handoff=7[ 0.000000] KERNEL supported cpus:[ 0.000000] Intel GenuineIntel[ 0.000000] AMD AuthenticAMD[ 0.000000] Hygon HygonGenuine[ 0.000000] Centaur CentaurHauls[ 0.000000] zhaoxin Shanghai[ 0.000000] BIOS-provided physical RAM map:[ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009ffff] usable[ 0.000000] BIOS-e820: [mem 0x00000000000a0000-0x00000000000fffff] reserved[ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x0000000009d01fff] usable[ 0.000000] BIOS-e820: [mem 0x0000000009d02000-0x0000000009ffffff] reserved[ 0.000000] BIOS-e820: [mem 0x000000000a000000-0x000000000a1fffff] usable[ 0.000000] BIOS-e820: [mem 0x000000000a200000-0x000000000a20bfff] ACPI NVS[ 0.000000] BIOS-e820: [mem 0x000000000a20c000-0x00000000b8983fff] usable[ 0.000000] BIOS-e820: [mem 0x00000000b8984000-0x00000000b8acdfff] reserved[ 0.000000] BIOS-e820: [mem 0x00000000b8ace000-0x00000000b8c56fff] ACPI data[ 0.000000] BIOS-e820: [mem 0x00000000b8c57000-0x00000000b9107fff] ACPI NVS[ 0.000000] BIOS-e820: [mem 0x00000000b9108000-0x00000000ba55cfff] reserved[ 0.000000] BIOS-e820: [mem 0x00000000ba55d000-0x00000000bcffffff] usable[ 0.000000] BIOS-e820: [mem 0x00000000bd000000-0x00000000bfffffff] reserved[ 0.000000] BIOS-e820: [mem 0x00000000f8000000-0x00000000fbffffff] reserved...[ 35.916406] input: LogiOps Virtual Input as /devices/virtual/input/input34[ 36.002064] input: LogiOps Virtual Input as /devices/virtual/input/input35[ 63.879806] input: MX Master 3 as /devices/virtual/misc/uhid/0005:046D:B023.0006/input/input36[ 63.879931] logitech-hidpp-device 0005:046D:B023.0006: input,hidraw3: BLUETOOTH HID v0.15 Keyboard [MX Master 3] on 4c:77:cb:1d:66:d0[ 63.902120] logitech-hidpp-device 0005:046D:B023.0006: HID++ 4.5 device connected.[ 69.604899] input: MX Keys Keyboard as /devices/virtual/misc/uhid/0005:046D:B35B.0007/input/input37[ 69.605221] input: MX Keys Mouse as /devices/virtual/misc/uhid/0005:046D:B35B.0007/input/input38[ 69.606204] hid-generic 0005:046D:B35B.0007: input,hidraw4: BLUETOOTH HID v0.13 Keyboard [MX Keys] on 4c:77:cb:1d:66:d0[ 188.285030] input: T9 (AVRCP) as /devices/virtual/input/input40
^C
Informação do hardware
Com lshw podemos ver informações do hardware do nosso computador
InputPython!lshwCopied
AVISO: debería ejecutar este programa como superusuario.wallabotdescripción: Computeranchura: 64 bitscapacidades: smp vsyscall32*-coredescripción: Motherboardid físico: 0*-memorydescripción: Memoria de sistemaid físico: 0tamaño: 32GiB...producto: PnP device PNP0501id físico: 6capacidades: pnpconfiguración: driver=serial*-pnp00:05producto: PnP device PNP0c02id físico: 7capacidades: pnpconfiguración: driver=systemAVISO: la salida puede ser incompleta o imprecisa, debería ejecutar este programa como superusuario.
Cowsay
Existe um comando chamado cowsay ao qual você passa como parâmetro um texto e ele desenha uma vaca dizendo esse texto.
É possível que você não o tenha instalado, portanto, para instalá-lo, você deve inserir o comando
sudo apt install cowsayInputPythonterminal("cowsay MaximoFN")Copied
__________< MaximoFN >----------\ ^__^\ (oo)\_______(__)\ )\/\||----w ||| ||
Se você adicionar a flag -f dragon, quem fala é um dragão.
InputPythonterminal("cowsay -f dragon MaximoFN")Copied
__________< MaximoFN >----------\ / \ //\\ |\___/| / \// \\/0 0 \__ / // | \ \/ / \/_/ // | \ \@_^_@'/ \/_ // | \ \//_^_/ \/_ // | \ \( //) | \/// | \ \( / /) _|_ / ) // | \ _\( // /) '/,_ _ _/ ( ; -. | _ _\.-~ .-~~~^-.(( / / )) ,-{ _ `-.|.-~-. .~ `.(( // / )) '/\ / ~-. _ .-~ .-~^-. \(( /// )) `. { } / \ \(( / )) .----~-.\ \-' .~ \ `. \^-.///.----..> \ _ -~ `. ^-` ^-_///-._ _ _ _ _ _ _}^ - - - - ~ ~-- ,.-~/.-~
InputPythonterminal("cowsay -f dragon-and-cow MaximoFN")Copied
__________< MaximoFN >----------\ ^ /^\ / \ // \\ |\___/| / \// .\\ /O O \__ / // | \ \ *----*/ / \/_/ // | \ \ \ |@___@` \/_ // | \ \ \/\ \0/0/| \/_ // | \ \ \ \0/0/0/0/| \/// | \ \ | |0/0/0/0/0/_|_ / ( // | \ _\ | /0/0/0/0/0/0/`/,_ _ _/ ) ; -. | _ _\.-~ / /,-} _ *-.|.-~-. .~ ~\ \__/ `/\ / ~-. _ .-~ /\____(oo) *. } { /( (--) .----~-.\ \-` .~//__\\ \__ Ack! ///.----..< \ _ -~// \\ ///-._ _ _ _ _ _ _{^ - - - - ~
Limpeza
Como a pasta prueba foi criada, vamos apagá-la para deixar tudo como o encontramos.
InputPython!rm -r pruebaCopied