🌱️ 2023-04-08 - 📝️ Bash

08/04/2023

Notas

Terminal do GIT
Pasted image 20230407191256.png

Pasted image 20230407191711.png

$ pwd
/home/lucas
echo "Bem vindo"
echo "Bem vindo" > bemvindo.txt

echo "REM" > musicas-favoritas.txt
echo "Faithless" >> musicas-favoritas.txt
ls

O comando ls nos retorna o conteúdo do diretório atual. No terminal do Ubuntu, ele separa o tipo do conteúdo (arquivo ou diretório) pela cor.

man ls
cd Desktop
mkdir workspace   %% criar diretorio
rmdir projetos-java   %% deletar diretorio
rm arquivo3.txt      %% remover diretorio

rm -r workspace/

Caracteres coringa

$ cat arquivo*.txt
bem vindo
meu primeiro teste
meu primeiro teste
meu primeiro teste
$ cat *.txt
bem vindo
meu primeiro teste
meu primeiro teste
meu primeiro teste

Copiando, movendo e renomeando

Vamos criar novamente o diretório workspace - para não trabalharmos na raiz do HD:

mkdir workspace
cd workspace/

Vamos colocar uma mensagem em um arquivo qualquer dentro do diretório criado:

echo "bem vindo" > mensagem.txt

Vamos copiar o texto do arquivo que acabamos de criar para um outro de nome "bemvindo.txt" com o comando cp:

cp mensagem.txt bemvindo.txt

O texto agora está nos dois arquivos:

cat bemvindo.txt
bem vindo
cat mensagem.txt
bem vindo

Podemos também mover o arquivo "mensagem.txt" para outro com o comando mv:

mv mensagem.txt bemvindo2.txt

ls
bemvindo2.txt   bemvindo.txt

Perceba que o arquivo mudou de nome.

Criemos agora mais dois diretórios:

mkdir projetos-java
mkdir projetos-php

Queremos mover o arquivo "bemvindo.txt" para dentro do diretório "projetos-java":

mv bemvindo.txt projetos-java/

Se quiséssemos além de movê-lo, mudar seu nome, faríamos, por exemplo:

mv bemvindo.txt projetos-java/bemvindo-novo-nome.txt

Vamos verificar se ele foi realmente movido para o diretório que queríamos:

ls workspace/
bemvindo2.txt   projetos-java   projetos-php

ls projetos-java/
bemvindo.txt

De fato, o arquivo "bemvindo.txt" saiu do workspace e foi para o projetos-java. Vamos copiar "bemvindo2.txt" com o nome "bemvindo.txt" para manter este nos dois diretórios:

cp bemvindo2.txt bemvindo.txt

ls workspace/
bemvindo2.txt   bemvindo.txt   projetos-java   projetos-php

Se quisermos buscar os dois arquivos "bemvindos" dentro do diretório workspace, fazemos:

ls bemvindo*
bemvindo2.txt   bemvindo.txt

Perceba que quando usamos o comando ls para arquivos, o terminal retorna tais arquivos. Se fizermos o mesmo para diretórios, ele retorna o que estiver dentro deles. E, ainda, se fizermos ls *, o terminal retorna:

bemvindo2.txt   bemvindo.txt

projetos-java:
bemvindo.txt

projetos-php:

Ou seja, mostra tanto os diretórios dentro daquele em que estamos trabalhando e seus respectivos arquivos.

Assim como utilizamos o -r para conseguirmos apagar diretórios, do mesmo jeito fazemos para copiá-los, como por exemplo:

cp -r projetos-java projetos-c#

Nesta aula aprendemos a mover, renomear e copiar arquivos e diretórios.



Pasted image 20230408150132.png

Pasted image 20230408152257.png


Pasted image 20230408154352.png

VI

vi google.txt

vi google.txt
:wq  -- salva e sai
:q!  -- sair ignorando alterações

Se quisermos ir para a última linha do texto por exemplo, basta apertarmos Shift + g. Se quisermos pular para a linha n, apertamos o número correspondente e depois Shift + g. Então se, por exemplo, quisermos ir para a linha 5, fazemos 5 e depois Shift + g, para a primeira linha a combinação também é válida: 1 e depois Shift + g, sempre com Shift para que o g seja maiúsculo.

Algo bem comum ligado à navegação de um arquivo é a procura de palavras. Para buscarmos palavras no texto usando o VI, digitamos "/" + o texto que procuramos, algo como:

/California

