🌱️ 2023-04-08 - 📝️ Bash
08/04/2023
Notas
Terminal do GIT
$ 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.
VI
vi google.txt
- Setas: para navegação
- i: inclui (na posição atual)
- a: adiciona (na posição posterior)
- Shift+A: adiciona (fim da linha)
- x: remove caracteres (n* x remove *n caracteres)
- dd: remove uma linha (n* dd remove *n linhas)
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
- Processos sendo executados no terminal
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:
Imagem 2:
Imagem 3:
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
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;
fg
ebg
: jogam os processos para foreground e background, respectivamente;[programa] &
: abre o [programa] diretamente em background;pstree
: mostra todos os processos em um gráfico de árvore.
O comando que nos mostra a árvore de processos é opstree
sh
gedit dorme &
# codigo (n no bash)
echo "Vou dormir"
sleep 5
echo "Terminei de dormir"
sh dorme
chmod
chmod +x dorme
./dorme
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.
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.
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:
apt-get install
: instala um programa dado o nomeapt-get remove
: desinstala um programa dado o nomeapt-get update
: busca uma lista das versões atualizadas dos programasapt-cache search
: procura os programas disponíveis para instalaçã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
O -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:
-
Via apt: quando o programa já está disponibilizado na central do Sistema Operacional Linux.
-
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
Vimos até agora duas maneiras de instalar um programa no Linux:
-
Via
apt
: quando o programa já está disponibilizado na central de programas do Ubuntu. -
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
O 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:
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 comandogrep
para filtragem:apt-cache search zlib | grep dev
Agora sim o make
irá 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:
-
./configure
para verificar as dependências e configurações da máquina. -
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. -
sudo make install
para que o programa seja instalado em nossa máquina. Lembrando que osudo
é 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 oftp
.
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:~/
O ~
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.