Se digitarmos isso, o cursor vai para a primeira ocorrência da palavra California. Se apertarmos a tecla n, ele irá para a próxima ocorrência e com Shift + n, podemos voltar para a anterior.

Para conseguir navegar até o fim do arquivo, utilizamos o comando G (Shift + g). Para navegar até o início do arquivo, utilizamos o comando 1G (Shift + g).

Para ir até o início do arquivo, podemos utilizar também o comando gg.

Para ir até o início de uma linha, utilizamos o comando 0 e para ir até o final de uma linha, utilizamos o comando $.

Se quisermos navegar até a linha de número 30, utilizamos o comando 30G (Shift + g). Podemos também utilizar o comando 30gg.

Um recurso muito comum de ser utilizado nas edições de texto são o copiar e colar, os quais veremos como fazer no VI. Para copiarmos uma linha do texto apertamos a tecla y duas vezes e para colar o que foi copiado, basta usar a tecla p.

Também podemos usar a ideia de quantidade de linhas com os números para copiar e colar. Se quisermos copiar a linha atual e mais as duas linhas abaixo podemos fazer 3 e yy - três linhas foram copiadas. O mesmo serve para o comando de colar: 3 e p cola três vezes o conteúdo copiado anteriormente.


← ❝ 2023-04-18 - 🎒 Linux II - programas, processos e pacotes | 2023-04-18

ls + rapido
firefox + cpu
gedit + cpu
mkdir + rápido

ps

ps                       # processos sendo executados no terminal (imagem 1)
ps -e                    # processos do sistema (imagem 2)
ps -ef                   # mostra a localização dos programas, quando foram inicializados e outras infos (img 3)
ps -ef | grep NomeDoPrograma   #  filtragem de dados dada uma entrada

Imagem 1:
Pasted image 20230418164827.png

Imagem 2:
Pasted image 20230418165228.png
Imagem 3:
Pasted image 20230418165548.png

kill

kill 16546      # usando o ID do processo, encerra sozinho

kill -9 16546      # usando o ID, o processo é encerrado imediatamente

$ kill -STOP 11163     # Parar
$ kill -CONT 11163     # Continuar
$ kill -TERM 11269     # Executado por  padrão

$ top                  # mostra o processo por consumo
top -u marta           # Processos de um usuário
$ killall -9 top

Pasted image 20230418165339.png

grep

grep California google.txt

utilizaremos sempre que precisarmos encontrar os processos que queremos encerrar ou obter informações.

jobs: mostra os processos que estão sendo executados dentro do bash;

sh

gedit dorme &

# codigo (n no bash)
echo "Vou dormir"
sleep 5
echo "Terminei de dormir"

sh dorme

Pasted image 20230418195503.png

Pasted image 20230418195621.png

Pasted image 20230418195717.png

chmod

chmod +x dorme

./dorme

Pasted image 20230418195802.png

Pasted image 20230418195816.png

locate e updatedb

locate firefox  # pode nos apresentar dados desatualizados na busca, pois sua base de pesquisa é atualizada apenas de tempos em tempos

$ locate *.txt

$ locate realizabackup
/home/lucas/scripts/realizabackup

sudo updatedb  # para atualizar

sudo mv dorme /usr/bin

which dorme      # descobrir o caminho onde se encontra o arquivo de um comando

Controle de usuários

adduser jose # add user

chmod o-rx jose     # `o` para _others_, ou seja, outros usuários, o `-` indica uma remoção de permissão, o `r` e `x` indicam permissões de leitura e execução

sudo passwd  # senha para o usuario root

su root # logar com root

$ su usuario    # logar com algum usuário
Password:
$ su
Password:
$ sudo adduser jose
Adding user `jose' ...
Adding new group `jose' (1002) ...
Adding new user `jose' (1002) with group `jose' ...
Creating home directory `/home/jose' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for jose
Enter the new value, or press ENTER for the default
    Full Name []:
    Room Number []:
    Work Phone []:
    Home Phone []:
    Other []:
Is the information correct? [Y/n] Y
$ su jose
Password:
$ cd /home/
$ chmod o-rx jose/
$ ls -l
total 28
drwxr-x---  2 jose  jose   4096 Jan 31 06:30 jose
drwx------  2 root  root  16384 Jan 16 17:07 lost+found
drwxr-xr-x 31 lucas lucas  4096 Jan 31 06:11 lucas
d-wx-wx--x  2 nico  nico   4096 Jan 30 16:53 nico

Variáveis de ambiente e PATH

PATH=$PATH:/home/guilherme/workspace

env | grep PATH

gedit .bashrc &

Contagens

$ wc -w *.txt
 6 projetos_java.txt
10 projetos_php.txt
16 total
wc -w *.txt | grep total
$ echo $PS1
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$

uando estamos utilizando o terminal, algumas informações sempre são mostradas, exemplo: lucas@lucas-Inspiron-5458:~$. Essa formatação é definida na variável PS1.

Experimente alterar a variável e perceba que a definição do seu prompt será alterada:

lucas@lucas-Inspiron-5458:~$ PS1="alura>"
alura>
alura>PS1="alura:"
alura:

Instalação de programas: apt

Nesta aula vamos aprender como instalar um programa via Terminal de Linux. Como exemplo, iremos instalar um servidor FTP.

O Ubuntu nos disponibiliza um sistema de gerenciamento de pacotes chamado apt. Para ver as versões atualizadas dos programas que estão disponíveis para instalação fazemos:

sudo apt-get update

Veja que executamos o comando como root (sudo), isto porque esta é uma tarefa de administração, por isso é necessário que seja feita como root, caso não, teremos uma mensagem de permissão negada. Neste passo, o Terminal irá buscar na internet o que existe de novidade nos programas para instalação. Para buscar um programa de servidor FTP podemos fazer:

apt-cache search ftp

Este comando busca na lista de pacotes disponíveis, qualquer programa que se encaixe nesse termo de busca, por isso retorna uma longa lista de programas. Sejamos mais restritos na busca e procuremos um servidor específico:

apt-cache search vsftp

Como estamos usando uma busca mais restrita, poucos resultados serão retornados pela busca, a imagem abaixo ilustra esses resultados.

resultados de busca para vsftp

Achamos um bom servidor FTP, ele nos mostra o nome e uma curta descrição. Para instalar este programa fazemos:

sudo apt-get install vsftpd

E após alguns segundos o programa está instalado! Será mesmo? Para testarmos, podemos tentar conectar ao servidor da própria máquina utilizando o comando:

ftp localhost
$ sudo apt-get install vsftpd
[sudo] password for lucas:

Para realizar um teste, podemos nos conectar na nossa máquina:

$ ftp localhost
Connected to localhost.
220 (vsFTPd 3.0.2)
Name (localhost:lucas):

Será pedido um usuário e senha para podermos acessar a máquina.

conectando via ftp

Depois disso podemos manipular os arquivos via FTP executando quaisquer comandos que já aprendemos até agora, como ls e outros.

Para encerrar a conexão, usamos o comando exit. Experimente conectar com outros usuários disponíveis na maquina também.

Para que possamos remover programas, utilizamos o comando apt-get remove seguido do nome do programa. Como exemplo, vamos desinstalar o servidor que instalamos.

sudo apt-get remove vsftpd

Será pedida uma confirmação e depois a desinstalação seguirá normalmente. Garanta que a desinstalação foi feita com sucesso tentando fazer login via FTP novamente. Caso o programa realmente tenha sido desinstalado, uma mensagem de erro semelhante a seguinte deve ser impressa no Terminal.

ftp: connect: Connection refused

Aprendemos a instalar e desinstalar programas de forma fácil e prática com auxilio do gerenciador de pacotes apt. Os comandos são:

Novos programas com dpkg

Podemos instalar programas que não estão disponibilizados na central de programas do Ubuntu, ou seja, sem o uso do apt. Para isso nós baixamos um pacote desse programa em um site e depois o instalamos. O formato desse pacote é dpkg, que é um arquivo com a extensão .deb.

Vamos instalar novamente o servidor de FTP, porém, usando o pacote .deb. Procuramos na internet e baixamos via navegador o vsftpd no endereço: http://ftp.br.debian.org/debian/pool/main/v/vsftpd/vsftpd_3.0.2-17+deb8u1_i386.deb. Ele estará salvo no diretório de Downloads. Para instalar entramos nesse diretório com o comando cd e utilizando o comando dpkg fazemos:

sudo dpkg -i vsftpd_3.0.2-17+deb8u1_i386.deb

-i indica que estamos instalando o programa. Lembre-se de que o nome do arquivo precisa ser fornecido e que o comando deve ser executado como root por causa de suas permissões. E para desinstalar um programa pelo dpkg? Muito simples, fazemos:

sudo dpkg -r [nome do pacote]

Perceba que para a desinstalação não usamos o nome do arquivo baixado, mas sim o nome do pacote do programa, que neste caso é vsftpd.

sudo dpkg -r vsftpd

Lembre-se de testar a instalação e desinstalação da mesma forma que fizemos na aula passada, efetue login, encerre a conexão, faça login com outros usuários, execute comandos via ftp.

Então vimos duas formas de instalar e desinstalar programas no Linux:

  1. Via apt: quando o programa já está disponibilizado na central do Sistema Operacional Linux.

  2. Via dpkg: quando baixamos pelo navegador da internet um pacote .deb do programa.

$ sudo dpkg -r google-chrome-stable

Uma vez que instalamos um pacote, podemos também remover com o apt-get, passando a opção remove:

$ sudo apt-get remove google-chrome-stable

Para encerrar a execução, fazemos:

sudo /etc/init.d/vsftpd stop

Para inicializa-lo novamente, fazemos:

sudo /etc/init.d/vsftpd start

Instalação a partir do código fonte

Pasted image 20230418210954.png

Vimos até agora duas maneiras de instalar um programa no Linux:

  1. Via apt: quando o programa já está disponibilizado na central de programas do Ubuntu.

  2. Via dpkg: quando baixamos pelo navegador um pacote do programa com a extensão .deb.

Porém, é possível que um programa não esteja disponível em nenhuma das duas formas. Nesse caso vamos ter que baixar seu código fonte, compilá-lo e instalá-lo. Faremos um teste baixando o código fonte de um projeto, o Git, um programa para controle de versão.

Primeiro vamos entrar no site do git-scm em git-scm.com. Na aba Tarballs encontramos as versões compactadas do código fonte do Git. Lá, baixaremos a versão git-1.8.3.1.tar.gz. É importante que seja o tar.gz por que o mesmo mantém as permissões de execução dos arquivos, enquanto um .zip não mantém.

No Terminal, entraremos no diretório de Downloads e descompactamos o arquivo com o comando tar:

tar zxf git-1.8.3.1.tar.gz

Será criado um diretório com nome git-1.8.3.1 com vários scripts que podem ser executados. Entraremos nele para os próximos passos.

O padrão de criação para instalação de um projeto através do código fonte em C* é primeiramente testarmos a configuração da nossa máquina, ou seja, verificar se está faltando algum arquivo ou programa em nossa máquina que o *Git precise para funcionar. Para isso, em geral, é disponibilizado um script chamado "configure". O Git disponibiliza esse script, Vamos executá-lo:

./configure

script configure fará uma série de checagens em nossa máquina, e ao fim, caso nenhum problema seja encontrado, poderemos usar o comando make, que é o padrão para rodar o build do projeto em C*, no caso do *Git. Porém o comando make nos retorna a seguinte mensagem:

zlib not found - não encontrado o zlib

O erro indica que não foi encontrada a biblioteca zlib.h. O script configure não apontou essa falta. Vamos ter que instalá-la manualmente. Seu nome é zlib1g-dev:

sudo apt-get install zlib1g-dev

Neste ponto, estamos informando diretamente o nome da biblioteca ser instalada, mas lembre-se, podemos buscar por seu nome através do apt-cache search zlib e usar o comando grep para filtragem: apt-cache search zlib | grep dev

Agora sim o makeirá funcionar e gerar o Git. O próximo passo é, enfim, instalá-lo na nossa máquina:

sudo make install

Caso não haja nenhum erro, o comando git estará disponível no terminal. Experimente digitar git. Uma listagem de ajuda deverá ser exibida.

Portanto, existem basicamente três passos para instalar um programa a partir de seu código fonte:

  1. ./configure para verificar as dependências e configurações da máquina.

  2. make para gerar o programa, ou seja, compilar. Lembrando que, neste passo, pode haver outras dependências necessárias para a tarefa e por isso talvez seja preciso realizar instalações de outras bibliotecas.

  3. sudo make install para que o programa seja instalado em nossa máquina. Lembrando que o sudo é necessário por causa de questões de permissão.

Estes mesmos passos podem se repetir para determinados programas onde as dependências não estejam disponíveis através de arquivos .deb ou na central de programas.


Acesso remoto

Vamos aprender nesta aula como acessar um servidor remoto no Linux. Para isso, teremos que fazer uma comunicação com o outro servidor. Já vimos o FTP, mas o FTP é para troca de arquivos. O que queremos é nos logar como um usuário. Para isso iremos usar o SSH. O primeiro passo é instalá-lo:

sudo apt-get install ssh

Desta forma instala-se tanto o cliente SSH (ssh-client), quando o servidor (ssh-server). Para testarmos se o programa instalou corretamente, logaremos na nossa própria máquina utilizando o comando ssh, fornecendo o nome de um usuário já criado anteriormente e o ip da máquina.

ssh jose@localhost

Será pedida a senha do usuário jose e logo após, estaremos logados no servidor remoto. Poderemos executar uma série de comandos, porém não temos acesso às ferramentas e programas gráficos. Não podemos, por exemplo, abrir um navegador.

Para termos essa permissão, precisamos nos conectar usando um modificador que permita o uso de ferramentas gráficas. O -X é esse modificador:

ssh -X jose@localhost

Para encerrar a conexão, usamos o comando exit da mesma forma que fizemos quando usamos o ftp.

Lembrando que tudo o que estamos fazendo está sendo executado lá no servidor e não em nossa máquina. Somente o gráfico é mostrado em nossa máquina, as ações são todas remotas.

Agora vamos ver como copiar um arquivo da nossa máquina local para a máquina remota. Fazemos por meio do comando scp, indicando para ele qual é o arquivo e qual é o destino do arquivo:

scp work.zip jose@localhost:/home/jose

/home/jose é a home do usuário jose e pode ser substituído por "~":

scp work.zip jose@localhost:~/

Com isso jogamos o arquivo work.zip no nosso servidor remoto. Se o buscarmos dentro da outra máquina, nos conectando novamente com o ssh e listarmos os arquivos com o comando ls iremos perceber que realmente ele foi copiado.

Caso seja necessária a copia de arquivos de forma recursiva, pode-se utilizar a opção -r assim como era feito com os comandos mv e cp.

Realizando conexão via ssh

Instale o pacote ssh, que instalará tanto um cliente, para que consigamos nos conectar, quanto um servidor, para que possamos receber conexões.

sudo apt-get install ssh

Caso ainda não tenha criado um usuário, você precisará fazer isso agora. Crie um usuário chamado jose.

Se conecte no usuário jose através do ssh. Após realizar a conexão, utilize o comando whoami para garantir que você está logado com outro usuário.

VER OPINIÃO DO INSTRUTOR

Para realizar uma conexão ssh, basta indicar para o comando o nome do usuário e o ip da máquina que desejamos nos conectar. No nosso caso, utilizaremos localhost, pois a conexão será na nossa própria máquina:

$ ssh jose@localhost
jose@localhost's password:

Ao executar o comando whoami, podemos perceber que estamos logados com o usuário jose:

$ whoami
jose

Para desconectar, basta usar o comando exit:

$ exit
logout
Connection to localhost closed.

Transferindo arquivos com scp

Agora nós iremos transferir um arquivo para uma máquina remota utilizando o comando scp.

Você pode escolher um arquivo de sua preferência para transferir. Caso queira, pode transferir o diretório workspace, criado anteriormente, ou o diretório scripts (não se esqueça de utilizar a opção -r caso escolha transferir um diretório). Para transferir um arquivo, vamos compactar um dos diretórios (lembre-se de alterar o nome do diretório caso seja necessário):

$ zip -r work.zip workspace/

Utilize o comando scp para copiar o arquivo para a pasta do usuário jose, que é um usuário de sua máquina. Se logue com o usuário jose e verifique se o arquivo foi copiado.

VER OPINIÃO DO INSTRUTOR

Para realizar a cópia, informamos o nome do arquivo para o comando scp junto com o nome do usuário, ip e local onde copiaremos o arquivo na máquina remota:

$ scp work.zip jose@localhost:~/

~ representa o diretório do usuário, que nesse caso é /home/jose/.

Vamos nos conectar no usuário jose via ssh e verificar se o arquivo work.zip se encontra no diretório do usuário:

$ ssh jose@localhost
jose@localhost's password:

$ whoami
jose

$ ls
examples.desktop  work.zip

Como podemos ver, o arquivo foi copiado.

Lembre-se que o comando scp suporta a opção -r para realizar cópia de diretórios.

Este é o jardim digital de Marta Safaneta, ou EiBarracuda, pessoa não-binária e autista, bacharel em Conservação-Restauração e estudando Divulgação Cientifica. Trabalhando atualmente no Projeto "Tem ciência no museu?", da Rede de Museus UFMG | FAPEMIG.
Saiba mais sobre mim, sobre meu curriculo ou navegue por aí.
2023