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.
Formato do post
Para não ter que estar colocando imagens da console em cada ação que faço, criei a seguinte função que recebe o comando da terminal que queremos executar e retorna a saída que a terminal nos daria.
Às vezes usarei esta função, e outras usarei !
antes de cada comando, o que em notebooks significa que você vai executar um comando da terminal.
import subprocessimport oslast_directory = ''def terminal(command, max_lines_output=None):global last_directorydebug = Falsestr = command.split()# Check if there are " or ' charactersfor i in range(len(str)):if debug: print(f"i = {i}, str[i] = {str[i]}")if len(str[i]) > 0:if str[i][0] == '"' or str[i][0] == "'":for j in range(i+1,len(str)):if debug: print(f" j = {j}, str[j] = {str[j]}")if str[j][-1] == '"' or str[j][-1] == "'":for k in range(i+1,j+1):if debug: print(f" k = {k}, str[i] = {str[i]}, str[k] = {str[k]}")str[i] = str[i] + " " + str[k]if debug: print(f" k = {k}, str[i] = {str[i]}, str[k] = {str[k]}")str[j:] = [""]str[i] = str[i].replace('"','')# Remove empty stringsstr = [x for x in str if x != ""]if debug:print(str)returnif str[0] == "cd":last_dir = os.getcwd()if len(str) == 1:os.chdir('/home/wallabot')else:if str[1] == "-":os.chdir(last_directory)else:os.chdir(str[1])last_directory = last_direlse:result = subprocess.run(str, stdout=subprocess.PIPE).stdout.decode('utf-8')if max_lines_output is not None:result_split = result.split(' ')print(' '.join(result_split[:max_lines_output]))print(" ...")print(' '.join(result_split[-5:]))else:print(result)
Primeiros comandos para se movimentar na terminal
ls
(listar diretório)
O primeiro comando que vamos ver é ls
(listar diretório), que serve para listar todos os arquivos da pasta em que estamos.
terminal("ls")
2021-02-11-Introduccion-a-Python.ipynb2021-04-23-Calculo-matricial-con-Numpy.ipynb2021-06-15-Manejo-de-datos-con-Pandas.ipynb2022-09-12 Introduccion a la terminal.ipynb2022-09-12 Introduccion a la terminal.txtcommand-line-cheat-sheet.pdfCSS.ipynbDocker.htmlDocker.ipynbExpresiones regulares.htmlExpresiones regulares.ipynbhtml_fileshtml.ipynbintroduccion_pythonmovies.csvmovies.datnotebooks_translated__pycache__ssh.ipynbtest.htmltest.ipynb
Os comandos geralmente podem receber opções (flags
), que são introduzidas com o caractere -
, por exemplo vejamos ls -l
que nos retorna a lista de arquivos do diretório em que estamos, mas com mais informações.
terminal('ls -l')
total 4512-rw-rw-r-- 1 wallabot wallabot 285898 nov 12 02:07 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 78450 nov 13 00:10 2021-04-23-Calculo-matricial-con-Numpy.ipynb-rw-rw-r-- 1 wallabot wallabot 484213 nov 13 00:44 2021-06-15-Manejo-de-datos-con-Pandas.ipynb-rw-rw-r-- 1 wallabot wallabot 320810 dic 6 00:11 2022-09-12 Introduccion a la terminal.ipynb-rw-rw-r-- 1 wallabot wallabot 320594 dic 6 00:04 2022-09-12 Introduccion a la terminal.txt-rw-rw-r-- 1 wallabot wallabot 119471 oct 3 16:13 command-line-cheat-sheet.pdf-rw-rw-r-- 1 wallabot wallabot 2660 sep 18 03:32 CSS.ipynb-rw-rw-r-- 1 wallabot wallabot 699225 nov 27 04:16 Docker.html-rw-rw-r-- 1 wallabot wallabot 509125 sep 22 16:48 Docker.ipynb-rw-rw-r-- 1 wallabot wallabot 156193 nov 27 04:21 Expresiones regulares.html-rw-rw-r-- 1 wallabot wallabot 53094 oct 2 04:57 Expresiones regulares.ipynbdrwxrwxr-x 2 wallabot wallabot 4096 nov 28 14:39 html_files-rw-rw-r-- 1 wallabot wallabot 14775 sep 18 03:29 html.ipynbdrwxrwxr-x 3 wallabot wallabot 4096 nov 12 01:51 introduccion_python-rw-rw-r-- 1 wallabot wallabot 446172 oct 2 04:39 movies.csv-rw-rw-r-- 1 wallabot wallabot 522197 oct 2 04:33 movies.datdrwxrwxr-x 2 wallabot wallabot 4096 nov 28 14:39 notebooks_translateddrwxrwxr-x 2 wallabot wallabot 4096 ago 27 03:25 __pycache__-rw-rw-r-- 1 wallabot wallabot 586 dic 4 02:31 ssh.ipynb-rw-rw-r-- 1 wallabot wallabot 292936 nov 9 01:46 test.html-rw-rw-r-- 1 wallabot wallabot 260227 nov 9 01:13 test.ipynb
Como vemos, temos quantos bytes cada arquivo ocupa, mas quando temos arquivos que ocupam muito espaço, isso não é muito fácil de ler, então podemos adicionar a opção h
(human
) que nos dá informações mais fáceis de ler.
terminal('ls -lh')
total 4,5M-rw-rw-r-- 1 wallabot wallabot 280K nov 12 02:07 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 77K nov 13 00:10 2021-04-23-Calculo-matricial-con-Numpy.ipynb-rw-rw-r-- 1 wallabot wallabot 473K nov 13 00:44 2021-06-15-Manejo-de-datos-con-Pandas.ipynb-rw-rw-r-- 1 wallabot wallabot 314K dic 6 00:11 2022-09-12 Introduccion a la terminal.ipynb-rw-rw-r-- 1 wallabot wallabot 314K dic 6 00:04 2022-09-12 Introduccion a la terminal.txt-rw-rw-r-- 1 wallabot wallabot 117K oct 3 16:13 command-line-cheat-sheet.pdf-rw-rw-r-- 1 wallabot wallabot 2,6K sep 18 03:32 CSS.ipynb-rw-rw-r-- 1 wallabot wallabot 683K nov 27 04:16 Docker.html-rw-rw-r-- 1 wallabot wallabot 498K sep 22 16:48 Docker.ipynb-rw-rw-r-- 1 wallabot wallabot 153K nov 27 04:21 Expresiones regulares.html-rw-rw-r-- 1 wallabot wallabot 52K oct 2 04:57 Expresiones regulares.ipynbdrwxrwxr-x 2 wallabot wallabot 4,0K nov 28 14:39 html_files-rw-rw-r-- 1 wallabot wallabot 15K sep 18 03:29 html.ipynbdrwxrwxr-x 3 wallabot wallabot 4,0K nov 12 01:51 introduccion_python-rw-rw-r-- 1 wallabot wallabot 436K oct 2 04:39 movies.csv-rw-rw-r-- 1 wallabot wallabot 510K oct 2 04:33 movies.datdrwxrwxr-x 2 wallabot wallabot 4,0K nov 28 14:39 notebooks_translateddrwxrwxr-x 2 wallabot wallabot 4,0K ago 27 03:25 __pycache__-rw-rw-r-- 1 wallabot wallabot 586 dic 4 02:31 ssh.ipynb-rw-rw-r-- 1 wallabot wallabot 287K nov 9 01:46 test.html-rw-rw-r-- 1 wallabot wallabot 255K nov 9 01:13 test.ipynb
Se quisermos ver os arquivos ocultos, podemos usar a opção a
, que nos mostrará todos os arquivos de um diretório.
terminal('ls -lha')
total 4,5Mdrwxrwxr-x 6 wallabot wallabot 4,0K dic 6 00:04 .drwxrwxr-x 5 wallabot wallabot 4,0K oct 2 03:10 ..-rw-rw-r-- 1 wallabot wallabot 280K nov 12 02:07 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 77K nov 13 00:10 2021-04-23-Calculo-matricial-con-Numpy.ipynb-rw-rw-r-- 1 wallabot wallabot 473K nov 13 00:44 2021-06-15-Manejo-de-datos-con-Pandas.ipynb-rw-rw-r-- 1 wallabot wallabot 314K dic 6 00:11 2022-09-12 Introduccion a la terminal.ipynb-rw-rw-r-- 1 wallabot wallabot 314K dic 6 00:04 2022-09-12 Introduccion a la terminal.txt-rw-rw-r-- 1 wallabot wallabot 117K oct 3 16:13 command-line-cheat-sheet.pdf-rw-rw-r-- 1 wallabot wallabot 2,6K sep 18 03:32 CSS.ipynb-rw-rw-r-- 1 wallabot wallabot 683K nov 27 04:16 Docker.html-rw-rw-r-- 1 wallabot wallabot 498K sep 22 16:48 Docker.ipynb-rw-rw-r-- 1 wallabot wallabot 153K nov 27 04:21 Expresiones regulares.html-rw-rw-r-- 1 wallabot wallabot 52K oct 2 04:57 Expresiones regulares.ipynbdrwxrwxr-x 2 wallabot wallabot 4,0K nov 28 14:39 html_files-rw-rw-r-- 1 wallabot wallabot 15K sep 18 03:29 html.ipynbdrwxrwxr-x 3 wallabot wallabot 4,0K nov 12 01:51 introduccion_python-rw-rw-r-- 1 wallabot wallabot 436K oct 2 04:39 movies.csv-rw-rw-r-- 1 wallabot wallabot 510K oct 2 04:33 movies.datdrwxrwxr-x 2 wallabot wallabot 4,0K nov 28 14:39 notebooks_translateddrwxrwxr-x 2 wallabot wallabot 4,0K ago 27 03:25 __pycache__-rw-rw-r-- 1 wallabot wallabot 586 dic 4 02:31 ssh.ipynb-rw-rw-r-- 1 wallabot wallabot 287K nov 9 01:46 test.html-rw-rw-r-- 1 wallabot wallabot 255K nov 9 01:13 test.ipynb
Se quisermos que ele os organize por tamanho, podemos usar a opção S
terminal('ls -lhS')
total 4,5M-rw-rw-r-- 1 wallabot wallabot 683K nov 27 04:16 Docker.html-rw-rw-r-- 1 wallabot wallabot 510K oct 2 04:33 movies.dat-rw-rw-r-- 1 wallabot wallabot 498K sep 22 16:48 Docker.ipynb-rw-rw-r-- 1 wallabot wallabot 473K nov 13 00:44 2021-06-15-Manejo-de-datos-con-Pandas.ipynb-rw-rw-r-- 1 wallabot wallabot 436K oct 2 04:39 movies.csv-rw-rw-r-- 1 wallabot wallabot 314K dic 6 00:11 2022-09-12 Introduccion a la terminal.ipynb-rw-rw-r-- 1 wallabot wallabot 314K dic 6 00:04 2022-09-12 Introduccion a la terminal.txt-rw-rw-r-- 1 wallabot wallabot 287K nov 9 01:46 test.html-rw-rw-r-- 1 wallabot wallabot 280K nov 12 02:07 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 255K nov 9 01:13 test.ipynb-rw-rw-r-- 1 wallabot wallabot 153K nov 27 04:21 Expresiones regulares.html-rw-rw-r-- 1 wallabot wallabot 117K oct 3 16:13 command-line-cheat-sheet.pdf-rw-rw-r-- 1 wallabot wallabot 77K nov 13 00:10 2021-04-23-Calculo-matricial-con-Numpy.ipynb-rw-rw-r-- 1 wallabot wallabot 52K oct 2 04:57 Expresiones regulares.ipynb-rw-rw-r-- 1 wallabot wallabot 15K sep 18 03:29 html.ipynbdrwxrwxr-x 2 wallabot wallabot 4,0K nov 28 14:39 html_filesdrwxrwxr-x 3 wallabot wallabot 4,0K nov 12 01:51 introduccion_pythondrwxrwxr-x 2 wallabot wallabot 4,0K nov 28 14:39 notebooks_translateddrwxrwxr-x 2 wallabot wallabot 4,0K ago 27 03:25 __pycache__-rw-rw-r-- 1 wallabot wallabot 2,6K sep 18 03:32 CSS.ipynb-rw-rw-r-- 1 wallabot wallabot 586 dic 4 02:31 ssh.ipynb
Se quisermos que nos mostre os arquivos ordenados alfabeticamente, mas ao contrário, devemos usar a opção -r
terminal('ls -lhr')
total 4,5M-rw-rw-r-- 1 wallabot wallabot 255K nov 9 01:13 test.ipynb-rw-rw-r-- 1 wallabot wallabot 287K nov 9 01:46 test.html-rw-rw-r-- 1 wallabot wallabot 586 dic 4 02:31 ssh.ipynbdrwxrwxr-x 2 wallabot wallabot 4,0K ago 27 03:25 __pycache__drwxrwxr-x 2 wallabot wallabot 4,0K nov 28 14:39 notebooks_translated-rw-rw-r-- 1 wallabot wallabot 510K oct 2 04:33 movies.dat-rw-rw-r-- 1 wallabot wallabot 436K oct 2 04:39 movies.csvdrwxrwxr-x 3 wallabot wallabot 4,0K nov 12 01:51 introduccion_python-rw-rw-r-- 1 wallabot wallabot 15K sep 18 03:29 html.ipynbdrwxrwxr-x 2 wallabot wallabot 4,0K nov 28 14:39 html_files-rw-rw-r-- 1 wallabot wallabot 52K oct 2 04:57 Expresiones regulares.ipynb-rw-rw-r-- 1 wallabot wallabot 153K nov 27 04:21 Expresiones regulares.html-rw-rw-r-- 1 wallabot wallabot 498K sep 22 16:48 Docker.ipynb-rw-rw-r-- 1 wallabot wallabot 683K nov 27 04:16 Docker.html-rw-rw-r-- 1 wallabot wallabot 2,6K sep 18 03:32 CSS.ipynb-rw-rw-r-- 1 wallabot wallabot 117K oct 3 16:13 command-line-cheat-sheet.pdf-rw-rw-r-- 1 wallabot wallabot 314K dic 6 00:04 2022-09-12 Introduccion a la terminal.txt-rw-rw-r-- 1 wallabot wallabot 314K dic 6 00:11 2022-09-12 Introduccion a la terminal.ipynb-rw-rw-r-- 1 wallabot wallabot 473K nov 13 00:44 2021-06-15-Manejo-de-datos-con-Pandas.ipynb-rw-rw-r-- 1 wallabot wallabot 77K nov 13 00:10 2021-04-23-Calculo-matricial-con-Numpy.ipynb-rw-rw-r-- 1 wallabot wallabot 280K nov 12 02:07 2021-02-11-Introduccion-a-Python.ipynb
cd
(mudar diretório)
O segundo comando será cd
(change directory) que nos permite mudar de diretório.
terminal('cd /home/wallabot/Documentos/')
Se agora usarmos ls
para ver os arquivos que temos, vemos que eles mudam
terminal('ls')
aprendiendo-git.pdfbalena-etcher-electron-1.7.9-linux-x64camerasIPDocumentaciongstreamergstreamer_oldjetsonNanokaggleLibrosnerfprueba.txtpytorchwallabotweb
Se cd
, em vez de fornecer o diretório para onde queremos ir, fornece o caractere -
, ele voltará ao diretório anterior onde estava.
terminal('cd -')
terminal('ls')
2021-02-11-Introduccion-a-Python.ipynb2021-04-23-Calculo-matricial-con-Numpy.ipynb2021-06-15-Manejo-de-datos-con-Pandas.ipynb2022-09-12 Introduccion a la terminal.ipynb2022-09-12 Introduccion a la terminal.txtcommand-line-cheat-sheet.pdfCSS.ipynbDocker.htmlDocker.ipynbExpresiones regulares.htmlExpresiones regulares.ipynbhtml_fileshtml.ipynbintroduccion_pythonmovies.csvmovies.datnotebooks_translated__pycache__ssh.ipynbtest.htmltest.ipynb
Se quisermos nos mover para a home
, introduzindo apenas cd
no terminal, isso nos levará.
terminal('cd')
pwd
(imprimir diretório de trabalho)
Para obter o diretório em que estamos, podemos usar pwd
(print working directory)
terminal('pwd')
/home/wallabot
Podemos nos mover usando o comando cd
através de caminhos relativos e caminhos absolutos. Por exemplo, vamos nos mover para um diretório usando um caminho absoluto.
terminal('cd /home/wallabot/Documentos/')
terminal('pwd')
/home/wallabot/Documentos
terminal('ls')
aprendiendo-git.pdfbalena-etcher-electron-1.7.9-linux-x64camerasIPDocumentaciongstreamergstreamer_oldjetsonNanokaggleLibrosnerfprueba.txtpytorchwallabotweb
Podemos nos mover usando caminhos relativos se colocarmos apenas o endereço a partir do ponto em que estamos.
terminal('cd web')
terminal('pwd')
/home/wallabot/Documentos/web
Também可以通过相对路径使用 ..
来上移一个目录
(Note: The last sentence is not in Portuguese. Here's the correct translation:)
Também podemos subir um diretório através de caminhos relativos usando ..
terminal('cd ..')
terminal('pwd')
/home/wallabot/Documentos
Se referimos ao diretório em que nos encontramos atualmente se usarmos .
em vez de ..
, ou seja, se colocarmos cd .
não nos moveremos, pois estamos dizendo à terminal para ir ao diretório em que estamos.
terminal('cd .')
terminal('pwd')
/home/wallabot/Documentos
Vamos nos mover para um caminho no qual temos arquivos para demonstrar o próximo comando
terminal('cd web/portafolio/posts/')
terminal('ls')
2021-02-11-Introduccion-a-Python.ipynb2021-04-23-Calculo-matricial-con-Numpy.ipynb2021-06-15-Manejo-de-datos-con-Pandas.ipynb2022-09-12 Introduccion a la terminal.ipynb2022-09-12 Introduccion a la terminal.txtcommand-line-cheat-sheet.pdfCSS.ipynbDocker.htmlDocker.ipynbExpresiones regulares.htmlExpresiones regulares.ipynbhtml_fileshtml.ipynbintroduccion_pythonmovies.csvmovies.datnotebooks_translated__pycache__ssh.ipynbtest.htmltest.ipynb
Informação de arquivos com file

Se eu não souber que tipo de arquivo é um em particular, posso obter uma descrição através do comando file
.
terminal('file 2021-02-11-Introduccion-a-Python.ipynb')
2021-02-11-Introduccion-a-Python.ipynb: UTF-8 Unicode text, with very long lines
Manipulando arquivos e diretórios
Vamos primeiro para a home.
terminal('cd /home/wallabot/Documentos/')
Árvore de diretórios com tree

Podemos ver toda a estrutura da pasta em que estamos através do comando tree
terminal('tree', max_lines_output=20)
.├── aprendiendo-git.pdf├── balena-etcher-electron-1.7.9-linux-x64│ └── balenaEtcher-1.7.9-x64.AppImage├── camerasIP│ ├── camerasIP.py│ ├── camerasIP.sh│ ├── config.py│ ├── __pycache__│ │ ├── config.cpython-38.pyc│ │ └── config.cpython-39.pyc│ └── README.md├── Documentacion│ ├── Curriculum Vitae (5).pdf│ ├── Firma Pris.PNG│ └── Firma.png├── gstreamer│ ├── basic_tutorial_c│ │ ├── basic_tutorial_1_hello_world│ │ │ ├── basic-tutorial-1...├── upload_page.py└── utils.py873 directories, 119679 files
Mas na saída temos muitas linhas, e isso é porque tree
é um comando que mostra todos os arquivos a partir do caminho em que estamos, então é um pouco difícil de ler. No entanto, com a opção L
podemos indicar em quantos níveis queremos que ele profundize.
terminal('tree -L 2')
.├── aprendiendo-git.pdf├── balena-etcher-electron-1.7.9-linux-x64│ └── balenaEtcher-1.7.9-x64.AppImage├── camerasIP│ ├── camerasIP.py│ ├── camerasIP.sh│ ├── config.py│ ├── __pycache__│ └── README.md├── Documentacion│ ├── Curriculum Vitae (5).pdf│ ├── Firma Pris.PNG│ └── Firma.png├── gstreamer│ ├── basic_tutorial_c│ └── README.md├── gstreamer_old│ ├── basic_tutorial_c│ └── basic_tutorial_python├── jetsonNano│ ├── apuntes-Jetson-Nano│ ├── deepstream_apps│ ├── deepstream_nano│ └── Digital zoom├── kaggle│ └── hubmap├── Libros│ └── aprendiendo-git.pdf├── nerf│ └── instant-ngp├── prueba.txt├── pytorch│ └── Curso_Pytorch├── wallabot│ ├── Microfono - Blue Yeti X│ ├── placa base - Asus prime x570-p│ └── Silla - Corsair T3 Rush└── web├── jupyter-to-html├── jupyter-translator├── portafolio└── wordpress_api_rest30 directories, 12 files
Podemos ver que mostra que há 30 diretórios e 12 arquivos, enquanto antes indicava 873 diretórios e 119679 arquivos.
Criar pastas com mkdir
(make directory)
Se quisermos criar um novo diretório, podemos usar o comando mkdir
(make directory) e um nome
terminal("cd /home/wallabot/Documentos/web/portafolio/posts/")
terminal('mkdir prueba')
terminal('ls')
2021-02-11-Introduccion-a-Python.ipynb2021-04-23-Calculo-matricial-con-Numpy.ipynb2021-06-15-Manejo-de-datos-con-Pandas.ipynb2022-09-12 Introduccion a la terminal.ipynb2022-09-12 Introduccion a la terminal.txtcommand-line-cheat-sheet.pdfCSS.ipynbDocker.htmlDocker.ipynbExpresiones regulares.htmlExpresiones regulares.ipynbhtml_fileshtml.ipynbintroduccion_pythonmovies.csvmovies.datnotebooks_translatedprueba__pycache__ssh.ipynbtest.htmltest.ipynb
Se quisermos criar um diretório com espaços no nome, temos que colocar o nome entre aspas.
terminal('mkdir "directorio prueba"')
terminal('ls')
2021-02-11-Introduccion-a-Python.ipynb2021-04-23-Calculo-matricial-con-Numpy.ipynb2021-06-15-Manejo-de-datos-con-Pandas.ipynb2022-09-12 Introduccion a la terminal.ipynb2022-09-12 Introduccion a la terminal.txtcommand-line-cheat-sheet.pdfCSS.ipynbdirectorio pruebaDocker.htmlDocker.ipynbExpresiones regulares.htmlExpresiones regulares.ipynbhtml_fileshtml.ipynbintroduccion_pythonmovies.csvmovies.datnotebooks_translatedprueba__pycache__ssh.ipynbtest.htmltest.ipynb
Vamos a entrar na pasta prueba
que criamos, para continuar vendo a terminar lá.
terminal("cd prueba")
Criar arquivos com touch

Caso quisermos criar um arquivo, o comando que temos que usar é touch
terminal("touch prueba.txt")
terminal("ls")
prueba.txt
Copiar arquivos com cp
(cópia)
Se quisermos copiar um arquivo, fazemos isso usando o comando cp
(cópia).
terminal("cp prueba.txt prueba_copy.txt")
terminal("ls")
prueba_copy.txtprueba.txt
Mover arquivos com mv
(mover)
Se quisermos movê-lo, usamos o comando mv
(move)
terminal("mv prueba.txt ../prueba.txt")
terminal("ls")
prueba_copy.txt
terminal("ls ../")
2021-02-11-Introduccion-a-Python.ipynb2021-04-23-Calculo-matricial-con-Numpy.ipynb2021-06-15-Manejo-de-datos-con-Pandas.ipynb2022-09-12 Introduccion a la terminal.ipynb2022-09-12 Introduccion a la terminal.txtcommand-line-cheat-sheet.pdfCSS.ipynbdirectorio pruebaDocker.htmlDocker.ipynbExpresiones regulares.htmlExpresiones regulares.ipynbhtml_fileshtml.ipynbintroduccion_pythonmovies.csvmovies.datnotebooks_translatedpruebaprueba.txt__pycache__ssh.ipynbtest.htmltest.ipynb
Renomear arquivos com mv
(mover)
O comando mv
também serve para renomear arquivos, pois se o que estamos fazendo é movê-lo no mesmo diretório, mas dando outro nome, isso acaba sendo renomear o arquivo.
terminal("mv prueba_copy.txt prueba_move.txt")
terminal("ls")
prueba_move.txt
Excluir arquivos com rm
(remover)
Para apagar arquivos ou diretórios usamos o comando rm
(remove)
terminal("rm prueba_move.txt")
terminal("ls")
Excluir diretórios com rm -r
(remoção recursiva)
Se quisermos remover um diretório com arquivos dentro, devemos usar a flag -r
.
terminal("cd ..")
terminal('rm -r "directorio prueba"')
terminal("ls")
2021-02-11-Introduccion-a-Python.ipynb2021-04-23-Calculo-matricial-con-Numpy.ipynb2021-06-15-Manejo-de-datos-con-Pandas.ipynb2022-09-12 Introduccion a la terminal.ipynb2022-09-12 Introduccion a la terminal.txtcommand-line-cheat-sheet.pdfCSS.ipynbDocker.htmlDocker.ipynbExpresiones regulares.htmlExpresiones regulares.ipynbhtml_fileshtml.ipynbintroduccion_pythonmovies.csvmovies.datnotebooks_translatedpruebaprueba.txt__pycache__ssh.ipynbtest.htmltest.ipynb
Como você pode ver, ele nunca pergunta se estamos certos, para que ele pergunte é necessário adicionar a flag -i
(interativo
).
terminal("rm -i prueba.txt")
rm: ¿borrar el fichero regular vacío 'prueba.txt'? (s/n) s
Sincronizar arquivos com rsync

Até agora vimos como copiar, mover e excluir arquivos, mas suponha que temos uma pasta e copiamos esses arquivos para outra. Agora suponha que modificamos um arquivo da primeira pasta e queremos que a segunda tenha as alterações. Temos duas opções: copiar todos os arquivos novamente ou fazer uma sincronização através do rsync
.
Primeiro vamos a criar uma nova pasta na qual criemos vários arquivos
!mkdir sourcefolder!touch sourcefolder/file1 sourcefolder/file2 sourcefolder/file3
Agora criamos uma segunda pasta que é a que vamos sincronizar com a primeira
!mkdir syncfolder
!echo "ls sourcefolder:" && ls sourcefolder && echo "ls syncfolder:" && ls syncfolder
ls sourcefolder:file1 file2 file3ls syncfolder:
Sincronizamos as duas pastas com rsync
, da primeira vez apenas copiará os arquivos da primeira pasta para a segunda. Para fazer isso, além disso, devemos adicionar a flag -r
(recursivo).
!rsync -r sourcefolder/ syncfolder/
!echo "ls sourcefolder:" && ls sourcefolder && echo "ls syncfolder:" && ls syncfolder
ls sourcefolder:file1 file2 file3ls syncfolder:file1 file2 file3
Se agora eu criar um novo arquivo em sourcefolder
e sincronizar novamente, apenas esse arquivo será copiado para syncfolder
. Para verificar que apenas um arquivo é copiado, podemos usar a opção -v
(verbose).
!touch sourcefolder/file4
!rsync -r -v sourcefolder/ syncfolder/
sending incremental file listfile1file2file3file4sent 269 bytes received 92 bytes 722.00 bytes/sectotal size is 0 speedup is 0.00
Mas parece que ele copiou todos os arquivos, então para que isso não aconteça e ele copie apenas os que foram modificados, é necessário usar a flag -u
!touch sourcefolder/file5
!rsync -r -v -u sourcefolder/ syncfolder/
sending incremental file listfile5sent 165 bytes received 35 bytes 400.00 bytes/sectotal size is 0 speedup is 0.00
!echo "ls sourcefolder:" && ls sourcefolder && echo "ls syncfolder:" && ls syncfolder
ls sourcefolder:file1 file2 file3 file4 file5ls syncfolder:file1 file2 file3 file4 file5
E o que acontece se eu criar um novo arquivo em syncfolder
?
!touch syncfolder/file6
!rsync -r -v -u sourcefolder/ syncfolder/
sending incremental file listsent 122 bytes received 12 bytes 268.00 bytes/sectotal size is 0 speedup is 0.00
!echo "ls sourcefolder:" && ls sourcefolder && echo "ls syncfolder:" && ls syncfolder
ls sourcefolder:file1 file2 file3 file4 file5ls syncfolder:file1 file2 file3 file4 file5 file6
Não o sincroniza, então é importante ter isso em mente
Alguns flags importantes que devem ser considerados são:
-a
: Este flag é um atalho para várias opções, incluindo-r
(recursivo),-l
(copiar links simbólicos),-p
(manter permissões),-t
(manter a hora de modificação) e-g
(manter grupo). Esta opção é útil para fazer uma cópia exata de um diretório, incluindo todas as suas subpastas e arquivos.-v
: Esta flag ativa a saída detalhada, que mostra os arquivos que estão sendo copiados e o progresso da operação.-r
: Esta flag é usada para copiar de forma recursiva, o que significa que copia todas as subpastas e arquivos dentro de um diretório.-u
: Esta flag é utilizada para copiar apenas os arquivos novos ou modificados. Se um arquivo já existir no destino e for mais recente que o arquivo de origem, ele não será copiado.*-n
: Esta flag é usada para fazer um teste de cópia, o que significa que nenhuma alteração é feita no destino.--exclude
: Esta opção é usada para excluir arquivos ou pastas específicas da operação de cópia. Você pode especificar vários arquivos ou pastas para exclusão usando esta opção várias vezes.-z
: Esta opção é usada para comprimir os dados durante a transferência, o que reduz a largura de banda utilizada e aumenta a velocidade de transferência.-h
: esta flag é usada para mostrar a informação em um formato mais legível, especialmente quando se trabalha com grandes quantidades de dados ou tamanhos de arquivos grandes.
Apagamos as duas pastas criadas
!rm -r sourcefolder syncfolder
Explorando o conteúdo dos arquivos
Para não ter que abrir um arquivo de uma interface gráfica temos várias opções. Vou copiar um arquivo de texto para esta pasta primeiro.
terminal("cd prueba")
terminal("cp ../2021-02-11-Introduccion-a-Python.ipynb .")
terminal("ls")
2021-02-11-Introduccion-a-Python.ipynb
Cabeçalho de arquivos com head

O primeiro comando para poder visualizar dentro de um arquivo de texto é head
, que nos permite ver as primeiras 10 linhas de um arquivo, mas se adicionar o flag -n
você pode indicar o número de linhas.
terminal("head 2021-02-11-Introduccion-a-Python.ipynb")
{"cells": [{"cell_type": "markdown","metadata": {"id": "dsaKCKL0IxZl"},"source": ["# Introducción a Python"]
terminal("head -n 5 2021-02-11-Introduccion-a-Python.ipynb")
{"cells": [{"cell_type": "markdown","metadata": {
Fila de um arquivo com tail

Em caso de querer ver as últimas linhas usamos tail
terminal("tail 2021-02-11-Introduccion-a-Python.ipynb")
},"vscode": {"interpreter": {"hash": "d5745ab6aba164e1152437c779991855725055592b9f2bdb41a4825db7168d26"}}},"nbformat": 4,"nbformat_minor": 0}
terminal("tail -n 5 2021-02-11-Introduccion-a-Python.ipynb")
}},"nbformat": 4,"nbformat_minor": 0}
Se quisermos ver continuamente as últimas linhas de um arquivo, por exemplo, queremos estar monitorizando continuamente um arquivo de LOG para ver eventos, adicionamos a flag -f
, isso fará com que a terminal fique continuamente verificando o arquivo, e cada vez que aparecer uma nova linha nele ela será exibida
Por exemplo, se eu monitorar o log de início de sessão na minha máquina
!tail -f /var/log/auth.log
Dec 1 16:27:22 wallabot gcr-prompter[1457]: Gcr: calling the PromptDone method on /org/gnome/keyring/Prompt/p2@:1.26, and ignoring replyDec 1 16:27:22 wallabot gnome-keyring-daemon[1178]: asked to register item /org/freedesktop/secrets/collection/login/10, but it's already registeredDec 1 16:27:26 wallabot systemd-logind[835]: Watching system buttons on /dev/input/event28 (Logitech Wireless Mouse MX Master 3)Dec 1 16:27:33 wallabot gcr-prompter[1457]: Gcr: 10 second inactivity timeout, quittingDec 1 16:27:33 wallabot gcr-prompter[1457]: Gcr: unregistering prompterDec 1 16:27:33 wallabot gcr-prompter[1457]: Gcr: disposing prompterDec 1 16:27:33 wallabot gcr-prompter[1457]: Gcr: finalizing prompterDec 1 16:27:34 wallabot polkitd(authority=local): Operator of unix-session:1 successfully authenticated as unix-user:wallabot to gain TEMPORARY authorization for action org.debian.apt.install-or-remove-packages for system-bus-name::1.96 [/usr/bin/python3 /usr/bin/update-manager --no-update --no-focus-on-map] (owned by unix-user:wallabot)Dec 1 16:27:42 wallabot systemd-logind[835]: Watching system buttons on /dev/input/event30 (T9-R (AVRCP))Dec 1 16:27:49 wallabot gnome-keyring-daemon[1178]: asked to register item /org/freedesktop/secrets/collection/login/2, but it's already registered
Vemos nas duas últimas linhas meu login quando liguei meu computador hoje.
Agora me conecto por SSH à minha própria máquina
!ssh localhost
wallabot@localhost's password:Welcome to Ubuntu 20.04.5 LTS (GNU/Linux 5.15.0-53-generic x86_64)* Documentation: https://help.ubuntu.com* Management: https://landscape.canonical.com* Support: https://ubuntu.com/advantage1 device has a firmware upgrade available.Run `fwupdmgr get-upgrades` for more information.Se pueden aplicar 0 actualizaciones de forma inmediata.Your Hardware Enablement Stack (HWE) is supported until April 2025.*** System restart required ***Last login: Sun May 8 02:18:09 2022 from 192.168.1.147
No console onde estava monitorando o início de sessão, apareceram duas novas linhas
Dec 1 16:32:23 wallabot sshd[25647]: Accepted password for wallabot from 127.0.0.1 port 54668 ssh2Dec 1 16:32:23 wallabot sshd[25647]: pam_unix(sshd:session): session opened for user wallabot by (uid=0)Dec 1 16:32:23 wallabot systemd-logind[835]: New session 4 of user wallabot.
E quando fecho a sessão SSH, aparecem outras duas linhas novas.
Dec 1 16:33:52 wallabot sshd[25647]: pam_unix(sshd:session): session closed for user wallabotDec 1 16:33:52 wallabot systemd-logind[835]: Session 4 logged out. Waiting for processes to exit.Dec 1 16:33:52 wallabot systemd-logind[835]: Removed session 4.
O visualizador de arquivos mais poderoso: less

Um dos comandos mais poderosos para visualizar o conteúdo dos arquivos é less
terminal("less 2021-02-11-Introduccion-a-Python.ipynb", max_lines_output=20)
{"cells": [{"cell_type": "markdown","metadata": {"id": "dsaKCKL0IxZl"},"source": ["# Introducción a Python"]},{"cell_type": "markdown","metadata": {"id": "Ho_8zgIiI0We"},"source": ["## 1. Resumen"]},...},"nbformat": 4,"nbformat_minor": 0}
Ao estar dentro de um caderno não se pode ver o que realmente acontece ao usar less
, mas quando o utilizamos entramos no documento e podemos navegar através dele usando as teclas ou o mouse.
Se quisermos buscar algo dentro do documento, escrevemos o caractere /
e o que queremos buscar. Para mudar entre as diferentes instâncias encontradas, pressionamos a tecla n
, e se quisermos voltar nas buscas, pressionamos shift+n
.
Para sair, basta pressionar q
O visualizador cat

Não te permite navegar pelo arquivo nem fazer buscas.
terminal("cat 2021-02-11-Introduccion-a-Python.ipynb", max_lines_output=20)
{"cells": [{"cell_type": "markdown","metadata": {"id": "dsaKCKL0IxZl"},"source": ["# Introducción a Python"]},{"cell_type": "markdown","metadata": {"id": "Ho_8zgIiI0We"},"source": ["## 1. Resumen"]},...},"nbformat": 4,"nbformat_minor": 0}
Editor padrão do sistema xdg-open

Se quisermos abri-lo com o editor padrão do arquivo, temos que usar xdg-open
terminal("xdg-open 2021-02-11-Introducción-a-Python.ipynb")
Navegador de arquivos nautilus

Se quisermos abrir a pasta em que estamos, usamos nautilus
terminal("nautilus")
E se quisermos que seja aberto em um caminho específico, incluímos o caminho
terminal("nautilus ~/")
Contador de palavras de um arquivo com wc
(word count)
Por último, um comando muito útil é wc
(word count), que mostra quantas linhas, palavras e bytes um arquivo possui.
terminal("wc 2021-02-11-Introduccion-a-Python.ipynb")
11678 25703 285898 2021-02-11-Introduccion-a-Python.ipynb
Como podemos ver, o arquivo tem 11678 linhas, 25703 palavras e ocupa 285898 bytes
O que é um comando?
Um comando pode ser quatro coisas
- Um programa executável, estes geralmente são salvos no caminho
/usr/bin
- Um comando de shell* Uma função de shell
- Um alias
Para ver a qual classe pertence um comando, usamos type
!type cd
cd is a shell builtin
!type mkdir
mkdir is /usr/bin/mkdir
!type ls
ls is /usr/bin/ls
O que é um alias?
Um alias é um comando que definimos nós mesmos, este se define através do comando alias
. Por exemplo, vamos criar o alias l
que fará ls -h
!alias l='ls -l'
Quando executamos l
nos mostra o resultado de ls -h
!l
2021-02-11-Introducción-a-Python.ipynb
Mas isso tem o problema de que quando fecharmos o terminal, o alias
desaparece. Mais tarde aprenderemos a criar alias
permanentes.
Ajuda dos comandos
Ajuda com help

Com muitos comandos da shell, podemos obter sua ajuda por meio do comando help
!help cd
cd: cd [-L|[-P [-e]]] [dir]Modifica el directorio de trabajo del shell.Modifica el directorio actual a DIR. DIR por defecto es el valor de lavariable de shell HOME.La variable CDPATH define la ruta de búsqueda para el directorio quecontiene DIR. Los nombres alternativos de directorio en CDPATH seseparan con dos puntos (:). Un nombre de directorio nulo es igual queel directorio actual. Si DIR comienza con una barra inclinada (/),entonces no se usa CDPATH.Si no se encuentra el directorio, y la opción del shell "cdable_vars"está activa, entonces se trata la palabra como un nombre de variable.Si esa variable tiene un valor, se utiliza su valor para DIR.Opciones:-L fuerza a seguir los enlaces simbólicos: resuelve los enlacessimbólicos en DIR después de procesar las instancias de ".."-P usa la estructura física de directorios sin seguir los enlacessimbólicos: resuelve los enlaces simbólicos en DIR antes de procesarlas instancias de ".."-e si se da la opción -P y el directorio actual de trabajo no sepuede determinar con éxito, termina con un estado diferente de cero.La acción por defecto es seguir los enlaces simbólicos, como si seespecificara "-L".".." se procesa quitando la componente del nombre de la ruta inmediatamenteanterior hasta una barra inclinada o el comienzo de DIR.Estado de Salida:Devuelve 0 si se cambia el directorio, y si $PWD está definido comocorrecto cuando se emplee -P; de otra forma es diferente a cero.
Manual com man

Outro comando é man
, que se refere ao manual do usuário.
terminal("man ls", max_lines_output=20)
LS(1) User Commands LS(1)NAMEls - list directory contentsSYNOPSISls [OPTION]... [FILE]...DESCRIPTIONList information about the FILEs (the current directory by default).Sort entries alphabetically if none of -cftuvSUX nor --sort is speci‐fied.Mandatory arguments to long options are mandatory for short optionstoo.-a, --alldo not ignore entries starting with .-A, --almost-all...Full documentation at: <https://www.gnu.org/software/coreutils/ls>or available locally via: info '(coreutils) ls invocation'GNU coreutils 8.30 September 2019 LS(1)
Para sair, pressione q
, pois man
utiliza o less
como visualizador do manual
Informação com info

Outro comando é info
terminal("info ls", max_lines_output=20)
File: coreutils.info, Node: ls invocation, Next: dir invocation, Up: Directory listing10.1 ‘ls’: List directory contents==================================The ‘ls’ program lists information about files (of any type, includingdirectories). Options and file arguments can be intermixed arbitrarily,as usual.For non-option command-line arguments that are directories, bydefault ‘ls’ lists the contents of directories, not recursively, andomitting files with names beginning with ‘.’. For other non-optionarguments, by default ‘ls’ lists just the file name. If no non-optionargument is specified, ‘ls’ operates on the current directory, acting asif it had been invoked with a single argument of ‘.’.By default, the output is sorted alphabetically, according to thelocale settings in effect.(1) If standard output is a terminal, theoutput is in columns (sorted vertically) and control characters areoutput as question marks; otherwise, the output is listed one per line...‘--show-control-chars’Print nongraphic characters as-is in file names. This is thedefault unless the output is a terminal and the program is ‘ls’.
Para sair, pressione q
, pois info
utiliza o less
como visualizador de informações
Informação de um comando com whatis

Outro comando é whatis
terminal("whatis ls")
ls (1) - list directory contents
Comodines
As wildcards são caracteres especiais que nos servem para realizar buscas especiais. Por exemplo, se quero buscar todos os arquivos que terminem em .txt
. Vamos criar alguns arquivos para vê-las.
terminal("touch file.txt dot.txt dot2.txt index.html datos1 datos123 Abc")
terminal("ls")
2021-02-11-Introduccion-a-Python.ipynbAbcdatos1datos123dot2.txtdot.txtfile.txtindex.html
Todos os caracteres *

Vamos a buscar agora todos os arquivos .txt
!ls *.txt
dot2.txt dot.txt file.txt
Vamos agora procurar todos os que começam com a palavra dados
!ls datos*
datos1 datos123
Números ?

Mas o que acontece se realmente o que queremos é que nos mostre todos os arquivos que comecem pela palavra dados
mas seguidos apenas de um número, temos que colocar um sinal de interrogação ?
!ls datos?
datos1
Se quisermos que tenha três números, então temos que colocar três sinais de interrogação ???
!ls datos???
datos123
Maiúsculas [[:upper:]]

Se quisermos que ele procure os arquivos que comecem com letras maiúsculas
!ls [[:upper:]]*
Abc
minúsculas [[:lower:]]

Para os arquivos que começarem com letras minúsculas.
!ls [[:lower:]]*
datos1 datos123 dot2.txt dot.txt file.txt index.html
Classes
Através do uso de colchetes podemos criar classes, assim se quisermos procurar os arquivos que comecem pelas letras d
ou f
seguidos de qualquer caractere
!ls [df]*
datos1 datos123 dot2.txt dot.txt file.txt
Redireções: como funciona a shell
Um comando funciona da seguinte maneira

Tem um standard input
, que por padrão é o texto que introduzimos pelo teclado, um standard output
, que por padrão é o texto que sai pela console e um standard error
que também é, por padrão, um texto que sai pela console, mas que tem outro formato.
Redirecionamento do standard output

Mas com o caractere >
, podemos modificar o standard output
de um comando. Por exemplo, se quisermos listar com ls
os arquivos da pasta em que estamos, mas não quisermos que o resultado seja impresso na tela, e sim que seja salvo em um arquivo, faríamos o seguinte ls > lista.txt
, isso escreve a lista em lista.txt
. Além disso, se lista.txt
não existir, ele é criado.
!ls > lista.txt
Vemos que você criou o arquivo e vemos o que há dentro
terminal("ls")
2021-02-11-Introduccion-a-Python.ipynbAbcdatos1datos123dot2.txtdot.txtfile.txtindex.htmllista.txt
terminal("cat lista.txt")
2021-02-11-Introduccion-a-Python.ipynbAbcdatos1datos123dot2.txtdot.txtfile.txtindex.htmllista.txt
Vemos que dentro de lista.txt
aparece lista.txt
, isso é porque primeiro cria o arquivo e depois executa o comando
Fazemos o mesmo, mas com a pasta pai
!ls ../ > lista.txt
Se voltarmos a ver dentro de lista.txt
terminal("cat lista.txt")
2021-02-11-Introduccion-a-Python.ipynb2021-04-23-Calculo-matricial-con-Numpy.ipynb2021-06-15-Manejo-de-datos-con-Pandas.ipynb2022-09-12 Introduccion a la terminal.ipynb2022-09-12 Introduccion a la terminal.txtcommand-line-cheat-sheet.pdfCSS.ipynbDocker.htmlDocker.ipynbExpresiones regulares.htmlExpresiones regulares.ipynbhtml_fileshtml.ipynbintroduccion_pythonmovies.csvmovies.datnotebooks_translatedprueba__pycache__ssh.ipynbtest.htmltest.ipynb
Vemos que o conteúdo é sobrescrito
Se quisermos que o conteúdo seja concatenado, devemos usar >>
!ls > lista.txt
!ls ../ >> lista.txt
terminal("cat lista.txt")
2021-02-11-Introduccion-a-Python.ipynbAbcdatos1datos123dot2.txtdot.txtfile.txtindex.htmllista.txt2021-02-11-Introduccion-a-Python.ipynb2021-04-23-Calculo-matricial-con-Numpy.ipynb2021-06-15-Manejo-de-datos-con-Pandas.ipynb2022-09-12 Introduccion a la terminal.ipynb2022-09-12 Introduccion a la terminal.txtcommand-line-cheat-sheet.pdfCSS.ipynbDocker.htmlDocker.ipynbExpresiones regulares.htmlExpresiones regulares.ipynbhtml_fileshtml.ipynbintroduccion_pythonmovies.csvmovies.datnotebooks_translatedprueba__pycache__ssh.ipynbtest.htmltest.ipynb
Agora sim, as informações foram concatenadas.
Isso é muito útil para criar arquivos de logs
Redirecionamento do standard error

Se realizarmos uma operação incorreta, obtemos um erro. Vamos ver o que acontece ao redirecionar um comando que dá um erro.
!ls fjhdsalkfs > lista.txt
ls: no se puede acceder a 'fjhdsalkfs': No existe el archivo o el directorio
Como vemos, deu um erro, mas se agora olharmos dentro de lista.txt
terminal("cat lista.txt")
Vemos que o arquivo está vazio, isso é porque não redirecionamos o standard error
para lista.txt
, mas sim o standard output
. Como vimos na imagem, há dois padrões de saída em um comando, o primeiro é o standard output
e o segundo é o standard error
, por isso, para redirecionar o standard error, é necessário indicá-lo através de 2>
. Vamos fazer agora assim
!ls kjhsfskjd 2> lista.txt
terminal("cat lista.txt")
ls: no se puede acceder a 'kjhsfskjd': No existe el archivo o el directorio
Como vemos, agora sim foi redirecionado.
Redirecionamento do standard output
e do standard error

Se quisermos redirecionar os dois, usamos o seguinte
!ls kjhsfskjd > lista.txt 2>&1
Vamos ver dentro de lista.txt
terminal("cat lista.txt")
ls: no se puede acceder a 'kjhsfskjd': No existe el archivo o el directorio
Se agora executarmos um comando sem erros
!ls . >> lista.txt 2>&1
Vamos ver dentro de lista.txt
(**cuidado**, agora foram concatenados)
terminal("cat lista.txt")
ls: no se puede acceder a 'kjhsfskjd': No existe el archivo o el directorio2021-02-11-Introduccion-a-Python.ipynbAbcdatos1datos123dot2.txtdot.txtfile.txtindex.htmllista.txt
Como pode ser visto, tanto o standard error
quanto o standard output
foram redirecionados para o mesmo arquivo.
Pipelines
Podemos criar pipelines fazendo com que o standard output
de um comando se torne o standard input
de outro. Por exemplo, vamos fazer com que a saída de ls -lha
seja a entrada de grep
, que veremos mais adiante, mas é um comando para buscar.
!ls -lha | grep -i "txt"
-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt
Como podemos ver, o que fizemos foi levar a saída de ls
para grep
, com o qual buscamos algum arquivo com txt
no nome.
Operadores de controle - encadeamento de comandos
Comandos de maneira sequencial
Uma forma de encadear comandos de forma sequencial é separá-los por meio de ;
. Isso cria diferentes threads para cada tarefa.
!ls; echo 'Hola'; cal
2021-02-11-Introduccion-a-Python.ipynb datos123 file.txtAbc dot2.txt index.htmldatos1 dot.txt lista.txtHolaDiciembre 2022do lu ma mi ju vi sá1 2 34 5 6 7 8 9 1011 12 13 14 15 16 1718 19 20 21 22 23 2425 26 27 28 29 30 31
Como podemos ver, primeiro foi executado o comando ls
, depois foi impresso Olá graças ao comando echo "Olá"
e por fim foi impresso um calendário graças ao comando cal
Vamos agora fazer outro exemplo para ver que eles são executados de maneira sequencial.
!echo "Before touch;"; ls -lha; touch secuential.txt; echo "After touch:"; ls -lha
Before touch;total 292Kdrwxrwxr-x 2 wallabot wallabot 4,0K dic 6 01:04 .drwxrwxr-x 7 wallabot wallabot 4,0K dic 6 00:24 ..-rw-rw-r-- 1 wallabot wallabot 280K dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txtAfter touch:total 292Kdrwxrwxr-x 2 wallabot wallabot 4,0K dic 6 01:07 .drwxrwxr-x 7 wallabot wallabot 4,0K dic 6 00:24 ..-rw-rw-r-- 1 wallabot wallabot 280K dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 01:07 secuential.txt
Como pode ser visto, no primeiro ls
não aparece secuential.txt
, enquanto no segundo sim. Isso significa que os comandos foram executados em ordem, um após o outro.
Comandos de maneira paralela
Se quisermos que os comandos sejam executados em paralelo, temos que usar o operador &
. Isso fará com que seja criado um novo processo para cada comando.
Vamos ver o exemplo de antes
!rm secuential.txt
!echo "Before touch;" & ls -lha & touch secuential.txt & echo "After touch:" & ls -lha
Before touch;After touch:total 292Kdrwxrwxr-x 2 wallabot wallabot 4,0K dic 6 01:08 .drwxrwxr-x 7 wallabot wallabot 4,0K dic 6 00:24 ..-rw-rw-r-- 1 wallabot wallabot 280K dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 01:08 secuential.txt
Agora pode-se ver que não foram executados sequencialmente, já que primeiro foram executados os echo
s, que serão os que menos demorarão, e depois o resto.
Comandos de forma condicional
E
Utilizando o operador &&
, um comando será executado quando o anterior tiver sido executado com sucesso
!rm secuential.txt
!echo "Before touch;" && ls -lha && touch secuential.txt && echo "After touch:" && ls -lha
Before touch;total 292Kdrwxrwxr-x 2 wallabot wallabot 4,0K dic 6 01:08 .drwxrwxr-x 7 wallabot wallabot 4,0K dic 6 00:24 ..-rw-rw-r-- 1 wallabot wallabot 280K dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txtAfter touch:total 292Kdrwxrwxr-x 2 wallabot wallabot 4,0K dic 6 01:08 .drwxrwxr-x 7 wallabot wallabot 4,0K dic 6 00:24 ..-rw-rw-r-- 1 wallabot wallabot 280K dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 01:08 secuential.txt
Aqui podemos ver como foram executados um após o outro, ou seja, um comando não começa até que o anterior termine.
Mas então, qual é a diferença entre ;
e &&
?
No primeiro, o sequencial ;
, primeiro é executado um comando e depois outro, mas para que seja executado um comando não importa se o anterior foi executado com sucesso.
!rm prueba ; ls -lha
rm: no se puede borrar 'prueba': No existe el archivo o el directoriototal 292Kdrwxrwxr-x 2 wallabot wallabot 4,0K dic 6 01:08 .drwxrwxr-x 7 wallabot wallabot 4,0K dic 6 00:24 ..-rw-rw-r-- 1 wallabot wallabot 280K dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 01:08 secuential.txt
Como se pode ver, primeiro é executado rm prova
, dá um erro e ainda assim é executado ls -lha prova
Na forma condicional &&
, se um comando não for executado satisfatoriamente, o seguinte não será executado.
!rm prueba && ls -lha
rm: no se puede borrar 'prueba': No existe el archivo o el directorio
Como se pode ver ls -lha prova
não é executado porque rm prova
deu um erro
Ou
Diferente do &&
, o 'ou' executará todos os processos, independente do seu resultado. Deve-se utilizar o operador ||
.
!rm prueba || ls -lha
rm: no se puede borrar 'prueba': No existe el archivo o el directoriototal 292Kdrwxrwxr-x 2 wallabot wallabot 4,0K dic 6 01:08 .drwxrwxr-x 7 wallabot wallabot 4,0K dic 6 00:24 ..-rw-rw-r-- 1 wallabot wallabot 280K dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 01:08 secuential.txt
A diferença entre este e ;
é que o ||
(ou) não cria um novo thread para cada comando
Como são gerenciadas as permissões
Quando se listam os arquivos de um diretório com a bandeira -l
(longa), aparecem alguns símbolos ao lado de cada arquivo.
!mkdir subdirectorio
!ls -l
total 288-rw-rw-r-- 1 wallabot wallabot 285898 dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 01:08 secuential.txtdrwxrwxr-x 2 wallabot wallabot 4096 dic 6 01:10 subdirectorio
Isso nos dá informações sobre cada arquivo
Primeiro vamos ver quais tipos de arquivos existem
- -: Arquivo normal
- d: Diretório* l: Link simbólico
- b: Arquivo de bloco especial. São arquivos que manipulam a informação dos blocos de dados, como, por exemplo, um USB
Depois veremos os tipos de modo:
Proprietário | Grupo | Mundo | ||||||
---|---|---|---|---|---|---|---|---|
rwx | r-x | r-x | ||||||
1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 |
7 | 5 | 5 |
- r: ler
- w: escrever
- x: executar
Modo simbólico:
- u: Apenas para o usuário
- g: Apenas para o grupo* o: Apenas para outros (world)
- a: Para todos
Modificando as permissões no terminal
Criamos um novo arquivo
terminal("cd subdirectorio")
!echo "hola mundo" > mitexto.txt
!cat mitexto.txt
hola mundo
Vamos ver as permissões que ele tem.
!ls -l
total 4-rw-rw-r-- 1 wallabot wallabot 11 dic 6 01:10 mitexto.txt
Como vemos, tem permissões de leitura e escrita para o meu usuário e o grupo, e apenas permissões de leitura para os demais (world)
Mudança de permissões com chmod
(mudar modo)
Para alterar as permissões de um arquivo usamos o comando chmod
(mudar modo), onde temos que colocar em octal as permissões do usuário, depois as do grupo e por último as dos demais.
!chmod 755 mitexto.txt
!ls -l
total 4-rwxr-xr-x 1 wallabot wallabot 11 dic 6 01:10 mitexto.txt
Vemos que agora meu usuário tem permissões de leitura, escrita e execução, enquanto o grupo e o resto do mundo têm permissões de leitura e execução.
Vamos a remover as permissões de leitura apenas do meu usuário. Para alterar apenas as permissões de um usuário, usamos o identificador simbólico, um +
se quisermos adicionar permissões ou um -
se quisermos removê-las ou um =
se quisermos restaurá-las, seguido do tipo de permissão.
!chmod u-r mitexto.txt
!ls -l
total 4--wxr-xr-x 1 wallabot wallabot 11 dic 6 01:10 mitexto.txt
!cat mitexto.txt
cat: mitexto.txt: Permiso denegado
Como vemos, ao remover as permissões de leitura para o meu usuário, não conseguimos ler o arquivo.
Voltemos a colocar a permissão de leitura
!chmod u+r mitexto.txt
!ls -l
total 4-rwxr-xr-x 1 wallabot wallabot 11 dic 6 01:10 mitexto.txt
!cat mitexto.txt
hola mundo
Se quisermos adicionar ou remover permissões para mais de um usuário, fazemos isso separando cada permissão por uma ,
!chmod u-x,go=w mitexto.txt
!ls -l
total 4-rw--w--w- 1 wallabot wallabot 11 dic 6 01:10 mitexto.txt
Como pode ser visto, a permissão de execução foi removida do usuário e foi definida a permissão de apenas escrita para o grupo e o resto do mundo.
Identificação do usuário com whoami

Para saber quem somos podemos usar o comando whoami
(who am I)
!whoami
wallabot
Informação do usuário com id

Outra maneira, que também fornece mais informações, é o comando id
!id
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)
Este comando nos diz que nosso ID de usuário é o 1000, o ID de grupo é o 1000 e que pertencemos aos grupos wallabot, adm, cdrom, sudo, dip, plugdev, lpadmin, lxd, sambashare e docker
Mudança de usuário com o comando su
(switch user)
Se quisermos mudar de usuário, usamos o comando su
(switch user). Para determinados usuários, é necessário usar sudo
(superuser do).
!sudo su root
root@wallabot:/home/wallabot/Documentos/web/portafolio/posts/prueba/subdirectorio#
Como vemos, muda o prompt
e agora indica que somos o usuário root
Vamos à pasta home
!cd
root@wallabot:~#
Mas em Linux há uma pasta home para cada usuário, isso podemos verificar se executarmos o comando pwd
!pwd
/root
Vou criar um arquivo na pasta onde criei o arquivo *mitexto.txt* anteriormente.
!touch /home/wallabot/Documentos/web/portafolio/posts/prueba/subdirectorio/rootfile.txt
Volto a mudar para o meu usuário
!su wallabot
wallabot@wallabot:
E vou para o diretório onde estão os arquivos que criei.
!cd /home/wallabot/Documentos/web/portafolio/posts/prueba/subdirectorio
Vemos os arquivos que há e suas permissões
!ls -l
total 4-rw--w--w- 1 wallabot wallabot 11 dic 6 01:10 mitexto.txt-rw-r--r-- 1 root root 0 dic 6 01:22 rootfile.txt
Como vemos, o usuário e o grupo do arquivo *rootfile.txt* é o usuário root
Sim, agora que sou o usuário *wallabot*, tento apagar o arquivo rootfile.txt
!rm rootfile.txt
rm: ¿borrar el fichero regular vacío 'rootfile.txt' protegido contra escritura? (s/n)
Como vemos, nos pergunta se queremos deletá-lo, já que pertence a outro usuário.
Modificar a senha de um usuário
Se quero modificar a senha do usuário que tenho ativo atualmente, uso o comando passwd
(senha).
Primeiro verifico qual usuário sou
!whoami
wallabot
E agora tentamos mudar a senha
!passwd
$ passwdCambiando la contraseña de wallabot.Contraseña actual de :Nueva contraseña:Vuelva a escribir la nueva contraseña
Como vemos, pede a senha atual para poder alterá-la
Links simbólicos
Podemos criar links simbólicos para um caminho específico através do comando ln
(link) seguido da flag -s
(symbolic), o diretório e o nome do link
!ln -s /home/wallabot/Documentos/web web
Se agora listarmos os arquivos
!ls -l
total 4-rw--w--w- 1 wallabot wallabot 11 dic 6 01:10 mitexto.txt-rw-r--r-- 1 root root 0 dic 6 01:22 rootfile.txtlrwxrwxrwx 1 wallabot wallabot 29 dic 6 01:28 web -> /home/wallabot/Documentos/web
Vemos o link simbólico web
que aponta para /home/wallabot/Documentos/web:
Agora eu posso ir para web
terminal("cd web")
!pwd
/home/wallabot/Documentos/web
Configurar as variáveis de ambiente
Ver as variáveis de ambiente com printenv

Com o comando printenv
podemos ver todas as variáveis de ambiente
!printenv
GJS_DEBUG_TOPICS=JS ERROR;JS LOGVSCODE_CWD=/home/wallabotLESSOPEN=| /usr/bin/lesspipe %sCONDA_PROMPT_MODIFIER=(base)PYTHONIOENCODING=utf-8USER=wallabotVSCODE_NLS_CONFIG={"locale":"es","availableLanguages":{"*":"es"},"_languagePackId":"b07c40c9acb9e1d7b3ca14b06f814803.es","_translationsConfigFile":"/home/wallabot/.config/Code/clp/b07c40c9acb9e1d7b3ca14b06f814803.es/tcf.json","_cacheRoot":"/home/wallabot/.config/Code/clp/b07c40c9acb9e1d7b3ca14b06f814803.es","_resolvedLanguagePackCoreLocation":"/home/wallabot/.config/Code/clp/b07c40c9acb9e1d7b3ca14b06f814803.es/6261075646f055b99068d3688932416f2346dd3b","_corruptedFile":"/home/wallabot/.config/Code/clp/b07c40c9acb9e1d7b3ca14b06f814803.es/corrupted.info","_languagePackSupport":true}VSCODE_HANDLES_UNCAUGHT_ERRORS=trueMPLBACKEND=module://ipykernel.pylab.backend_inlineSSH_AGENT_PID=1373XDG_SESSION_TYPE=x11SHLVL=0HOME=/home/wallabotCHROME_DESKTOP=code-url-handler.desktopCONDA_SHLVL=1DESKTOP_SESSION=ubuntuGIO_LAUNCHED_DESKTOP_FILE=/usr/share/applications/code.desktopVSCODE_IPC_HOOK=/run/user/1000/vscode-26527400-1.73.1-main.sockPYTHONUNBUFFERED=1GTK_MODULES=gail:atk-bridgeGNOME_SHELL_SESSION_MODE=ubuntuAPPLICATION_INSIGHTS_NO_DIAGNOSTIC_CHANNEL=truePAGER=catMANAGERPID=1153DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/busGIO_LAUNCHED_DESKTOP_FILE_PID=3897_CE_M=IM_CONFIG_PHASE=1LOGNAME=wallabot_=/home/wallabot/anaconda3/bin/pythonJOURNAL_STREAM=8:52662XDG_SESSION_CLASS=userUSERNAME=wallabotTERM=xterm-colorGNOME_DESKTOP_SESSION_ID=this-is-deprecated_CE_CONDA=WINDOWPATH=2PATH=/home/wallabot/anaconda3/bin:/home/wallabot/anaconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/binSESSION_MANAGER=local/wallabot:@/tmp/.ICE-unix/1410,unix/wallabot:/tmp/.ICE-unix/1410INVOCATION_ID=73bba2d15f2e492fa6c16538996a2556VSCODE_AMD_ENTRYPOINT=vs/workbench/api/node/extensionHostProcessXDG_RUNTIME_DIR=/run/user/1000XDG_MENU_PREFIX=gnome-GDK_BACKEND=x11DISPLAY=:0LANG=es_ES.UTF-8XDG_CURRENT_DESKTOP=UnityXAUTHORITY=/run/user/1000/gdm/XauthorityXDG_SESSION_DESKTOP=ubuntuXMODIFIERS=@im=ibusLS_COLORS=SSH_AUTH_SOCK=/run/user/1000/keyring/sshORIGINAL_XDG_CURRENT_DESKTOP=ubuntu:GNOMECONDA_PYTHON_EXE=/home/wallabot/anaconda3/bin/pythonSHELL=/bin/bashELECTRON_RUN_AS_NODE=1QT_ACCESSIBILITY=1GDMSESSION=ubuntuLESSCLOSE=/usr/bin/lesspipe %s %sCONDA_DEFAULT_ENV=basePYDEVD_IPYTHON_COMPATIBLE_DEBUGGING=1GPG_AGENT_INFO=/run/user/1000/gnupg/S.gpg-agent:0:1GJS_DEBUG_OUTPUT=stderrQT_IM_MODULE=ibusGIT_PAGER=catPWD=/home/wallabot/Documentos/webCLICOLOR=1XDG_DATA_DIRS=/usr/share/ubuntu:/usr/local/share/:/usr/share/:/var/lib/snapd/desktopXDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdgVSCODE_CODE_CACHE_PATH=/home/wallabot/.config/Code/CachedData/6261075646f055b99068d3688932416f2346dd3bCONDA_EXE=/home/wallabot/anaconda3/bin/condaCONDA_PREFIX=/home/wallabot/anaconda3VSCODE_PID=3897
Ver uma variável de ambiente com o comando echo

Para ver uma variável de ambiente específica, podemos fazer isso usando o comando echo
seguido do símbolo $
e o nome da variável.
!echo $HOME
/home/wallabot
Modificar uma variável de ambiente para uma sessão de terminal
Podemos modificar uma variável de ambiente para a sessão ativa do terminal, por exemplo, vamos adicionar um novo caminho à variável PATH
. Primeiro vemos o que há nela
!echo $PATH
/home/wallabot/anaconda3/bin:/home/wallabot/anaconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Agora adicionamos um novo diretório
!PATH=$PATH:"subdirectorio
Voltamos a ver o que há dentro de PATH
!echo $PATH
/home/wallabot/anaconda3/bin:/home/wallabot/anaconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:subdirectorio
Vemos que foi adicionado o diretório subdiretório
.
O problema deste método é que quando abrirmos uma nova terminal não se manterá esta mudança em PATH
Modificar uma variável de ambiente para todas as sessões de terminal
Vamos para a pasta home
terminal("cd /home/wallabot")
Aqui, na pasta home, listamos todos os arquivos com a opção -a
(all)
!ls -a
. .eclipse .pki.. Escritorio Plantillas.afirma .gitconfig .platformioanaconda3 .gnupg .profile.audacity-data Imágenes .psensor.bash_history .ipython Público.bash_logout .java .python_history.bashrc .jupyter snap.cache .lesshst .ssh.conda Lightworks .sudo_as_admin_successful.config .Lightworks.thereCanBeOnlyOne .thunderbird.cortex-debug .local Vídeos.cyberghost logiops .vnc.dbus .MCTranscodingSDK .vscodeDescargas .mozilla .wget-hsts.docker MúsicaDocumentos .nv
Vemos que há um arquivo chamado .bashrc
, esse arquivo é o que tem a configuração do nosso bash
terminal("cat .bashrc", max_lines_output=3)
# ~/.bashrc: executed by bash(1) for non-login shells.# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)# for examples...fiunset __conda_setup# <<< conda initialize <<<
Este arquivo é o que configura a terminal sempre que uma nova é aberta, portanto, se nele editarmos a variável PATH
, esta alteração será mantida para todas as novas janelas de terminal que abrirmos.
Para modificar a variável PATH
dentro do arquivo de configuração, temos que adicionar a seguinte linha ao arquivo
PATH=$PATH:"subdiretório"
Criar alias para todas as sessões
Já vimos como criar alias de comandos, mas também acontecia que eles se perdiam cada vez que fechávamos uma sessão de terminal. Para que isso não aconteça, adicionamos eles também ao arquivo de configuração .bashrc
. Por exemplo, no meu caso adicionei as seguintes linhas
alias ll='ls -l'
alias la='ls -a'
alias lh='ls -h'
alias lha='ls -lha'
Comandos de busca
Busca de binários com which

O primeiro comando de busca que vamos ver é which
, que nos permite encontrar a rota dos binários.
!which python
/home/wallabot/anaconda3/bin/python
No entanto, se buscarmos algo que não esteja em nenhuma das rotas do PATH, which
não será capaz de nos dizer a rota.
!which cd
Busca de arquivos com find

Para procurar um arquivo com find
, temos que indicar a partir de qual caminho queremos procurar o arquivo, seguido da bandeira -name
e o nome do arquivo que desejamos encontrar.
!find ~ -name "2021-02-11-Introduccion-a-Python.ipynb"
/home/wallabot/Documentos/web/portafolio/posts/prueba/2021-02-11-Introduccion-a-Python.ipynb/home/wallabot/Documentos/web/portafolio/posts/2021-02-11-Introduccion-a-Python.ipynb
Como podemos ver, está em seu diretório, além da cópia que criei neste notebook e a salvei na pasta prueba
Uma coisa muito poderosa do find
é que podemos usar wildcards
, por exemplo, se quiser buscar todos os arquivos de texto da minha pasta web
.
!find ~/Documentos/web/ -name *.txt
/home/wallabot/Documentos/web/portafolio/posts/2022-09-12 Introduccion a la terminal.txt/home/wallabot/Documentos/web/portafolio/posts/prueba/lista.txt/home/wallabot/Documentos/web/portafolio/posts/prueba/dot.txt/home/wallabot/Documentos/web/portafolio/posts/prueba/dot2.txt/home/wallabot/Documentos/web/portafolio/posts/prueba/secuential.txt/home/wallabot/Documentos/web/portafolio/posts/prueba/subdirectorio/rootfile.txt/home/wallabot/Documentos/web/portafolio/posts/prueba/subdirectorio/mitexto.txt/home/wallabot/Documentos/web/portafolio/posts/prueba/file.txt/home/wallabot/Documentos/web/wordpress_api_rest/page.txt
Se não quisermos distinguir entre maiúsculas e minúsculas, devemos usar a flag -iname
. Por exemplo, se buscarmos todos os arquivos que contenham o texto FILE
, mas usando a flag -iname
.
!find ~/Documentos/web/ -iname *FILE*
/home/wallabot/Documentos/web/portafolio/posts/html_files/home/wallabot/Documentos/web/portafolio/posts/prueba/subdirectorio/rootfile.txt/home/wallabot/Documentos/web/portafolio/posts/prueba/file.txt
Vemos que todos os resultados contêm file
e não FILE
, ou seja, não fez distinção entre maiúsculas e minúsculas.
Podemos especificar o tipo de arquivo com a flag -type
. Apenas aceita dois tipos f
para arquivos e d
para diretórios
!find ~/Documentos/nerf -name image*
/home/wallabot/Documentos/nerf/instant-ngp/configs/image/home/wallabot/Documentos/nerf/instant-ngp/dependencies/tiny-cuda-nn/benchmarks/image/home/wallabot/Documentos/nerf/instant-ngp/dependencies/tiny-cuda-nn/dependencies/cutlass/media/images/home/wallabot/Documentos/nerf/instant-ngp/dependencies/tiny-cuda-nn/dependencies/fmt/doc/bootstrap/mixins/image.less/home/wallabot/Documentos/nerf/instant-ngp/dependencies/tiny-cuda-nn/data/images/home/wallabot/Documentos/nerf/instant-ngp/dependencies/dlss/NVIDIAImageScaling/samples/media/images/home/wallabot/Documentos/nerf/instant-ngp/data/nerf/fox/images/home/wallabot/Documentos/nerf/instant-ngp/data/image
!find ~/Documentos/nerf -name image* -type d
/home/wallabot/Documentos/nerf/instant-ngp/configs/image/home/wallabot/Documentos/nerf/instant-ngp/dependencies/tiny-cuda-nn/benchmarks/image/home/wallabot/Documentos/nerf/instant-ngp/dependencies/tiny-cuda-nn/dependencies/cutlass/media/images/home/wallabot/Documentos/nerf/instant-ngp/dependencies/tiny-cuda-nn/data/images/home/wallabot/Documentos/nerf/instant-ngp/dependencies/dlss/NVIDIAImageScaling/samples/media/images/home/wallabot/Documentos/nerf/instant-ngp/data/nerf/fox/images/home/wallabot/Documentos/nerf/instant-ngp/data/image
!find ~/Documentos/nerf -name image* -type f
/home/wallabot/Documentos/nerf/instant-ngp/dependencies/tiny-cuda-nn/dependencies/fmt/doc/bootstrap/mixins/image.less
Se quisermos filtrar pelo tamanho do arquivo, podemos usar a flag -size
. Por exemplo, se quisermos buscar todos os arquivos maiores que 200 MB.
!find ~/Documentos/ -type f -size +200M
/home/wallabot/Documentos/kaggle/hubmap/models/13_efficientnet-b7_final_model.pth/home/wallabot/Documentos/kaggle/hubmap/models/12_efficientnet-b7_final_model.pth/home/wallabot/Documentos/kaggle/hubmap/models/14_resnet152_final_model.pth/home/wallabot/Documentos/kaggle/hubmap/models/14_resnet152_best_model.pth/home/wallabot/Documentos/kaggle/hubmap/models/12_efficientnet-b7_early_stopping.pth/home/wallabot/Documentos/kaggle/hubmap/models/efficientnet-b7-dcc49843.pth/home/wallabot/Documentos/kaggle/hubmap/models/13_efficientnet-b7_early_stopping.pth/home/wallabot/Documentos/kaggle/hubmap/models/14_resnet152_early_stopping.pth/home/wallabot/Documentos/kaggle/hubmap/models/12_efficientnet-b7_best_model.pth/home/wallabot/Documentos/kaggle/hubmap/models/13_efficientnet-b7_best_model.pth
Se quisermos realizar operações após a busca, usamos o flag -exec
Por exemplo, vou procurar todas as pastas com o nome subdiretório
!find ~/ -name subdirectorio -type d
/home/wallabot/Documentos/web/portafolio/posts/prueba/subdirectorio
Posso fazê-los serem excluídos com a bandeira -exec
!find ~/ -name subdirectorio -type d -exec rm -r {} ;
rm: ¿borrar el fichero regular vacío '/home/wallabot/Documentos/web/portafolio/posts/prueba/subdirectorio/rootfile.txt' protegido contra escritura? (s/n) sfind: ‘/home/wallabot/Documentos/web/portafolio/posts/prueba/subdirectorio’: No existe el archivo o el directorio
!find ~/ -name subdirectorio -type d
Por último, se usar o caractere !
, estaremos indicando que encontre tudo o que não coincide com o que especificamos.
!find ~/Documentos/web/portafolio/posts/prueba ! -name *.txt
/home/wallabot/Documentos/web/portafolio/posts/prueba/home/wallabot/Documentos/web/portafolio/posts/prueba/index.html/home/wallabot/Documentos/web/portafolio/posts/prueba/Abc/home/wallabot/Documentos/web/portafolio/posts/prueba/datos1/home/wallabot/Documentos/web/portafolio/posts/prueba/2021-02-11-Introduccion-a-Python.ipynb/home/wallabot/Documentos/web/portafolio/posts/prueba/datos123
Como vemos, encontrou tudo o que não é um .txt
Comando de busca grep

grep
é um comando de busca muito poderoso, por isso dedicamos uma seção apenas para ele. O comando grep
utiliza expressões regulares, então, se você quiser aprender sobre elas, deixarei um link para um post onde as explico.
Vamos começar a ver o poder deste comando, vamos procurar todas as vezes que o texto MaximoFN
aparece no arquivo 2021-02-11-Introducao-a-Python.ipynb
terminal("cd /home/wallabot/Documentos/web/portafolio/posts/prueba")
terminal("grep MaximoFN 2021-02-11-Introduccion-a-Python.ipynb", max_lines_output=20)
"a = 'MaximoFN' ","'MaximoFN'""string = "MaximoFN" ","'MaximoFN'""string = 'MaximoFN' ","'MaximoFN'""Este es el blog de "MaximoFN" ""print("Este es el blog de \"MaximoFN\"")""Este es el blog de 'MaximoFN' ""print('Este es el blog de \'MaximoFN\'')""Este es el blog de \MaximoFN\ ""print('Este es el blog de \\MaximoFN\\')""MaximoFN ""print('Este es el blog de \nMaximoFN')""Este es el blog de MaximoFN ""print('Esto no se imprimirá \rEste es el blog de MaximoFN')""Este es el blog de MaximoFN ""print('Este es el blog de \tMaximoFN')""Este es el blog deMaximoFN ""print('Este es el blog de \bMaximoFN')"..."funcion2_del_modulo('MaximoFN')""MaximoFN "," print('MaximoFN') "," variable = 'MaximoFN' ",
No entanto, se fizermos a mesma pesquisa para o texto maximofn
!grep maximofn 2021-02-11-Introduccion-a-Python.ipynb
Não aparece nenhum resultado, isso é porque o grep
é case sensitive
, ou seja, busca o texto exatamente como você o introduziu, diferenciando maiúsculas e minúsculas. Se não quisermos isso, temos que introduzir a flag -i
.
terminal("grep -i MaximoFN 2021-02-11-Introduccion-a-Python.ipynb", max_lines_output=20)
"a = 'MaximoFN' ","'MaximoFN'""string = "MaximoFN" ","'MaximoFN'""string = 'MaximoFN' ","'MaximoFN'""Este es el blog de "MaximoFN" ""print("Este es el blog de \"MaximoFN\"")""Este es el blog de 'MaximoFN' ""print('Este es el blog de \'MaximoFN\'')""Este es el blog de \MaximoFN\ ""print('Este es el blog de \\MaximoFN\\')""MaximoFN ""print('Este es el blog de \nMaximoFN')""Este es el blog de MaximoFN ""print('Esto no se imprimirá \rEste es el blog de MaximoFN')""Este es el blog de MaximoFN ""print('Este es el blog de \tMaximoFN')""Este es el blog deMaximoFN ""print('Este es el blog de \bMaximoFN')"..."funcion2_del_modulo('MaximoFN')""MaximoFN "," print('MaximoFN') "," variable = 'MaximoFN' ",
Se quisermos que retorne o número de vezes que aparece, inserimos a flag -c
!grep -c MaximoFN 2021-02-11-Introduccion-a-Python.ipynb
105
Se não nos importa se aparece com letra maiúscula ou minúscula, podemos voltar a adicionar a flag -i
, mas não é necessário colocá-la separada da flag -c
, elas podem ser introduzidas juntas
!grep -ci MaximoFN 2021-02-11-Introduccion-a-Python.ipynb
105
Se quisermos todas as vezes em que a palavra MáximoFN
**não** aparece, introduzimos a flag -v
!grep -cv MaximoFN 2021-02-11-Introduccion-a-Python.ipynb
11573
Utilidades de rede
Informação das interfaces de rede com ifconfig

O primeiro comando será ifconfig
, que nos mostra informações sobre nossas interfaces de rede.
!ifconfig
br-470e52ae2708: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500inet 172.18.0.1 netmask 255.255.0.0 broadcast 172.18.255.255ether 02:42:ac:d0:b9:eb txqueuelen 0 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255ether 02:42:5d:15:1c:e9 txqueuelen 0 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0enp6s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.1.144 netmask 255.255.255.0 broadcast 192.168.1.255inet6 fe80::7dc2:6944:3fbe:c18e prefixlen 64 scopeid 0x20<link>ether 24:4b:fe:5c:f6:59 txqueuelen 1000 (Ethernet)RX packets 144369 bytes 123807349 (123.8 MB)RX errors 0 dropped 2056 overruns 0 frame 0TX packets 100672 bytes 55678042 (55.6 MB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen 128 scopeid 0x10<host>loop txqueuelen 1000 (Bucle local)RX packets 10748 bytes 1832545 (1.8 MB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 10748 bytes 1832545 (1.8 MB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0wlp5s0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500ether 4c:77:cb:1d:66:cc txqueuelen 1000 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Como vemos temos a informação de todas as interfaces de rede do meu computador, mas se quiser saber apenas a de uma, especifica-se adicionando seu nome
!ifconfig enp6s0
enp6s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.1.144 netmask 255.255.255.0 broadcast 192.168.1.255inet6 fe80::7dc2:6944:3fbe:c18e prefixlen 64 scopeid 0x20<link>ether 24:4b:fe:5c:f6:59 txqueuelen 1000 (Ethernet)RX packets 144467 bytes 123842258 (123.8 MB)RX errors 0 dropped 2060 overruns 0 frame 0TX packets 100786 bytes 55749109 (55.7 MB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Informação das interfaces de rede com ip

Outra maneira de obter a informação das nossas interfaces de rede é através do comando ip
, adicionando a
nos dá a informação de todas as interfaces.
!ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever2: enp6s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 24:4b:fe:5c:f6:59 brd ff:ff:ff:ff:ff:ffinet 192.168.1.144/24 brd 192.168.1.255 scope global dynamic noprefixroute enp6s0valid_lft 80218sec preferred_lft 80218secinet6 fe80::7dc2:6944:3fbe:c18e/64 scope link noprefixroutevalid_lft forever preferred_lft forever3: wlp5s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000link/ether 4c:77:cb:1d:66:cc brd ff:ff:ff:ff:ff:ff4: br-470e52ae2708: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group defaultlink/ether 02:42:ac:d0:b9:eb brd ff:ff:ff:ff:ff:ffinet 172.18.0.1/16 brd 172.18.255.255 scope global br-470e52ae2708valid_lft forever preferred_lft forever5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group defaultlink/ether 02:42:5d:15:1c:e9 brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft forever
Teste de comunicações com ping

Outro comando útil é o ping
, que pode nos servir para verificar se temos conexão com um determinado IP
. Por exemplo, o IP
do Google é 142.250.200.78
, então fazemos ping
nele para ver se ele responde. O comando ping
no Linux envia ping
s continuamente, por isso nunca termina até que o paremos. Para evitar isso, adicionamos a flag -c
e o número de tentativas.
!ping 142.250.200.132 -c 4
PING 142.250.200.132 (142.250.200.132) 56(84) bytes of data.64 bytes from 142.250.200.132: icmp_seq=1 ttl=117 time=3.46 ms64 bytes from 142.250.200.132: icmp_seq=2 ttl=117 time=3.77 ms64 bytes from 142.250.200.132: icmp_seq=3 ttl=117 time=2.81 ms64 bytes from 142.250.200.132: icmp_seq=4 ttl=117 time=2.86 ms--- 142.250.200.132 ping statistics ---4 packets transmitted, 4 received, 0% packet loss, time 3004msrtt min/avg/max/mdev = 2.812/3.227/3.773/0.405 ms
O mesmo teria acontecido se tivéssemos feito diretamente em google.com
!ping www.google.com -c 4
PING www.google.com (142.250.200.132) 56(84) bytes of data.64 bytes from mad41s14-in-f4.1e100.net (142.250.200.132): icmp_seq=1 ttl=117 time=2.74 ms64 bytes from mad41s14-in-f4.1e100.net (142.250.200.132): icmp_seq=2 ttl=117 time=3.96 ms64 bytes from mad41s14-in-f4.1e100.net (142.250.200.132): icmp_seq=3 ttl=117 time=3.56 ms64 bytes from mad41s14-in-f4.1e100.net (142.250.200.132): icmp_seq=4 ttl=117 time=2.87 ms--- www.google.com ping statistics ---4 packets transmitted, 4 received, 0% packet loss, time 3003msrtt min/avg/max/mdev = 2.741/3.283/3.962/0.499 ms
Baixar arquivos de fonte com curl

Podemos obter um arquivo de texto de um endereço dado através do comando curl
, por exemplo, podemos baixar o HTML do Google
!curl https://www.google.com
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="es"><head><meta content="Google.es permite acceder a la informaci�n mundial en castellano, catal�n, gallego, euskara e ingl�s." name="description"><meta content="noodp" name="robots"><meta content="text/html; charset=UTF-8" http-equiv="Content-Type"><meta content="/images/branding/googleg/1x/googleg_standard_color_128dp.png" itemprop="image"><title>Google</title><script nonce="zXcc4tMJWBRoE7q_o_Z2fQ">(function(){window.google={kEI:'M5GOY6PeLr-jkdUP1pir0AE',kEXPI:'0,1359409,6059,206,4804,2316,383,246,5,5367,1123753,1197713,688,380089,16115,28684,22430,1362,12312,17587,4998,13228,3847,10622,22741,5081,1593,1279,2742,149,1103,840,1983,214,4100,3514,606,2023,2297,14670,3227,2845,7,4773,28997,1850,15757,3,346,230,6459,149,13975,4,1528,2304,7039,27731,7357,13658,4437,16786,5815,2542,4094,4052,3,3541,1,14262,27892,2,14022,6248,19490,5680,1021,2380,28741,4569,6255,23421,1252,5835,14967,4333,7484,11406,15676,8155,7381,15970,873,14804,1,4828,7,1922,5784,12208,10330,587,12192,4832,26504,5796,3,14433,3890,751,13384,1499,3,679,1622,1779,1886,338,1627,1119,6,8909,80,243,458,3438,1763,722,1020,813,91,1133,10,280,2306,44,77,1420,3,562,402,314,275,2095,440,399,138,384,1033,334,2667,2,723,444,79,403,501,929,3,785,2,240,78,2022,284,196,732,175,342,244,617,335,1,841,1275,14,979,57,857,446,2,1900,838,251,227,50,21,8,3,442,57,40,936,697,773,95,121,643,1502,163,355,702,195,1,452,50,334,687,109,1,19,109,134,546,80,5,36,124,68,135,131,415,47,27,266,563,48,231,742,15,527,2,6,495,1,495,5,62,1627,441,262,5,3,648,3,6,4,13,39,538,792,337,9,115,98,180,148,308,401,1240,2,726,243,2044,5286450,84,19,32,115,11,70,5995534,2803414,3311,141,795,19735,1,1,346,1755,1004,41,342,1,189,14,1,10,8,1,5,4,2,1,3,2,2,1,3,1,3,1,4,3,1,3,2,2,23947076,511,21,11,4041599,1964,1007,2087,13579,3102,303,5595,11,3835,3637,2623,9,136,1524825',kBL:'p9Xv'};google.sn='webhp';google.kHL='es';})();(function(){var f=this||self;var h,k=[];function l(a){for(var b;a&&(!a.getAttribute||!(b=a.getAttribute("eid")));)a=a.parentNode;return b||h}function m(a){for(var b=null;a&&(!a.getAttribute||!(b=a.getAttribute("leid")));)a=a.parentNode;return b}function n(a,b,c,d,g){var e="";c||-1!==b.search("&ei=")||(e="&ei="+l(d),-1===b.search("&lei=")&&(d=m(d))&&(e+="&lei="+d));d="";!c&&f._cshid&&-1===b.search("&cshid=")&&"slh"!==a&&(d="&cshid="+f._cshid);c=c||"/"+(g||"gen_204")+"?atyp=i&ct="+a+"&cad="+b+e+"&zx="+Date.now()+d;/^http:/i.test(c)&&"https:"===window.location.protocol&&(google.ml&&google.ml(Error("a"),!1,{src:c,glmm:1}),c="");return c};h=google.kEI;google.getEI=l;google.getLEI=m;google.ml=function(){return null};google.log=function(a,b,c,d,g){if(c=n(a,b,c,d,g)){a=new Image;var e=k.length;k[e]=a;a.onerror=a.onload=a.onabort=function(){delete k[e]};a.src=c}};google.logUrl=n;}).call(this);(function(){google.y={};google.sy=[];google.x=function(a,b){if(a)var c=a.id;else{do c=Math.random();while(google.y[c])}google.y[c]=[a,b];return!1};google.sx=function(a){google.sy.push(a)};google.lm=[];google.plm=function(a){google.lm.push.apply(google.lm,a)};google.lq=[];google.load=function(a,b,c){google.lq.push([[a],b,c])};google.loadAll=function(a,b){google.lq.push([a,b])};google.bx=!1;google.lx=function(){};}).call(this);google.f={};(function(){document.documentElement.addEventListener("submit",function(b){var a;if(a=b.target){var c=a.getAttribute("data-submitfalse");a="1"===c||"q"===c&&!a.elements.q.value?!0:!1}else a=!1;a&&(b.preventDefault(),b.stopPropagation())},!0);document.documentElement.addEventListener("click",function(b){var a;a:{for(a=b.target;a&&a!==document.documentElement;a=a.parentElement)if("A"===a.tagName){a="1"===a.getAttribute("data-nohref");break a}a=!1}a&&b.preventDefault()},!0);}).call(this);</script><style>#gbar,#guser{font-size:13px;padding-top:1px !important;}#gbar{height:22px}#guser{padding-bottom:7px !important;text-align:right}.gbh,.gbd{border-top:1px solid #c9d7f1;font-size:1px}.gbh{height:0;position:absolute;top:24px;width:100%}@media all{.gb1{height:22px;margin-right:.5em;vertical-align:top}#gbar{float:left}}a.gb1,a.gb4{text-decoration:underline !important}a.gb1,a.gb4{color:#00c !important}.gbi .gb4{color:#dd8e27 !important}.gbf .gb4{color:#900 !important}</style><style>body,td,a,p,.h{font-family:arial,sans-serif}body{margin:0;overflow-y:scroll}#gog{padding:3px 8px 0}td{line-height:.8em}.gac_m td{line-height:17px}form{margin-bottom:20px}.h{color:#1558d6}em{font-weight:bold;font-style:normal}.lst{height:25px;width:496px}.gsfi,.lst{font:18px arial,sans-serif}.gsfs{font:17px arial,sans-serif}.ds{display:inline-box;display:inline-block;margin:3px 0 4px;margin-left:4px}input{font-family:inherit}body{background:#fff;color:#000}a{color:#4b11a8;text-decoration:none}a:hover,a:active{text-decoration:underline}.fl a{color:#1558d6}a:visited{color:#4b11a8}.sblc{padding-top:5px}.sblc a{display:block;margin:2px 0;margin-left:13px;font-size:11px}.lsbb{background:#f8f9fa;border:solid 1px;border-color:#dadce0 #70757a #70757a #dadce0;height:30px}.lsbb{display:block}#WqQANb a{display:inline-block;margin:0 12px}.lsb{background:url(/images/nav_logo229.png) 0 -261px repeat-x;border:none;color:#000;cursor:pointer;height:30px;margin:0;outline:0;font:15px arial,sans-serif;vertical-align:top}.lsb:active{background:#dadce0}.lst:focus{outline:none}</style><script nonce="zXcc4tMJWBRoE7q_o_Z2fQ">(function(){window.google.erd={jsr:1,bv:1698,de:true};var h=this||self;var k,l=null!=(k=h.mei)?k:1,n,p=null!=(n=h.sdo)?n:!0,q=0,r,t=google.erd,v=t.jsr;google.ml=function(a,b,d,m,e){e=void 0===e?2:e;b&&(r=a&&a.message);if(google.dl)return google.dl(a,e,d),null;if(0>v){window.console&&console.error(a,d);if(-2===v)throw a;b=!1}else b=!a||!a.message||"Error loading script"===a.message||q>=l&&!m?!1:!0;if(!b)return null;q++;d=d||{};b=encodeURIComponent;var c="/gen_204?atyp=i&ei="+b(google.kEI);google.kEXPI&&(c+="&jexpid="+b(google.kEXPI));c+="&srcpg="+b(google.sn)+"&jsr="+b(t.jsr)+"&bver="+b(t.bv);var f=a.lineNumber;void 0!==f&&(c+="&line="+f);var g=a.fileName;g&&(0<g.indexOf("-extension:/")&&(e=3),c+="&script="+b(g),f&&g===window.location.href&&(f=document.documentElement.outerHTML.split(" ")[f],c+="&cad="+b(f?f.substring(0,300):"No script found.")));c+="&jsel="+e;for(var u in d)c+="&",c+=b(u),c+="=",c+=b(d[u]);c=c+"&emsg="+b(a.name+": "+a.message);c=c+"&jsst="+b(a.stack||"N/A");12288<=c.length&&(c=c.substr(0,12288));a=c;m||google.log(0,"",a);return a};window.onerror=function(a,b,d,m,e){r!==a&&(a=e instanceof Error?e:Error(a),void 0===d||"lineNumber"in a||(a.lineNumber=d),void 0===b||"fileName"in a||(a.fileName=b),google.ml(a,!1,void 0,!1,"SyntaxError"===a.name||"SyntaxError"===a.message.substring(0,11)||-1!==a.message.indexOf("Script error")?3:0));r=null;p&&q>=l&&(window.onerror=null)};})();</script></head><body bgcolor="#fff"><script nonce="zXcc4tMJWBRoE7q_o_Z2fQ">(function(){var src='/images/nav_logo229.png';var iesg=false;document.body.onload = function(){window.n && window.n();if (document.images){new Image().src=src;}if (!iesg){document.f&&document.f.q.focus();document.gbqf&&document.gbqf.q.focus();}}})();</script><div id="mngb"><div id=gbar><nobr><b class=gb1>B�squeda</b> <a class=gb1 href="https://www.google.es/imghp?hl=es&tab=wi">Im�genes</a> <a class=gb1 href="https://maps.google.es/maps?hl=es&tab=wl">Maps</a> <a class=gb1 href="https://play.google.com/?hl=es&tab=w8">Play</a> <a class=gb1 href="https://www.youtube.com/?tab=w1">YouTube</a> <a class=gb1 href="https://news.google.com/?tab=wn">Noticias</a> <a class=gb1 href="https://mail.google.com/mail/?tab=wm">Gmail</a> <a class=gb1 href="https://drive.google.com/?tab=wo">Drive</a> <a class=gb1 style="text-decoration:none" href="https://www.google.es/intl/es/about/products?tab=wh"><u>M�s</u> &raquo;</a></nobr></div><div id=guser width=100%><nobr><span id=gbn class=gbi></span><span id=gbf class=gbf></span><span id=gbe></span><a href="http://www.google.es/history/optout?hl=es" class=gb4>Historial web</a> | <a href="/preferences?hl=es" class=gb4>Ajustes</a> | <a target=_top id=gb_70 href="https://accounts.google.com/ServiceLogin?hl=es&passive=true&continue=https://www.google.com/&ec=GAZAAQ" class=gb4>Iniciar sesi�n</a></nobr></div><div class=gbh style=left:0></div><div class=gbh style=right:0></div></div><center><br clear="all" id="lgpd"><div id="lga"><img alt="Google" height="92" src="/images/branding/googlelogo/1x/googlelogo_white_background_color_272x92dp.png" style="padding:28px 0 14px" width="272" id="hplogo"><br><br></div><form action="/search" name="f"><table cellpadding="0" cellspacing="0"><tr valign="top"><td width="25%">&nbsp;</td><td align="center" nowrap=""><input name="ie" value="ISO-8859-1" type="hidden"><input value="es" name="hl" type="hidden"><input name="source" type="hidden" value="hp"><input name="biw" type="hidden"><input name="bih" type="hidden"><div class="ds" style="height:32px;margin:4px 0"><input class="lst" style="margin:0;padding:5px 8px 0 6px;vertical-align:top;color:#000" autocomplete="off" value="" title="Buscar con Google" maxlength="2048" name="q" size="57"></div><br style="line-height:0"><span class="ds"><span class="lsbb"><input class="lsb" value="Buscar con Google" name="btnG" type="submit"></span></span><span class="ds"><span class="lsbb"><input class="lsb" id="tsuid_1" value="Voy a tener suerte" name="btnI" type="submit"><script nonce="zXcc4tMJWBRoE7q_o_Z2fQ">(function(){var id='tsuid_1';document.getElementById(id).onclick = function(){if (this.form.q.value){this.checked = 1;if (this.form.iflsig)this.form.iflsig.disabled = false;}else top.location='/doodles/';};})();</script><input value="AJiK0e8AAAAAY46fQwdyVrbrgW6gkEtVkGfp2nyO0ZXL" name="iflsig" type="hidden"></span></span></td><td class="fl sblc" align="left" nowrap="" width="25%"><a href="/advanced_search?hl=es&amp;authuser=0">B�squeda avanzada</a></td></tr></table><input id="gbv" name="gbv" type="hidden" value="1"><script nonce="zXcc4tMJWBRoE7q_o_Z2fQ">(function(){var a,b="1";if(document&&document.getElementById)if("undefined"!=typeof XMLHttpRequest)b="2";else if("undefined"!=typeof ActiveXObject){var c,d,e=["MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"];for(c=0;d=e[c++];)try{new ActiveXObject(d),b="2"}catch(h){}}a=b;if("2"==a&&-1==location.search.indexOf("&gbv=2")){var f=google.gbvu,g=document.getElementById("gbv");g&&(g.value=a);f&&window.setTimeout(function(){location.href=f},0)};}).call(this);</script></form><div id="gac_scont"></div><div style="font-size:83%;min-height:3.5em"><br><div id="gws-output-pages-elements-homepage_additional_languages__als"><style>#gws-output-pages-elements-homepage_additional_languages__als{font-size:small;margin-bottom:24px}#SIvCob{color:#3c4043;display:inline-block;line-height:28px;}#SIvCob a{padding:0 3px;}.H6sW5{display:inline-block;margin:0 2px;white-space:nowrap}.z4hgWe{display:inline-block;margin:0 2px}</style><div id="SIvCob">Ofrecido por Google en: <a href="https://www.google.com/setprefs?sig=0_vwUKUD2Xhro4NnrueK1hCfItt30%3D&amp;hl=ca&amp;source=homepage&amp;sa=X&amp;ved=0ahUKEwjjw_C44uP7AhW_UaQEHVbMChoQ2ZgBCAU">catal�</a> <a href="https://www.google.com/setprefs?sig=0_vwUKUD2Xhro4NnrueK1hCfItt30%3D&amp;hl=gl&amp;source=homepage&amp;sa=X&amp;ved=0ahUKEwjjw_C44uP7AhW_UaQEHVbMChoQ2ZgBCAY">galego</a> <a href="https://www.google.com/setprefs?sig=0_vwUKUD2Xhro4NnrueK1hCfItt30%3D&amp;hl=eu&amp;source=homepage&amp;sa=X&amp;ved=0ahUKEwjjw_C44uP7AhW_UaQEHVbMChoQ2ZgBCAc">euskara</a> </div></div></div><span id="footer"><div style="font-size:10pt"><div style="margin:19px auto;text-align:center" id="WqQANb"><a href="http://www.google.es/intl/es/services/">Soluciones Empresariales</a><a href="/intl/es/about.html">Todo acerca de Google</a><a href="https://www.google.com/setprefdomain?prefdom=ES&amp;prev=https://www.google.es/&amp;sig=K_a2UXepORMQOw5-SHU8h4noB_VWk%3D">Google.es</a></div></div><p style="font-size:8pt;color:#70757a">&copy; 2022 - <a href="/intl/es/policies/privacy/">Privacidad</a> - <a href="/intl/es/policies/terms/">T�rminos</a></p></span></center><script nonce="zXcc4tMJWBRoE7q_o_Z2fQ">(function(){window.google.cdo={height:757,width:1440};(function(){var a=window.innerWidth,b=window.innerHeight;if(!a||!b){var c=window.document,d="CSS1Compat"==c.compatMode?c.documentElement:c.body;a=d.clientWidth;b=d.clientHeight}a&&b&&(a!=google.cdo.width||b!=google.cdo.height)&&google.log("","","/client_204?&atyp=i&biw="+a+"&bih="+b+"&ei="+google.kEI);}).call(this);})();</script> <script nonce="zXcc4tMJWBRoE7q_o_Z2fQ">(function(){google.xjs={ck:'xjs.hp.oxai9SxkIQY.L.X.O',cs:'ACT90oEGh-_ImDfBjn6aD_ABGaOlD2MqVw',excm:[]};})();</script> <script nonce="zXcc4tMJWBRoE7q_o_Z2fQ">(function(){var u='/xjs/_/js/k=xjs.hp.en.9b-uVUIpJU8.O/am=AADoBABQAGAB/d=1/ed=1/rs=ACT90oG-6KYVksw4jxVvNcwan406xE6qVw/m=sb_he,d';var amd=0;var d=this||self,e=function(a){return a};var g;var l=function(a,b){this.g=b===h?a:""};l.prototype.toString=function(){return this.g+""};var h={};function m(){var a=u;google.lx=function(){p(a);google.lx=function(){}};google.bx||google.lx()}function p(a){google.timers&&google.timers.load&&google.tick&&google.tick("load","xjsls");var b=document;var c="SCRIPT";"application/xhtml+xml"===b.contentType&&(c=c.toLowerCase());c=b.createElement(c);if(void 0===g){b=null;var k=d.trustedTypes;if(k&&k.createPolicy){try{b=k.createPolicy("goog#html",{createHTML:e,createScript:e,createScriptURL:e})}catch(q){d.console&&d.console.error(q.message)}g=b}else g=b}a=(b=g)?b.createScriptURL(a):a;a=new l(a,h);c.src=a instanceof l&&a.constructor===l?a.g:"type_error:TrustedResourceUrl";var f,n;(f=(a=null==(n=(f=(c.ownerDocument&&c.ownerDocument.defaultView||window).document).querySelector)?void 0:n.call(f,"script[nonce]"))?a.nonce||a.getAttribute("nonce")||"":"")&&c.setAttribute("nonce",f);document.body.appendChild(c);google.psa=!0};google.xjsu=u;setTimeout(function(){0<amd?google.caft(function(){return m()},amd):m()},0);})();function _DumpException(e){throw e;}function _F_installCss(c){}(function(){google.jl={blt:'none',chnk:0,dw:false,dwu:true,emtn:0,end:0,ico:false,ikb:0,ine:false,injs:'none',injt:0,injth:0,injv2:false,lls:'default',pdt:0,rep:0,snet:true,strt:0,ubm:false,uwp:true};})();(function(){var pmc='{"d":{},"sb_he":{"agen":true,"cgen":true,"client":"heirloom-hp","dh":true,"ds":"","fl":true,"host":"google.com","jsonp":true,"lm":true,"msgs":{"cibl":"Borrar b�squeda","dym":"Quiz�s quisiste decir:","lcky":"Voy a tener suerte","lml":"M�s informaci�n","psrc":"Esta b�squeda se ha eliminado de tu \u003Ca href=\"/history\"\u003Ehistorial web\u003C/a\u003E.","psrl":"Eliminar","sbit":"Buscar por imagen","srch":"Buscar con Google"},"ovr":{},"pq":"","rfs":[],"sbas":"0 3px 8px 0 rgba(0,0,0,0.2),0 0 0 1px rgba(0,0,0,0.08)","stok":"gh8wSanWNWQy8f-PH0wGTjDkvYQ"}}';google.pmc=JSON.parse(pmc);})();</script> </body></html>
Também podemos fazer um pipeline para salvá-lo em um arquivo
!curl https://www.google.com > google.html
% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed100 15168 0 15168 0 0 135k 0 --:--:-- --:--:-- --:--:-- 137k
Agora podemos ver se foi salvo corretamente.
!cat google.html
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="es"><head><meta content="Google.es permite acceder a la informaci�n mundial en castellano, catal�n, gallego, euskara e ingl�s." name="description"><meta content="noodp" name="robots"><meta content="text/html; charset=UTF-8" http-equiv="Content-Type"><meta content="/images/branding/googleg/1x/googleg_standard_color_128dp.png" itemprop="image"><title>Google</title><script nonce="Jo7WFU6XWWwu6NrdwaRyIw">(function(){window.google={kEI:'R5GOY-LZHLegkdUP_IqzoAE',kEXPI:'0,1359409,6059,206,4804,2316,383,246,5,5367,1123753,1197777,380713,16115,28684,22430,1362,283,12036,17580,4998,13228,516,3331,10622,22741,5081,1593,1279,2742,149,1103,840,1983,4,210,4100,3514,606,2023,2299,14668,3229,2843,7,4773,826,23475,4696,1851,15756,3,346,230,6459,149,13975,4,1528,2304,7039,20309,7422,7357,13658,4437,16786,5812,2545,4094,4052,3,3541,1,11943,30211,2,8984,1,5037,6249,19490,5679,1020,2378,28745,4568,6258,23418,1252,5835,14967,4333,4239,3245,27082,239,7916,7381,15969,874,19633,6,1923,5784,3995,21779,1120,8423,4832,26080,423,107,5690,3,14433,3890,751,14879,3,683,217,1405,1779,1854,31,1966,1119,6,8909,323,5659,1741,814,1224,10,280,2346,82,1419,3,565,401,519,68,970,1125,440,398,156,367,1034,333,3392,526,396,3,1431,3,785,2,312,2312,196,907,342,244,618,314,1,293,568,171,1104,14,89,891,56,857,306,14,509,154,246,1110,219,628,249,229,49,8,8,3,55,4,399,55,39,1072,49,43,2,468,782,83,123,641,1502,166,350,707,195,5,140,358,329,692,109,1,20,108,134,547,67,5,49,93,31,77,124,79,355,160,27,829,236,764,12,35,118,98,803,1,65,436,5,5,54,2065,262,5,3,647,3,8,2,14,39,65,380,80,14,790,346,115,99,1323,4,711,242,2,723,2286,5280608,12,5934,147,81,8798948,3311,141,795,19735,1,1,346,1755,1004,41,342,1,189,14,9,4,6,3,3,4,1,2,2,3,2,2,2,1,2,5,2,2,1,2,2,2,23947077,512,18,13,2737921,1303678,1964,3094,13579,3405,5595,11,3835,1923,3208,1069,1480676,40778',kBL:'p9Xv'};google.sn='webhp';google.kHL='es';})();(function(){var f=this||self;var h,k=[];function l(a){for(var b;a&&(!a.getAttribute||!(b=a.getAttribute("eid")));)a=a.parentNode;return b||h}function m(a){for(var b=null;a&&(!a.getAttribute||!(b=a.getAttribute("leid")));)a=a.parentNode;return b}function n(a,b,c,d,g){var e="";c||-1!==b.search("&ei=")||(e="&ei="+l(d),-1===b.search("&lei=")&&(d=m(d))&&(e+="&lei="+d));d="";!c&&f._cshid&&-1===b.search("&cshid=")&&"slh"!==a&&(d="&cshid="+f._cshid);c=c||"/"+(g||"gen_204")+"?atyp=i&ct="+a+"&cad="+b+e+"&zx="+Date.now()+d;/^http:/i.test(c)&&"https:"===window.location.protocol&&(google.ml&&google.ml(Error("a"),!1,{src:c,glmm:1}),c="");return c};h=google.kEI;google.getEI=l;google.getLEI=m;google.ml=function(){return null};google.log=function(a,b,c,d,g){if(c=n(a,b,c,d,g)){a=new Image;var e=k.length;k[e]=a;a.onerror=a.onload=a.onabort=function(){delete k[e]};a.src=c}};google.logUrl=n;}).call(this);(function(){google.y={};google.sy=[];google.x=function(a,b){if(a)var c=a.id;else{do c=Math.random();while(google.y[c])}google.y[c]=[a,b];return!1};google.sx=function(a){google.sy.push(a)};google.lm=[];google.plm=function(a){google.lm.push.apply(google.lm,a)};google.lq=[];google.load=function(a,b,c){google.lq.push([[a],b,c])};google.loadAll=function(a,b){google.lq.push([a,b])};google.bx=!1;google.lx=function(){};}).call(this);google.f={};(function(){document.documentElement.addEventListener("submit",function(b){var a;if(a=b.target){var c=a.getAttribute("data-submitfalse");a="1"===c||"q"===c&&!a.elements.q.value?!0:!1}else a=!1;a&&(b.preventDefault(),b.stopPropagation())},!0);document.documentElement.addEventListener("click",function(b){var a;a:{for(a=b.target;a&&a!==document.documentElement;a=a.parentElement)if("A"===a.tagName){a="1"===a.getAttribute("data-nohref");break a}a=!1}a&&b.preventDefault()},!0);}).call(this);</script><style>#gbar,#guser{font-size:13px;padding-top:1px !important;}#gbar{height:22px}#guser{padding-bottom:7px !important;text-align:right}.gbh,.gbd{border-top:1px solid #c9d7f1;font-size:1px}.gbh{height:0;position:absolute;top:24px;width:100%}@media all{.gb1{height:22px;margin-right:.5em;vertical-align:top}#gbar{float:left}}a.gb1,a.gb4{text-decoration:underline !important}a.gb1,a.gb4{color:#00c !important}.gbi .gb4{color:#dd8e27 !important}.gbf .gb4{color:#900 !important}</style><style>body,td,a,p,.h{font-family:arial,sans-serif}body{margin:0;overflow-y:scroll}#gog{padding:3px 8px 0}td{line-height:.8em}.gac_m td{line-height:17px}form{margin-bottom:20px}.h{color:#1558d6}em{font-weight:bold;font-style:normal}.lst{height:25px;width:496px}.gsfi,.lst{font:18px arial,sans-serif}.gsfs{font:17px arial,sans-serif}.ds{display:inline-box;display:inline-block;margin:3px 0 4px;margin-left:4px}input{font-family:inherit}body{background:#fff;color:#000}a{color:#4b11a8;text-decoration:none}a:hover,a:active{text-decoration:underline}.fl a{color:#1558d6}a:visited{color:#4b11a8}.sblc{padding-top:5px}.sblc a{display:block;margin:2px 0;margin-left:13px;font-size:11px}.lsbb{background:#f8f9fa;border:solid 1px;border-color:#dadce0 #70757a #70757a #dadce0;height:30px}.lsbb{display:block}#WqQANb a{display:inline-block;margin:0 12px}.lsb{background:url(/images/nav_logo229.png) 0 -261px repeat-x;border:none;color:#000;cursor:pointer;height:30px;margin:0;outline:0;font:15px arial,sans-serif;vertical-align:top}.lsb:active{background:#dadce0}.lst:focus{outline:none}</style><script nonce="Jo7WFU6XWWwu6NrdwaRyIw">(function(){window.google.erd={jsr:1,bv:1698,de:true};var h=this||self;var k,l=null!=(k=h.mei)?k:1,n,p=null!=(n=h.sdo)?n:!0,q=0,r,t=google.erd,v=t.jsr;google.ml=function(a,b,d,m,e){e=void 0===e?2:e;b&&(r=a&&a.message);if(google.dl)return google.dl(a,e,d),null;if(0>v){window.console&&console.error(a,d);if(-2===v)throw a;b=!1}else b=!a||!a.message||"Error loading script"===a.message||q>=l&&!m?!1:!0;if(!b)return null;q++;d=d||{};b=encodeURIComponent;var c="/gen_204?atyp=i&ei="+b(google.kEI);google.kEXPI&&(c+="&jexpid="+b(google.kEXPI));c+="&srcpg="+b(google.sn)+"&jsr="+b(t.jsr)+"&bver="+b(t.bv);var f=a.lineNumber;void 0!==f&&(c+="&line="+f);var g=a.fileName;g&&(0<g.indexOf("-extension:/")&&(e=3),c+="&script="+b(g),f&&g===window.location.href&&(f=document.documentElement.outerHTML.split(" ")[f],c+="&cad="+b(f?f.substring(0,300):"No script found.")));c+="&jsel="+e;for(var u in d)c+="&",c+=b(u),c+="=",c+=b(d[u]);c=c+"&emsg="+b(a.name+": "+a.message);c=c+"&jsst="+b(a.stack||"N/A");12288<=c.length&&(c=c.substr(0,12288));a=c;m||google.log(0,"",a);return a};window.onerror=function(a,b,d,m,e){r!==a&&(a=e instanceof Error?e:Error(a),void 0===d||"lineNumber"in a||(a.lineNumber=d),void 0===b||"fileName"in a||(a.fileName=b),google.ml(a,!1,void 0,!1,"SyntaxError"===a.name||"SyntaxError"===a.message.substring(0,11)||-1!==a.message.indexOf("Script error")?3:0));r=null;p&&q>=l&&(window.onerror=null)};})();</script></head><body bgcolor="#fff"><script nonce="Jo7WFU6XWWwu6NrdwaRyIw">(function(){var src='/images/nav_logo229.png';var iesg=false;document.body.onload = function(){window.n && window.n();if (document.images){new Image().src=src;}if (!iesg){document.f&&document.f.q.focus();document.gbqf&&document.gbqf.q.focus();}}})();</script><div id="mngb"><div id=gbar><nobr><b class=gb1>B�squeda</b> <a class=gb1 href="https://www.google.es/imghp?hl=es&tab=wi">Im�genes</a> <a class=gb1 href="https://maps.google.es/maps?hl=es&tab=wl">Maps</a> <a class=gb1 href="https://play.google.com/?hl=es&tab=w8">Play</a> <a class=gb1 href="https://www.youtube.com/?tab=w1">YouTube</a> <a class=gb1 href="https://news.google.com/?tab=wn">Noticias</a> <a class=gb1 href="https://mail.google.com/mail/?tab=wm">Gmail</a> <a class=gb1 href="https://drive.google.com/?tab=wo">Drive</a> <a class=gb1 style="text-decoration:none" href="https://www.google.es/intl/es/about/products?tab=wh"><u>M�s</u> &raquo;</a></nobr></div><div id=guser width=100%><nobr><span id=gbn class=gbi></span><span id=gbf class=gbf></span><span id=gbe></span><a href="http://www.google.es/history/optout?hl=es" class=gb4>Historial web</a> | <a href="/preferences?hl=es" class=gb4>Ajustes</a> | <a target=_top id=gb_70 href="https://accounts.google.com/ServiceLogin?hl=es&passive=true&continue=https://www.google.com/&ec=GAZAAQ" class=gb4>Iniciar sesi�n</a></nobr></div><div class=gbh style=left:0></div><div class=gbh style=right:0></div></div><center><br clear="all" id="lgpd"><div id="lga"><img alt="Google" height="92" src="/images/branding/googlelogo/1x/googlelogo_white_background_color_272x92dp.png" style="padding:28px 0 14px" width="272" id="hplogo"><br><br></div><form action="/search" name="f"><table cellpadding="0" cellspacing="0"><tr valign="top"><td width="25%">&nbsp;</td><td align="center" nowrap=""><input name="ie" value="ISO-8859-1" type="hidden"><input value="es" name="hl" type="hidden"><input name="source" type="hidden" value="hp"><input name="biw" type="hidden"><input name="bih" type="hidden"><div class="ds" style="height:32px;margin:4px 0"><input class="lst" style="margin:0;padding:5px 8px 0 6px;vertical-align:top;color:#000" autocomplete="off" value="" title="Buscar con Google" maxlength="2048" name="q" size="57"></div><br style="line-height:0"><span class="ds"><span class="lsbb"><input class="lsb" value="Buscar con Google" name="btnG" type="submit"></span></span><span class="ds"><span class="lsbb"><input class="lsb" id="tsuid_1" value="Voy a tener suerte" name="btnI" type="submit"><script nonce="Jo7WFU6XWWwu6NrdwaRyIw">(function(){var id='tsuid_1';document.getElementById(id).onclick = function(){if (this.form.q.value){this.checked = 1;if (this.form.iflsig)this.form.iflsig.disabled = false;}else top.location='/doodles/';};})();</script><input value="AJiK0e8AAAAAY46fV7gpXBHCT6KAebFZAqGv1l-4BtIR" name="iflsig" type="hidden"></span></span></td><td class="fl sblc" align="left" nowrap="" width="25%"><a href="/advanced_search?hl=es&amp;authuser=0">B�squeda avanzada</a></td></tr></table><input id="gbv" name="gbv" type="hidden" value="1"><script nonce="Jo7WFU6XWWwu6NrdwaRyIw">(function(){var a,b="1";if(document&&document.getElementById)if("undefined"!=typeof XMLHttpRequest)b="2";else if("undefined"!=typeof ActiveXObject){var c,d,e=["MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"];for(c=0;d=e[c++];)try{new ActiveXObject(d),b="2"}catch(h){}}a=b;if("2"==a&&-1==location.search.indexOf("&gbv=2")){var f=google.gbvu,g=document.getElementById("gbv");g&&(g.value=a);f&&window.setTimeout(function(){location.href=f},0)};}).call(this);</script></form><div id="gac_scont"></div><div style="font-size:83%;min-height:3.5em"><br><div id="gws-output-pages-elements-homepage_additional_languages__als"><style>#gws-output-pages-elements-homepage_additional_languages__als{font-size:small;margin-bottom:24px}#SIvCob{color:#3c4043;display:inline-block;line-height:28px;}#SIvCob a{padding:0 3px;}.H6sW5{display:inline-block;margin:0 2px;white-space:nowrap}.z4hgWe{display:inline-block;margin:0 2px}</style><div id="SIvCob">Ofrecido por Google en: <a href="https://www.google.com/setprefs?sig=0_HljXEzVisqsnlJP1S5dx0Fao0Lw%3D&amp;hl=ca&amp;source=homepage&amp;sa=X&amp;ved=0ahUKEwiimaPC4uP7AhU3UKQEHXzFDBQQ2ZgBCAU">catal�</a> <a href="https://www.google.com/setprefs?sig=0_HljXEzVisqsnlJP1S5dx0Fao0Lw%3D&amp;hl=gl&amp;source=homepage&amp;sa=X&amp;ved=0ahUKEwiimaPC4uP7AhU3UKQEHXzFDBQQ2ZgBCAY">galego</a> <a href="https://www.google.com/setprefs?sig=0_HljXEzVisqsnlJP1S5dx0Fao0Lw%3D&amp;hl=eu&amp;source=homepage&amp;sa=X&amp;ved=0ahUKEwiimaPC4uP7AhU3UKQEHXzFDBQQ2ZgBCAc">euskara</a> </div></div></div><span id="footer"><div style="font-size:10pt"><div style="margin:19px auto;text-align:center" id="WqQANb"><a href="http://www.google.es/intl/es/services/">Soluciones Empresariales</a><a href="/intl/es/about.html">Todo acerca de Google</a><a href="https://www.google.com/setprefdomain?prefdom=ES&amp;prev=https://www.google.es/&amp;sig=K_8O8QHBmoai9DOT5YZxMWevJK8VI%3D">Google.es</a></div></div><p style="font-size:8pt;color:#70757a">&copy; 2022 - <a href="/intl/es/policies/privacy/">Privacidad</a> - <a href="/intl/es/policies/terms/">T�rminos</a></p></span></center><script nonce="Jo7WFU6XWWwu6NrdwaRyIw">(function(){window.google.cdo={height:757,width:1440};(function(){var a=window.innerWidth,b=window.innerHeight;if(!a||!b){var c=window.document,d="CSS1Compat"==c.compatMode?c.documentElement:c.body;a=d.clientWidth;b=d.clientHeight}a&&b&&(a!=google.cdo.width||b!=google.cdo.height)&&google.log("","","/client_204?&atyp=i&biw="+a+"&bih="+b+"&ei="+google.kEI);}).call(this);})();</script> <script nonce="Jo7WFU6XWWwu6NrdwaRyIw">(function(){google.xjs={ck:'xjs.hp.oxai9SxkIQY.L.X.O',cs:'ACT90oEGh-_ImDfBjn6aD_ABGaOlD2MqVw',excm:[]};})();</script> <script nonce="Jo7WFU6XWWwu6NrdwaRyIw">(function(){var u='/xjs/_/js/k=xjs.hp.en.9b-uVUIpJU8.O/am=AADoBABQAGAB/d=1/ed=1/rs=ACT90oG-6KYVksw4jxVvNcwan406xE6qVw/m=sb_he,d';var amd=0;var d=this||self,e=function(a){return a};var g;var l=function(a,b){this.g=b===h?a:""};l.prototype.toString=function(){return this.g+""};var h={};function m(){var a=u;google.lx=function(){p(a);google.lx=function(){}};google.bx||google.lx()}function p(a){google.timers&&google.timers.load&&google.tick&&google.tick("load","xjsls");var b=document;var c="SCRIPT";"application/xhtml+xml"===b.contentType&&(c=c.toLowerCase());c=b.createElement(c);if(void 0===g){b=null;var k=d.trustedTypes;if(k&&k.createPolicy){try{b=k.createPolicy("goog#html",{createHTML:e,createScript:e,createScriptURL:e})}catch(q){d.console&&d.console.error(q.message)}g=b}else g=b}a=(b=g)?b.createScriptURL(a):a;a=new l(a,h);c.src=a instanceof l&&a.constructor===l?a.g:"type_error:TrustedResourceUrl";var f,n;(f=(a=null==(n=(f=(c.ownerDocument&&c.ownerDocument.defaultView||window).document).querySelector)?void 0:n.call(f,"script[nonce]"))?a.nonce||a.getAttribute("nonce")||"":"")&&c.setAttribute("nonce",f);document.body.appendChild(c);google.psa=!0};google.xjsu=u;setTimeout(function(){0<amd?google.caft(function(){return m()},amd):m()},0);})();function _DumpException(e){throw e;}function _F_installCss(c){}(function(){google.jl={blt:'none',chnk:0,dw:false,dwu:true,emtn:0,end:0,ico:false,ikb:0,ine:false,injs:'none',injt:0,injth:0,injv2:false,lls:'default',pdt:0,rep:0,snet:true,strt:0,ubm:false,uwp:true};})();(function(){var pmc='{"d":{},"sb_he":{"agen":true,"cgen":true,"client":"heirloom-hp","dh":true,"ds":"","fl":true,"host":"google.com","jsonp":true,"lm":true,"msgs":{"cibl":"Borrar b�squeda","dym":"Quiz�s quisiste decir:","lcky":"Voy a tener suerte","lml":"M�s informaci�n","psrc":"Esta b�squeda se ha eliminado de tu \u003Ca href=\"/history\"\u003Ehistorial web\u003C/a\u003E.","psrl":"Eliminar","sbit":"Buscar por imagen","srch":"Buscar con Google"},"ovr":{},"pq":"","rfs":[],"sbas":"0 3px 8px 0 rgba(0,0,0,0.2),0 0 0 1px rgba(0,0,0,0.08)","stok":"GYSMF2y7hymT0L3W0W4RPVIsSrU"}}';google.pmc=JSON.parse(pmc);})();</script> </body></html>
Baixar arquivos com wget

Outro comando semelhante é wget
, no entanto, ao contrário de curl
, o wget
baixa o arquivo diretamente.
!wget https://www.google.com
--2022-12-06 01:49:19-- https://www.google.com/Resolviendo www.google.com (www.google.com)... 142.250.200.68, 2a00:1450:4003:80c::2004Conectando con www.google.com (www.google.com)[142.250.200.68]:443... conectado.Petición HTTP enviada, esperando respuesta... 200 OKLongitud: no especificado [text/html]Guardando como: “index.html.1”index.html.1 [ <=> ] 14,76K --.-KB/s en 0,002s2022-12-06 01:49:19 (7,17 MB/s) - “index.html.1” guardado [15117]
!ls -l
total 316-rw-rw-r-- 1 wallabot wallabot 285898 dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 15168 dic 6 01:48 google.html-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 15117 dic 6 01:49 index.html.1-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 01:08 secuential.txt
Vemos que o salvou como index.html
, que é como o Google o nomeia
Se quisermos salvar com um nome específico, podemos usar a flag -O
!wget https://www.google.com -O google2.html
--2022-12-06 01:49:37-- https://www.google.com/Resolviendo www.google.com (www.google.com)... 142.250.200.68, 2a00:1450:4003:80c::2004Conectando con www.google.com (www.google.com)[142.250.200.68]:443... conectado.Petición HTTP enviada, esperando respuesta... 200 OKLongitud: no especificado [text/html]Guardando como: “google2.html”google2.html [ <=> ] 14,78K --.-KB/s en 0,003s2022-12-06 01:49:37 (5,27 MB/s) - “google2.html” guardado [15131]
!ls -l
total 332-rw-rw-r-- 1 wallabot wallabot 285898 dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 15131 dic 6 01:49 google2.html-rw-rw-r-- 1 wallabot wallabot 15168 dic 6 01:48 google.html-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 15117 dic 6 01:49 index.html.1-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 01:08 secuential.txt
Depuração da rota com traceroute

Um comando muito útil é ver o caminho até um destino, para isso usamos traceroute
, por exemplo, vamos ver todos os lugares pelos quais tenho que passar para me conectar ao Google
!traceroute www.google.com
traceroute to www.google.com (142.250.200.68), 64 hops max1 192.168.1.1 0,435ms 0,154ms 0,133ms2 188.127.176.1 3,979ms 2,914ms 3,397ms3 10.15.0.77 3,600ms 3,914ms 2,669ms4 10.15.246.6 3,567ms 3,713ms 2,926ms5 * * *6 72.14.209.84 3,981ms 2,914ms 2,993ms7 * * *8 142.251.54.148 3,856ms 2,916ms 2,905ms9 142.250.200.68 2,908ms 2,949ms 3,037ms
Depuração da rota com mtr

Outra ferramenta de depuração é mtr
, que é uma versão melhorada de traceroute
. Oferece informações de cada salto, como o tempo de resposta, a porcentagem de pacotes perdidos, etc.
!mtr -n maximofn.com
wallabot (192.168.178.144)Keys: Help Display mode Restart statistics Order of fields quitPackets PingsHost Loss% Snt Last Avg Best Wrst StDev1. 192.168.178.1 0.0% 345 0.3 0.3 0.3 0.3 0.02. 192.168.0.1 0.0% 344 0.8 1.1 1.1 1.1 0.03. (waiting for reply)4. 10.183.52.41 0.0% 344 2.8 2.5 2.5 2.5 0.05. 172.29.0.161 47.7% 344 2.3 3.1 3.1 23.1 0.06. (waiting for reply)7. 193.149.1.97 0.0% 344 3.6 3.6 3.6 38.6 0.08. (waiting for reply)9. 185.125.78.197 2.9% 344 6.9 6.9 6.9 6.9 0.0
Como pode ser visto no salto 5, quase 50% dos pacotes são perdidos, então isso me seria útil para chamar minha companhia de telefonia e dizer-lhe que tente rotear-me por outro caminho.
Nome da nossa máquina com hostname

Se quisermos saber o nome do nosso computador, podemos usar hostname
, o que é útil se quisermos nos conectar à nossa máquina a partir de outra.
!hostname
wallabot
Informação de link de porta padrão com route -n

Se quisermos conhecer nossa porta de entrada padrão, usamos o comando route -n
!route -n
Tabla de rutas IP del núcleoDestino Pasarela Genmask Indic Métric Ref Uso Interfaz0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 enp6s0169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 enp6s0172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-470e52ae2708192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 enp6s0
Informação do IP de um domínio com nslookup

Se quisermos saber o IP de algum domínio, podemos descobri-lo através do comando nslookup
!nslookup google.com
Server: 127.0.0.53Address: 127.0.0.53#53Non-authoritative answer:Name: google.comAddress: 142.250.185.14Name: google.comAddress: 2a00:1450:4003:808::200e
Isso nos diz que o IPv4 do Google é 172.217.168.174 e seu IPv6 é 2a00:1450:4003:803::200e
Informação da nossa rede com netstats

O último comando de utilidade é netstats
, este comando nos dá o estado da nossa rede, além disso, com a flag -i
nos retorna nossas interfaces de rede.
!netstat -i
Tabla de la interfaz del núcleoIface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flgbr-470e5 1500 0 0 0 0 0 0 0 0 BMUdocker0 1500 0 0 0 0 0 0 0 0 BMUenp6s0 1500 148385 0 2182 0 106135 0 0 0 BMRUlo 65536 11674 0 0 0 11674 0 0 0 LRUwlp5s0 1500 0 0 0 0 0 0 0 0 BMU
Consultas DNS com dig

Com o comando dig <domínio>
podemos fazer consultas DNS, por exemplo, vamos fazer uma consulta ao Google
!dig google.com
; <<>> DiG 9.16.1-Ubuntu <<>> google.com;; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20527;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1;; OPT PSEUDOSECTION:; EDNS: version: 0, flags:; udp: 65494;; QUESTION SECTION:;google.com. IN A;; ANSWER SECTION:google.com. 283 IN A 142.250.184.14;; Query time: 8 msec;; SERVER: 127.0.0.53#53(127.0.0.53);; WHEN: dom sep 24 01:32:07 CEST 2023;; MSG SIZE rcvd: 55
Pode-se ver
;; SEÇÃO DE RESPOSTA:
google.com. 283 IN A 142.250.184.14
Portanto, a consulta nos deu o IP do Google
Podemos fazer uma consulta a um servidor DNS específico com dig @<servidor DNS> <domínio>
!dig @1.1.1.1 google.com
; <<>> DiG 9.16.1-Ubuntu <<>> @1.1.1.1 google.com; (1 server found);; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15633;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0;; QUESTION SECTION:;google.com. IN A;; ANSWER SECTION:google.com. 190 IN A 142.250.184.14;; Query time: 8 msec;; SERVER: 1.1.1.1#53(1.1.1.1);; WHEN: dom sep 24 01:33:40 CEST 2023;; MSG SIZE rcvd: 44
Fizemos a mesma consulta, mas a enviamos ao DNS da Cloudflare
Compactando arquivos
Antes de comprimir e descomprimir, vamos a ver o que vamos a comprimir. Primeiro, imprimimos nosso caminho e listamos os arquivos.
!pwd; ls -l
/home/wallabot/Documentos/web/portafolio/posts/pruebatotal 332-rw-rw-r-- 1 wallabot wallabot 285898 dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 15131 dic 6 01:49 google2.html-rw-rw-r-- 1 wallabot wallabot 15168 dic 6 01:48 google.html-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 15117 dic 6 01:49 index.html.1-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 01:08 secuential.txt
Vamos a criar uma nova pasta e copiar tudo o que está dentro da pasta atual para ela.
!mkdir tocompress; cp * tocompress; ls -l
cp: -r not specified; omitting directory 'tocompress'total 336-rw-rw-r-- 1 wallabot wallabot 285898 dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 15131 dic 6 01:49 google2.html-rw-rw-r-- 1 wallabot wallabot 15168 dic 6 01:48 google.html-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 15117 dic 6 01:49 index.html.1-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 01:08 secuential.txtdrwxrwxr-x 2 wallabot wallabot 4096 dic 6 01:52 tocompress
Como vemos, foi copiado tudo exceto a própria pasta tocompress
, pois não colocamos a opção -r
no comando cp
. Mas o que aconteceu é exatamente o que queríamos.
Comprimir com tar

O primeiro comando que vamos usar para compactar é tar
, ao qual vamos adicionar a flag -c
de compress, -v
de verbose, para que nos mostre o que está fazendo, e a flag -f
de file, seguido do nome que queremos dar ao arquivo compactado e o nome do arquivo que queremos compactar.
!tar -cvf tocompress.tar tocompress
tocompress/tocompress/lista.txttocompress/dot.txttocompress/google.htmltocompress/index.htmltocompress/Abctocompress/google2.htmltocompress/dot2.txttocompress/secuential.txttocompress/index.html.1tocompress/file.txttocompress/datos1tocompress/2021-02-11-Introduccion-a-Python.ipynbtocompress/datos123
!ls -l
total 676-rw-rw-r-- 1 wallabot wallabot 285898 dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 15131 dic 6 01:49 google2.html-rw-rw-r-- 1 wallabot wallabot 15168 dic 6 01:48 google.html-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 15117 dic 6 01:49 index.html.1-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 01:08 secuential.txtdrwxrwxr-x 2 wallabot wallabot 4096 dic 6 01:52 tocompress-rw-rw-r-- 1 wallabot wallabot 348160 dic 6 01:53 tocompress.tar
Vemos que você criou o arquivo tocompress.tar
Agora vamos a repetir o processo, mas adicionando a flag -z
. Isso faz a compressão no formato gzip
, que é um algoritmo de compressão mais eficiente.
!tar -cvzf tocompress.tar.gz tocompress
tocompress/tocompress/lista.txttocompress/dot.txttocompress/google.htmltocompress/index.htmltocompress/Abctocompress/google2.htmltocompress/dot2.txttocompress/secuential.txttocompress/index.html.1tocompress/file.txttocompress/datos1tocompress/2021-02-11-Introduccion-a-Python.ipynbtocompress/datos123
!ls -lh
total 728K-rw-rw-r-- 1 wallabot wallabot 280K dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 15K dic 6 01:49 google2.html-rw-rw-r-- 1 wallabot wallabot 15K dic 6 01:48 google.html-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 15K dic 6 01:49 index.html.1-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 01:08 secuential.txtdrwxrwxr-x 2 wallabot wallabot 4,0K dic 6 01:52 tocompress-rw-rw-r-- 1 wallabot wallabot 340K dic 6 01:53 tocompress.tar-rw-rw-r-- 1 wallabot wallabot 52K dic 6 01:53 tocompress.tar.gz
Como se pode ver, o arquivo tocompress.tar
ocupa 340 kB
, enquanto que o arquivo tocompress.tar.gz
ocupa apenas 52 kB
Agora vamos a descompactar os arquivos. Para descompactar, usa-se o mesmo comando, apenas mudando a flag -c
pela flag -x
Primeiro apagamos a pasta original
!rm -r tocompress
Descompactamos
!tar -xvf tocompress.tar
tocompress/tocompress/lista.txttocompress/dot.txttocompress/google.htmltocompress/index.htmltocompress/Abctocompress/google2.htmltocompress/dot2.txttocompress/secuential.txttocompress/index.html.1tocompress/file.txttocompress/datos1tocompress/2021-02-11-Introduccion-a-Python.ipynbtocompress/datos123
!ls -lh
total 728K-rw-rw-r-- 1 wallabot wallabot 280K dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 15K dic 6 01:49 google2.html-rw-rw-r-- 1 wallabot wallabot 15K dic 6 01:48 google.html-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 15K dic 6 01:49 index.html.1-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 01:08 secuential.txtdrwxrwxr-x 2 wallabot wallabot 4,0K dic 6 01:52 tocompress-rw-rw-r-- 1 wallabot wallabot 340K dic 6 01:53 tocompress.tar-rw-rw-r-- 1 wallabot wallabot 52K dic 6 01:53 tocompress.tar.gz
Fazemos o mesmo com o gzip
!rm -r tocompress
!tar -xvzf tocompress.tar.gz
tocompress/tocompress/lista.txttocompress/dot.txttocompress/google.htmltocompress/index.htmltocompress/Abctocompress/google2.htmltocompress/dot2.txttocompress/secuential.txttocompress/index.html.1tocompress/file.txttocompress/datos1tocompress/2021-02-11-Introduccion-a-Python.ipynbtocompress/datos123
!ls -lh
total 728K-rw-rw-r-- 1 wallabot wallabot 280K dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 15K dic 6 01:49 google2.html-rw-rw-r-- 1 wallabot wallabot 15K dic 6 01:48 google.html-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 15K dic 6 01:49 index.html.1-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 01:08 secuential.txtdrwxrwxr-x 2 wallabot wallabot 4,0K dic 6 01:52 tocompress-rw-rw-r-- 1 wallabot wallabot 340K dic 6 01:53 tocompress.tar-rw-rw-r-- 1 wallabot wallabot 52K dic 6 01:53 tocompress.tar.gz
Comprimir com zip

Outro comando para compactar com zip
, para compactar basta adicionar a flag -r
(recursivo), o nome que desejamos que tenha o arquivo compactado e o arquivo que desejamos compactar.
!zip -r tocompress.zip tocompress
adding: tocompress/ (stored 0%)adding: tocompress/lista.txt (deflated 23%)adding: tocompress/dot.txt (stored 0%)adding: tocompress/google.html (deflated 56%)adding: tocompress/index.html (stored 0%)adding: tocompress/Abc (stored 0%)adding: tocompress/google2.html (deflated 56%)adding: tocompress/dot2.txt (stored 0%)adding: tocompress/secuential.txt (stored 0%)adding: tocompress/index.html.1 (deflated 56%)adding: tocompress/file.txt (stored 0%)adding: tocompress/datos1 (stored 0%)adding: tocompress/2021-02-11-Introduccion-a-Python.ipynb (deflated 85%)adding: tocompress/datos123 (stored 0%)
!ls -lh
total 792K-rw-rw-r-- 1 wallabot wallabot 280K dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 15K dic 6 01:49 google2.html-rw-rw-r-- 1 wallabot wallabot 15K dic 6 01:48 google.html-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 15K dic 6 01:49 index.html.1-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 01:08 secuential.txtdrwxrwxr-x 2 wallabot wallabot 4,0K dic 6 01:52 tocompress-rw-rw-r-- 1 wallabot wallabot 340K dic 6 01:53 tocompress.tar-rw-rw-r-- 1 wallabot wallabot 52K dic 6 01:53 tocompress.tar.gz-rw-rw-r-- 1 wallabot wallabot 64K dic 6 01:53 tocompress.zip
Para descompactar usa o comando unzip
seguido do nome do arquivo que deseja descompactar. Primeiro apagamos a pasta tocompress
!rm -r tocompress
!unzip tocompress.zip
Archive: tocompress.zipcreating: tocompress/inflating: tocompress/lista.txtextracting: tocompress/dot.txtinflating: tocompress/google.htmlextracting: tocompress/index.htmlextracting: tocompress/Abcinflating: tocompress/google2.htmlextracting: tocompress/dot2.txtextracting: tocompress/secuential.txtinflating: tocompress/index.html.1extracting: tocompress/file.txtextracting: tocompress/datos1inflating: tocompress/2021-02-11-Introduccion-a-Python.ipynbextracting: tocompress/datos123
!ls -lh
total 792K-rw-rw-r-- 1 wallabot wallabot 280K dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 15K dic 6 01:49 google2.html-rw-rw-r-- 1 wallabot wallabot 15K dic 6 01:48 google.html-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 15K dic 6 01:49 index.html.1-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 01:08 secuential.txtdrwxrwxr-x 2 wallabot wallabot 4,0K dic 6 01:52 tocompress-rw-rw-r-- 1 wallabot wallabot 340K dic 6 01:53 tocompress.tar-rw-rw-r-- 1 wallabot wallabot 52K dic 6 01:53 tocompress.tar.gz-rw-rw-r-- 1 wallabot wallabot 64K dic 6 01:53 tocompress.zip
Processos em segundo plano e primeiro plano
Pausar um processo e movê-lo para o background com CTRL+Z

Quando executamos um processo no terminal, ele pode não parar de se executar e nós queremos continuar usando o terminal. Para resolver isso, podemos mover o processo para o segundo plano pressionando CTRL+Z
.
Por exemplo, posso fazer um ping para mim mesmo, sem especificar o número de tentativas, portanto, isso continuará sendo executado até que eu pare o processo pressionando CTRL+C
!ping localhost
PING localhost (127.0.0.1) 56(84) bytes of data.64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.025 ms64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.027 ms64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.024 ms64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.024 ms64 bytes from localhost (127.0.0.1): icmp_seq=5 ttl=64 time=0.027 ms64 bytes from localhost (127.0.0.1): icmp_seq=6 ttl=64 time=0.036 ms^C--- localhost ping statistics ---6 packets transmitted, 6 received, 0% packet loss, time 5127msrtt min/avg/max/mdev = 0.024/0.027/0.036/0.004 ms
No entanto, se o que queremos é pausar um momento o processo para poder continuar usando a terminal, temos que introduzir Ctrl+Z
!ping localhost
PING localhost (127.0.0.1) 56(84) bytes of data.64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.028 ms64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.020 ms64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.017 ms64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.025 ms64 bytes from localhost (127.0.0.1): icmp_seq=5 ttl=64 time=0.021 ms64 bytes from localhost (127.0.0.1): icmp_seq=6 ttl=64 time=0.055 ms^Z[1]+ Detenido ping localhost
Como indicado, o processo foi interrompido e não está em execução enquanto o coloco em segundo plano.
Ver os processos em segundo plano com jobs

Para ver quais processos estão em segundo plano, temos dois comandos, por um lado podemos usar jobs
!jobs
jobs[1]+ Detenido ping localhost
Este comando nos dá o processo e o número do job. Este número será o que deveremos usar para levar o processo ao foreground.
Ver os processos em segundo plano com ps

Outro comando que podemos usar é ps
(processos)
!ps
PID TTY TIME CMD16232 pts/3 00:00:00 bash17070 pts/3 00:00:00 ping18376 pts/3 00:00:00 ps
Este comando não só nos dá a informação dos processos que estão em segundo plano, mas de todos os processos que estão sendo executados na terminal.
É importante ressaltar que se abrirmos uma nova terminal e usarmos qualquer um desses comandos, não receberemos a informação do ping, pois o executamos em outra terminal.
!ps
PID TTY TIME CMD18993 pts/2 00:00:00 bash19290 pts/2 00:00:00 ps
Como vemos jobs
não retorna nada porque nesta terminal não há nenhum processo em segundo plano e ps
só nos retorna a informação do bash (a própria terminal) e o comando ps lançado.
Levar um processo do background para o foreground
Para trazer um processo para o foreground é necessário usar o comando fg
. Se quiser trazer o último processo enviado para o background, basta colocar fg
. Caso contrário, é preciso indicar o número do job.
Vamos a voltar a ver os processos que tínhamos em segundo plano
!jobs
[1]+ Detenido ping localhost
Podemos trazer este processo para o primeiro plano apenas escrevendo fg
ou indicando o número do trabalho com fg %1
!fg %1
ping localhost64 bytes from localhost (127.0.0.1): icmp_seq=7 ttl=64 time=0.032 ms64 bytes from localhost (127.0.0.1): icmp_seq=8 ttl=64 time=0.036 ms64 bytes from localhost (127.0.0.1): icmp_seq=9 ttl=64 time=0.045 ms64 bytes from localhost (127.0.0.1): icmp_seq=10 ttl=64 time=0.035 ms64 bytes from localhost (127.0.0.1): icmp_seq=11 ttl=64 time=0.031 ms
Executar um processo diretamente em segundo plano
Vamos a voltar a lançar agora o navegador Firefox escrevendo firefox
no terminal e pressionando CTRL+Z
para levá-lo ao fundo
!firefox
[GFX1-]: glxtest: VA-API test failed: failed to initialise VAAPI connection.[2022-11-29T06:16:17Z ERROR glean_core::metrics::ping] Invalid reason code startup for ping background-update^Z[1]+ Detenido firefox
Como vemos, diz que o processo foi interrompido, portanto, se quisermos navegar pelo Firefox agora não conseguimos, pois ele está interrompido.
Para poder lançar o Firefox e mantê-lo em segundo plano para que não bloqueie a terminal, é necessário escrever um &
no final do comando
!firefox &
[1] 23663$ [GFX1-]: glxtest: VA-API test failed: failed to initialise VAAPI connection.[2022-11-29T06:19:40Z ERROR glean_core::metrics::ping] Invalid reason code startup for ping background-update$
Agora lançamos o Firefox, ele nos diz seu número de job e fica em segundo plano executando.
Na verdade, se agora olharmos os processos, podemos ver que o estado do Firefox é *Executando*
!jobs
[1]+ Ejecutando firefox &
Terminar um processo que está em background
Como temos o Firefox rodando em segundo plano, se quisermos que ele termine, temos que usar kill
e o número do job do processo. Vamos usar jobs
para ver o número do job do Firefox.
!jobs
[1]+ Ejecutando firefox &
Seu número de trabalho é o 1, portanto usamos esse número para finalizar o processo.
!kill %1
Não nos responde nada, mas se usarmos jobs
novamente para ver os processos em segundo plano
!jobs
[1]+ Terminado firefox
Vemos que nos diz que o Firefox terminou; se voltarmos a executar jobs
já não aparecerá nada
!jobs
Processos em segundo plano independentes do terminal
Até agora vimos como executar processos em segundo plano dependentes da terminal, isso significa que, se enviarmos um processo para o segundo plano e fecharmos a terminal, este enviará uma mensagem de término a todos os processos que estão no seu segundo plano e eles terminarão.
Mas há vezes queremos que o processo fique em segundo plano, poder fechar a terminal, abrir outra e recuperar esse processo. Para isso, usaremos tmux
, que é um multiplexador de terminais.
Pode estar instalado, portanto, para instalá-lo, você precisa inserir o seguinte
sudo apt install tmux
Uma vez instalada, podemos criar uma nova sessão de tmux
através do tmux new -s <name>
tmux new -s session1
Isso nos abrirá uma nova terminal, que na verdade é uma sessão de tmux
Dentro dela podemos lançar um processo, por exemplo um ping
a nós mesmos
!ping localhost
PING localhost (127.0.0.1) 56(84) bytes of data.64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.036 ms64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.019 ms64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.031 ms
Podemos fechar esse terminal
Se abrirmos uma nova, podemos ver todas as sessões de tmux
abertas com o comando tmux ls
!tmux ls
session1: 1 windows (created Tue Nov 29 08:15:22 2022)
E podemos entrar em uma sessão através do comando tmux
, seguido de a
(anexar), -t
(tag) e o nome da sessão
!tmux a -t session1
64 bytes from localhost (127.0.0.1): icmp_seq=146 ttl=64 time=0.025 ms64 bytes from localhost (127.0.0.1): icmp_seq=147 ttl=64 time=0.022 ms64 bytes from localhost (127.0.0.1): icmp_seq=148 ttl=64 time=0.026 ms64 bytes from localhost (127.0.0.1): icmp_seq=149 ttl=64 time=0.013 ms64 bytes from localhost (127.0.0.1): icmp_seq=150 ttl=64 time=0.027 ms64 bytes from localhost (127.0.0.1): icmp_seq=151 ttl=64 time=0.019 ms
Como vemos, recuperamos o ping
de antes.
Quando estamos dentro de uma sessão, podemos sair dela (matando-a) escrevendo CTRL+D
ou escrevendo exit
Gerenciamento de processos
Para gerenciar os processos do nosso sistema temos várias opções
Manipulador de processos ps

Como vimos anteriormente, ps
nos dá os processos que estão rodando na nossa terminal. Por exemplo, executamos um processo em segundo plano e vemos os processos com ps
.
!firefox &
[1] 50555
Vemos agora os processos
!ps
PID TTY TIME CMD36660 pts/3 00:00:00 bash50555 pts/3 00:00:02 firefox50613 pts/3 00:00:00 Socket Process50635 pts/3 00:00:00 Privileged Cont50683 pts/3 00:00:00 WebExtensions50741 pts/3 00:00:00 Web Content50743 pts/3 00:00:00 Web Content50748 pts/3 00:00:00 Web Content50840 pts/3 00:00:00 ps
Uma vez que soubermos seu PID, podemos matar o processo
!kill 50555
Vemos agora os processos
!ps
PID TTY TIME CMD36660 pts/3 00:00:00 bash51132 pts/3 00:00:00 ps
Mas como dissemos, o problema do ps
é que ele só mostra os processos da sua terminal.
Para que nos mostre todos os processos do sistema temos que adicionar aux
terminal("ps aux", max_lines_output=10)
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.2 0.0 169936 13172 ? Ss 23:06 0:01 /sbin/init splashroot 2 0.0 0.0 0 0 ? S 23:06 0:00 [kthreadd]root 3 0.0 0.0 0 0 ? I< 23:06 0:00 [rcu_gp]root 4 0.0 0.0 0 0 ? I< 23:06 0:00 [rcu_par_gp]root 5 0.0 0.0 0 0 ? I< 23:06 0:00 [netns]root 7 0.0 0.0 0 0 ? I< 23:06 0:00 [kworker/0:0H-events_highpri]root 9 0.0 0.0 0 0 ? I< 23:06 0:00 [kworker/0:1H-events_highpri]root 10 0.0 0.0 0 0 ? I< 23:06 0:00 [mm_percpu_wq]root 11 0.0 0.0 0 0 ? S 23:06 0:00 [rcu_tasks_rude_]...wallabot 11094 0.0 0.2 1184730916 65900 ? Sl 23:19 0:00 /opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=5080 --enable-crash-reporter=, --change-stack-guard-on-fork=enable --lang=es --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=76 --time-ticks-at-unix-epoch=-1670018798736448 --launch-time-ticks=781545948 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 11428 0.3 0.2 38136100 75812 ? Sl 23:21 0:00 /usr/share/code/code --ms-enable-electron-run-as-node /usr/share/code/resources/app/extensions/markdown-language-features/server/dist/node/main --node-ipc --clientProcessId=8508root 11508 0.0 0.0 0 0 ? I 23:21 0:00 [kworker/4:1-events]wallabot 11683 0.0 0.0 14192 3380 ? R 23:22 0:00 ps aux
Agora, se eu quiser procurar apenas os processos que estão sendo executados pelo meu usuário, posso fazer isso criando um pipe
e pesquisando com grep
!ps aux | grep wallabot
avahi 802 0.0 0.0 8536 3912 ? Ss 23:06 0:00 avahi-daemon: running [wallabot.local]wallabot 1153 0.0 0.0 19856 10624 ? Ss 23:06 0:00 /lib/systemd/systemd --userwallabot 1154 0.0 0.0 170004 3680 ? S 23:06 0:00 (sd-pam)wallabot 1159 0.1 0.0 2569384 22808 ? S<sl 23:06 0:01 /usr/bin/pulseaudio --daemonize=no --log-target=journalwallabot 1161 0.1 0.1 591424 37248 ? SNsl 23:06 0:02 /usr/libexec/tracker-miner-fswallabot 1164 0.0 0.0 390744 8664 ? SLl 23:06 0:00 /usr/bin/gnome-keyring-daemon --daemonize --loginwallabot 1168 0.0 0.0 166804 6616 tty2 Ssl+ 23:06 0:00 /usr/lib/gdm3/gdm-x-session --run-script env GNOME_SHELL_SESSION_MODE=ubuntu /usr/bin/gnome-session --systemd --session=ubuntuwallabot 1173 0.0 0.0 8904 6012 ? Ss 23:06 0:00 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-onlywallabot 1181 0.0 0.0 242628 7884 ? Ssl 23:06 0:00 /usr/libexec/gvfsdwallabot 1196 0.0 0.0 378348 5544 ? Sl 23:06 0:00 /usr/libexec/gvfsd-fuse /run/user/1000/gvfs -f -o big_writeswallabot 1203 0.0 0.0 316896 9540 ? Ssl 23:06 0:00 /usr/libexec/gvfs-udisks2-volume-monitorwallabot 1209 0.0 0.0 319540 8920 ? Ssl 23:06 0:00 /usr/libexec/gvfs-afc-volume-monitorwallabot 1215 0.0 0.0 238612 5476 ? Ssl 23:06 0:00 /usr/libexec/gvfs-mtp-volume-monitorwallabot 1220 0.0 0.0 239456 6988 ? Ssl 23:06 0:00 /usr/libexec/gvfs-goa-volume-monitorwallabot 1224 0.0 0.2 707176 69244 ? SLl 23:06 0:00 /usr/libexec/goa-daemonwallabot 1231 0.0 0.0 317692 9068 ? Sl 23:06 0:00 /usr/libexec/goa-identity-servicewallabot 1237 0.0 0.0 240888 6244 ? Ssl 23:06 0:00 /usr/libexec/gvfs-gphoto2-volume-monitorwallabot 1308 0.0 0.0 190872 13688 tty2 Sl+ 23:06 0:00 /usr/libexec/gnome-session-binary --systemd --systemd --session=ubuntuwallabot 1375 0.0 0.0 6040 452 ? Ss 23:06 0:00 /usr/bin/ssh-agent /usr/bin/im-launch env GNOME_SHELL_SESSION_MODE=ubuntu /usr/bin/gnome-session --systemd --session=ubuntuwallabot 1394 0.0 0.0 305428 6572 ? Ssl 23:06 0:00 /usr/libexec/at-spi-bus-launcherwallabot 1399 0.0 0.0 7380 4240 ? S 23:06 0:00 /usr/bin/dbus-daemon --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork --print-address 3wallabot 1405 0.0 0.0 92852 4228 ? Ssl 23:06 0:00 /usr/libexec/gnome-session-ctl --monitorwallabot 1412 0.0 0.0 414004 16532 ? Ssl 23:06 0:00 /usr/libexec/gnome-session-binary --systemd-service --session=ubuntuwallabot 1426 3.7 1.2 5576364 425284 ? Rsl 23:06 0:41 /usr/bin/gnome-shellwallabot 1476 0.0 0.0 387612 8436 ? Sl 23:06 0:00 ibus-daemon --panel disable --ximwallabot 1480 0.0 0.0 165628 7060 ? Sl 23:06 0:00 /usr/libexec/ibus-memconfwallabot 1481 0.0 0.0 276012 29224 ? Sl 23:06 0:00 /usr/libexec/ibus-extension-gtk3wallabot 1483 0.0 0.0 196832 24676 ? Sl 23:06 0:00 /usr/libexec/ibus-x11 --kill-daemonwallabot 1486 0.0 0.0 239400 7244 ? Sl 23:06 0:00 /usr/libexec/ibus-portalwallabot 1498 0.0 0.0 162916 6508 ? Sl 23:06 0:00 /usr/libexec/at-spi2-registryd --use-gnome-sessionwallabot 1502 0.0 0.0 238512 5936 ? Ssl 23:06 0:00 /usr/libexec/xdg-permission-storewallabot 1504 0.0 0.0 862476 24084 ? Sl 23:06 0:00 /usr/libexec/gnome-shell-calendar-serverwallabot 1513 0.0 0.0 618416 32636 ? Ssl 23:06 0:00 /usr/libexec/evolution-source-registrywallabot 1521 0.0 0.0 156476 5716 ? Sl 23:06 0:00 /usr/libexec/dconf-servicewallabot 1524 0.0 0.0 165712 7076 ? Ssl 23:06 0:00 /usr/libexec/gvfsd-metadatawallabot 1535 0.0 0.1 1680828 49932 ? Ssl 23:06 0:00 /usr/libexec/evolution-calendar-factorywallabot 1551 0.0 0.0 676260 30636 ? Ssl 23:06 0:00 /usr/libexec/evolution-addressbook-factorywallabot 1585 0.0 0.0 2933212 27180 ? Sl 23:06 0:00 /usr/bin/gjs /usr/share/gnome-shell/org.gnome.Shell.Notificationswallabot 1597 0.0 0.0 316920 7980 ? Sl 23:06 0:00 /usr/libexec/gvfsd-trash --spawner :1.4 /org/gtk/gvfs/exec_spaw/0wallabot 1612 0.0 0.0 312652 6796 ? Ssl 23:06 0:00 /usr/libexec/gsd-a11y-settingswallabot 1613 0.0 0.0 587548 27164 ? Ssl 23:06 0:00 /usr/libexec/gsd-colorwallabot 1614 0.0 0.0 376604 16508 ? Ssl 23:06 0:00 /usr/libexec/gsd-datetimewallabot 1616 0.0 0.0 314840 7876 ? Ssl 23:06 0:00 /usr/libexec/gsd-housekeepingwallabot 1619 0.0 0.0 344796 25276 ? Ssl 23:06 0:00 /usr/libexec/gsd-keyboardwallabot 1623 0.0 0.0 900140 28012 ? Ssl 23:06 0:00 /usr/libexec/gsd-media-keyswallabot 1627 0.0 0.0 418936 25736 ? Ssl 23:06 0:00 /usr/libexec/gsd-powerwallabot 1629 0.0 0.0 251196 11384 ? Ssl 23:06 0:00 /usr/libexec/gsd-print-notificationswallabot 1630 0.0 0.0 459940 6088 ? Ssl 23:06 0:00 /usr/libexec/gsd-rfkillwallabot 1632 0.0 0.0 238348 6344 ? Ssl 23:06 0:00 /usr/libexec/gsd-screensaver-proxywallabot 1633 0.0 0.0 467776 11088 ? Ssl 23:06 0:00 /usr/libexec/gsd-sharingwallabot 1634 0.0 0.0 318156 10452 ? Ssl 23:06 0:00 /usr/libexec/gsd-smartcardwallabot 1636 0.0 0.0 322344 9400 ? Ssl 23:06 0:00 /usr/libexec/gsd-soundwallabot 1637 0.0 0.0 461692 7252 ? Ssl 23:06 0:00 /usr/libexec/gsd-usb-protectionwallabot 1640 0.0 0.0 344332 24372 ? Ssl 23:06 0:00 /usr/libexec/gsd-wacomwallabot 1643 0.0 0.0 390820 8260 ? Ssl 23:06 0:00 /usr/libexec/gsd-wwanwallabot 1644 0.0 0.0 345572 25980 ? Ssl 23:06 0:00 /usr/libexec/gsd-xsettingswallabot 1649 0.0 0.2 1227284 75100 ? Sl 23:06 0:00 /usr/libexec/evolution-data-server/evolution-alarm-notifywallabot 1673 0.0 0.1 413288 60304 ? Sl 23:06 0:00 /usr/bin/python3 /usr/bin/solaarwallabot 1692 0.0 0.0 231804 5972 ? Sl 23:06 0:00 /usr/libexec/gsd-disk-utility-notifywallabot 1730 0.0 0.0 165620 7028 ? Sl 23:06 0:00 /usr/libexec/ibus-engine-simplewallabot 1739 0.0 0.0 438456 19104 ? Sl 23:06 0:00 /usr/libexec/gvfsd-http --spawner :1.4 /org/gtk/gvfs/exec_spaw/1wallabot 1748 0.4 0.6 1242548 217144 ? Sl 23:06 0:04 /snap/snap-store/599/usr/bin/snap-store --gapplication-servicewallabot 1760 0.0 0.0 345020 15016 ? Sl 23:06 0:00 /usr/libexec/gsd-printerwallabot 1797 0.0 0.0 608052 6664 ? Ssl 23:06 0:00 /usr/libexec/xdg-document-portalwallabot 2170 0.0 0.0 612960 11060 ? Ssl 23:06 0:00 /usr/libexec/xdg-desktop-portalwallabot 2174 0.0 0.0 493648 26488 ? Ssl 23:06 0:00 /usr/libexec/xdg-desktop-portal-gtkwallabot 4839 0.0 0.0 420020 28340 ? Sl 23:07 0:00 update-notifierwallabot 5019 0.0 0.0 436628 21644 ? Sl 23:08 0:00 /usr/libexec/gvfsd-google --spawner :1.4 /org/gtk/gvfs/exec_spaw/2wallabot 5072 3.2 1.1 34219664 391492 ? SLl 23:08 0:32 /opt/google/chrome/chromewallabot 5077 0.0 0.0 10844 580 ? S 23:08 0:00 catwallabot 5078 0.0 0.0 10844 516 ? S 23:08 0:00 catwallabot 5080 0.0 0.0 33576132 3140 ? Sl 23:08 0:00 /opt/google/chrome/chrome_crashpad_handler --monitor-self --monitor-self-annotation=ptype=crashpad-handler --database=/home/wallabot/.config/google-chrome/Crash Reports --url=https://clients2.google.com/cr/report --annotation=channel= --annotation=lsb-release=Ubuntu 20.04.5 LTS --annotation=plat=Linux --annotation=prod=Chrome_Linux --annotation=ver=108.0.5359.71 --initial-client-fd=5 --shared-client-connectionwallabot 5082 0.0 0.0 33567920 2952 ? Sl 23:08 0:00 /opt/google/chrome/chrome_crashpad_handler --no-periodic-tasks --monitor-self-annotation=ptype=crashpad-handler --database=/home/wallabot/.config/google-chrome/Crash Reports --url=https://clients2.google.com/cr/report --annotation=channel= --annotation=lsb-release=Ubuntu 20.04.5 LTS --annotation=plat=Linux --annotation=prod=Chrome_Linux --annotation=ver=108.0.5359.71 --initial-client-fd=4 --shared-client-connectionwallabot 5088 0.0 0.1 33854440 59168 ? S 23:08 0:00 /opt/google/chrome/chrome --type=zygote --no-zygote-sandbox --crashpad-handler-pid=5080 --enable-crash-reporter=, --change-stack-guard-on-fork=enablewallabot 5089 0.0 0.1 33854436 59068 ? S 23:08 0:00 /opt/google/chrome/chrome --type=zygote --crashpad-handler-pid=5080 --enable-crash-reporter=, --change-stack-guard-on-fork=enablewallabot 5090 0.0 0.0 33568428 5024 ? S 23:08 0:00 /opt/google/chrome/nacl_helperwallabot 5093 0.0 0.0 33854460 16384 ? S 23:08 0:00 /opt/google/chrome/chrome --type=zygote --crashpad-handler-pid=5080 --enable-crash-reporter=, --change-stack-guard-on-fork=enablewallabot 5123 6.0 0.8 34211392 285560 ? Sl 23:08 1:00 /opt/google/chrome/chrome --type=gpu-process --crashpad-handler-pid=5080 --enable-crash-reporter=, --change-stack-guard-on-fork=enable --gpu-preferences=WAAAAAAAAAAgAAAIAAAAAAAAAAAAAAAAAABgAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAIAAAAAAAAAABAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAIAAAAAAAAAA== --shared-files --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 5124 0.6 0.3 33918264 119584 ? Sl 23:08 0:06 /opt/google/chrome/chrome --type=utility --utility-sub-type=network.mojom.NetworkService --lang=es --service-sandbox-type=none --crashpad-handler-pid=5080 --enable-crash-reporter=, --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 5136 0.0 0.1 33895840 52500 ? Sl 23:08 0:00 /opt/google/chrome/chrome --type=utility --utility-sub-type=storage.mojom.StorageService --lang=es --service-sandbox-type=utility --crashpad-handler-pid=5080 --enable-crash-reporter=, --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 5155 0.1 0.4 1184797648 132208 ? Sl 23:08 0:01 /opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=5080 --enable-crash-reporter=, --extension-process --change-stack-guard-on-fork=enable --lang=es --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=5 --time-ticks-at-unix-epoch=-1670018798736448 --launch-time-ticks=121160165 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 5171 4.5 0.6 1188020280 229028 ? Sl 23:08 0:44 /opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=5080 --enable-crash-reporter=, --change-stack-guard-on-fork=enable --lang=es --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=27 --time-ticks-at-unix-epoch=-1670018798736448 --launch-time-ticks=121254783 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 5228 0.0 0.2 1184772236 89352 ? Sl 23:08 0:00 /opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=5080 --enable-crash-reporter=, --extension-process --change-stack-guard-on-fork=enable --lang=es --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=6 --time-ticks-at-unix-epoch=-1670018798736448 --launch-time-ticks=121309474 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 5247 0.0 0.2 1184788292 86368 ? Sl 23:08 0:00 /opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=5080 --enable-crash-reporter=, --extension-process --change-stack-guard-on-fork=enable --lang=es --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=7 --time-ticks-at-unix-epoch=-1670018798736448 --launch-time-ticks=121342017 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 5274 0.3 0.4 1184796488 155056 ? Sl 23:08 0:03 /opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=5080 --enable-crash-reporter=, --extension-process --change-stack-guard-on-fork=enable --lang=es --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=8 --time-ticks-at-unix-epoch=-1670018798736448 --launch-time-ticks=121354013 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 5294 0.1 0.3 1184797648 123536 ? Sl 23:08 0:01 /opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=5080 --enable-crash-reporter=, --extension-process --change-stack-guard-on-fork=enable --lang=es --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=9 --time-ticks-at-unix-epoch=-1670018798736448 --launch-time-ticks=121366454 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 5300 0.0 0.2 1184771900 88048 ? Sl 23:08 0:00 /opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=5080 --enable-crash-reporter=, --extension-process --change-stack-guard-on-fork=enable --lang=es --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=10 --time-ticks-at-unix-epoch=-1670018798736448 --launch-time-ticks=121370528 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 5325 0.0 0.1 34023608 34500 ? S 23:08 0:00 /opt/google/chrome/chrome --type=brokerwallabot 5343 0.0 0.3 1184780096 98820 ? Sl 23:08 0:00 /opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=5080 --enable-crash-reporter=, --extension-process --change-stack-guard-on-fork=enable --lang=es --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=45 --time-ticks-at-unix-epoch=-1670018798736448 --launch-time-ticks=121454617 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 5381 0.0 0.0 197896 29728 ? Sl 23:08 0:00 /usr/bin/python3 /usr/bin/chrome-gnome-shell chrome-extension://gphhapmejobijbbhgpjhcjognlahblep/wallabot 5467 0.8 0.5 1185857508 194536 ? Sl 23:08 0:08 /opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=5080 --enable-crash-reporter=, --change-stack-guard-on-fork=enable --lang=es --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=48 --time-ticks-at-unix-epoch=-1670018798736448 --launch-time-ticks=122388284 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 5547 0.0 0.2 34155852 77000 ? Sl 23:08 0:00 /opt/google/chrome/chrome --type=utility --utility-sub-type=audio.mojom.AudioService --lang=es --service-sandbox-type=none --crashpad-handler-pid=5080 --enable-crash-reporter=, --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 5584 0.0 0.3 1184798704 126008 ? Sl 23:08 0:00 /opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=5080 --enable-crash-reporter=, --change-stack-guard-on-fork=enable --lang=es --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=40 --time-ticks-at-unix-epoch=-1670018798736448 --launch-time-ticks=127275168 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 5590 0.1 0.4 1184799064 148824 ? Sl 23:08 0:01 /opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=5080 --enable-crash-reporter=, --change-stack-guard-on-fork=enable --lang=es --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=28 --time-ticks-at-unix-epoch=-1670018798736448 --launch-time-ticks=127276723 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 5592 8.3 0.8 1187976688 283688 ? Sl 23:08 1:22 /opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=5080 --enable-crash-reporter=, --change-stack-guard-on-fork=enable --lang=es --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=30 --time-ticks-at-unix-epoch=-1670018798736448 --launch-time-ticks=127278497 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 5636 0.0 0.3 1184805876 122780 ? Sl 23:08 0:00 /opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=5080 --enable-crash-reporter=, --change-stack-guard-on-fork=enable --lang=es --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=51 --time-ticks-at-unix-epoch=-1670018798736448 --launch-time-ticks=127293028 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 5753 0.0 0.3 1184796632 104664 ? Sl 23:08 0:00 /opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=5080 --enable-crash-reporter=, --change-stack-guard-on-fork=enable --lang=es --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=52 --time-ticks-at-unix-epoch=-1670018798736448 --launch-time-ticks=129692647 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 5788 3.0 0.8 1185884504 276332 ? Sl 23:08 0:29 /opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=5080 --enable-crash-reporter=, --change-stack-guard-on-fork=enable --lang=es --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=19 --time-ticks-at-unix-epoch=-1670018798736448 --launch-time-ticks=130329055 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 5828 1.9 0.9 1184827212 309156 ? Sl 23:08 0:19 /opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=5080 --enable-crash-reporter=, --change-stack-guard-on-fork=enable --lang=es --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=22 --time-ticks-at-unix-epoch=-1670018798736448 --launch-time-ticks=131345480 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 5846 0.6 0.6 1184844960 207484 ? Sl 23:08 0:06 /opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=5080 --enable-crash-reporter=, --change-stack-guard-on-fork=enable --lang=es --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=36 --time-ticks-at-unix-epoch=-1670018798736448 --launch-time-ticks=131537892 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 6066 0.5 0.6 1184828968 220584 ? Sl 23:08 0:05 /opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=5080 --enable-crash-reporter=, --change-stack-guard-on-fork=enable --lang=es --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=35 --time-ticks-at-unix-epoch=-1670018798736448 --launch-time-ticks=135569943 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 6120 0.0 0.0 43992 6552 ? Ss 23:08 0:00 /usr/lib/bluetooth/obexdwallabot 6134 0.4 0.7 1184856952 230428 ? Sl 23:08 0:04 /opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=5080 --enable-crash-reporter=, --change-stack-guard-on-fork=enable --lang=es --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=34 --time-ticks-at-unix-epoch=-1670018798736448 --launch-time-ticks=136358048 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 6524 0.4 0.6 1184857312 226988 ? Sl 23:08 0:04 /opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=5080 --enable-crash-reporter=, --change-stack-guard-on-fork=enable --lang=es --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=33 --time-ticks-at-unix-epoch=-1670018798736448 --launch-time-ticks=139865567 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 8034 0.0 0.1 1064452 54580 ? Sl 23:10 0:00 /usr/bin/gnome-calendar --gapplication-servicewallabot 8158 0.7 0.7 3981248 239132 ? Sl 23:10 0:07 /snap/spotify/60/usr/share/spotify/spotifywallabot 8242 0.0 0.2 647244 77376 ? S 23:10 0:00 /snap/spotify/60/usr/share/spotify/spotify --type=zygote --no-zygote-sandbox --no-sandbox --log-severity=disable --user-agent-product=Chrome/99.0.4844.84 Spotify/1.1.84.716 --lang=en --user-data-dir=/home/wallabot/snap/spotify/60/.config/spotify/User Data --log-file=/snap/spotify/60/usr/share/spotify/debug.logwallabot 8243 0.0 0.2 647244 77100 ? S 23:10 0:00 /snap/spotify/60/usr/share/spotify/spotify --type=zygote --no-sandbox --log-severity=disable --user-agent-product=Chrome/99.0.4844.84 Spotify/1.1.84.716 --lang=en --user-data-dir=/home/wallabot/snap/spotify/60/.config/spotify/User Data --log-file=/snap/spotify/60/usr/share/spotify/debug.logwallabot 8259 0.1 0.3 2041284 114252 ? Sl 23:10 0:01 /snap/spotify/60/usr/share/spotify/spotify --type=gpu-process --no-sandbox --log-severity=disable --user-agent-product=Chrome/99.0.4844.84 Spotify/1.1.84.716 --lang=en --user-data-dir=/home/wallabot/snap/spotify/60/.config/spotify/User Data --gpu-preferences=UAAAAAAAAAAgAAAIAAAAAAAAAAAAAAAAAABgAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABgAAAAAAAAAGAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAACAAAAAAAAAA= --log-file=/snap/spotify/60/usr/share/spotify/debug.log --shared-files --field-trial-handle=0,i,8625640855432007833,7773453088797360000,131072wallabot 8274 0.0 0.1 868700 34104 ? Sl 23:10 0:00 /snap/spotify/60/usr/share/spotify/spotify --type=utility --utility-sub-type=storage.mojom.StorageService --lang=en-US --service-sandbox-type=utility --no-sandbox --log-severity=disable --user-agent-product=Chrome/99.0.4844.84 Spotify/1.1.84.716 --lang=en --user-data-dir=/home/wallabot/snap/spotify/60/.config/spotify/User Data --log-file=/snap/spotify/60/usr/share/spotify/debug.log --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,8625640855432007833,7773453088797360000,131072wallabot 8279 0.0 0.3 1148480 99680 ? Sl 23:10 0:00 /snap/spotify/60/usr/share/spotify/spotify --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --no-sandbox --log-severity=disable --user-agent-product=Chrome/99.0.4844.84 Spotify/1.1.84.716 --lang=en --user-data-dir=/home/wallabot/snap/spotify/60/.config/spotify/User Data --log-file=/snap/spotify/60/usr/share/spotify/debug.log --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,8625640855432007833,7773453088797360000,131072wallabot 8319 0.5 0.5 31646352 187140 ? Sl 23:10 0:05 /snap/spotify/60/usr/share/spotify/spotify --type=renderer --log-severity=disable --user-agent-product=Chrome/99.0.4844.84 Spotify/1.1.84.716 --disable-spell-checking --user-data-dir=/home/wallabot/snap/spotify/60/.config/spotify/User Data --no-sandbox --log-file=/snap/spotify/60/usr/share/spotify/debug.log --lang=en-US --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=5 --launch-time-ticks=210215195 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,8625640855432007833,7773453088797360000,131072wallabot 8377 0.5 0.4 38371288 161752 ? SLl 23:10 0:05 /usr/share/code/code --unity-launch --enable-crashpadwallabot 8391 0.0 0.1 33775112 48516 ? S 23:10 0:00 /usr/share/code/code --type=zygote --no-zygote-sandbox --enable-crashpad --enable-crashpadwallabot 8392 0.0 0.1 33775096 48304 ? S 23:10 0:00 /usr/share/code/code --type=zygote --enable-crashpad --enable-crashpadwallabot 8394 0.0 0.0 33775124 12448 ? S 23:10 0:00 /usr/share/code/code --type=zygote --enable-crashpad --enable-crashpadwallabot 8407 0.0 0.0 33575984 3384 ? Sl 23:10 0:00 /usr/share/code/chrome_crashpad_handler --monitor-self-annotation=ptype=crashpad-handler --no-rate-limit --database=/home/wallabot/.config/Code/Crashpad --url=appcenter://code?aid=fba07a4d-84bd-4fc8-a125-9640fc8ce171&uid=e1be826f-73fb-46c2-a439-9bb52643ccc1&iid=e1be826f-73fb-46c2-a439-9bb52643ccc1&sid=e1be826f-73fb-46c2-a439-9bb52643ccc1 --annotation=_companyName=Microsoft --annotation=_productName=VSCode --annotation=_version=1.73.1 --annotation=lsb-release=Ubuntu 20.04.5 LTS --annotation=plat=Linux --annotation=prod=Electron --annotation=ver=19.0.17 --initial-client-fd=43 --shared-client-connectionwallabot 8425 1.5 0.5 33985512 195464 ? Sl 23:10 0:14 /usr/share/code/code --type=gpu-process --enable-crashpad --crashpad-handler-pid=8407 --enable-crash-reporter=7a83c65f-14e6-4aa2-9df9-71fc458479f5,no_channel --user-data-dir=/home/wallabot/.config/Code --gpu-preferences=WAAAAAAAAAAgAAAIAAAAAAAAAAAAAAAAAABgAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAIAAAAAAAAAABAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAIAAAAAAAAAA== --shared-files --field-trial-handle=0,i,8890103601020485358,15523745040863579529,131072 --disable-features=CalculateNativeWinOcclusion,SpareRendererForSitePerProcesswallabot 8429 0.0 0.2 33840968 66520 ? Sl 23:10 0:00 /usr/share/code/code --type=utility --utility-sub-type=network.mojom.NetworkService --lang=es --service-sandbox-type=none --enable-crashpad --crashpad-handler-pid=8407 --enable-crash-reporter=7a83c65f-14e6-4aa2-9df9-71fc458479f5,no_channel --user-data-dir=/home/wallabot/.config/Code --standard-schemes=vscode-webview,vscode-file --secure-schemes=vscode-webview,vscode-file --bypasscsp-schemes --cors-schemes=vscode-webview,vscode-file --fetch-schemes=vscode-webview,vscode-file --service-worker-schemes=vscode-webview --streaming-schemes --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,8890103601020485358,15523745040863579529,131072 --disable-features=CalculateNativeWinOcclusion,SpareRendererForSitePerProcess --enable-crashpadwallabot 8439 0.0 0.0 33851528 23624 ? S 23:10 0:00 /usr/share/code/code --type=brokerwallabot 8449 8.5 1.1 61424852 390980 ? Sl 23:10 1:16 /usr/share/code/code --type=renderer --enable-crashpad --crashpad-handler-pid=8407 --enable-crash-reporter=7a83c65f-14e6-4aa2-9df9-71fc458479f5,no_channel --user-data-dir=/home/wallabot/.config/Code --standard-schemes=vscode-webview,vscode-file --secure-schemes=vscode-webview,vscode-file --bypasscsp-schemes --cors-schemes=vscode-webview,vscode-file --fetch-schemes=vscode-webview,vscode-file --service-worker-schemes=vscode-webview --streaming-schemes --app-path=/usr/share/code/resources/app --no-sandbox --no-zygote --enable-blink-features=HighlightAPI --lang=es --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=4 --launch-time-ticks=217445761 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,8890103601020485358,15523745040863579529,131072 --disable-features=CalculateNativeWinOcclusion,SpareRendererForSitePerProcess --vscode-window-config=vscode:13905479-a7dd-4e24-9b88-cf580c42a25d --enable-crashpadwallabot 8508 1.4 0.8 59175788 268364 ? Sl 23:10 0:12 /usr/share/code/code --ms-enable-electron-run-as-node --inspect-port=0 /usr/share/code/resources/app/out/bootstrap-fork --type=extensionHost --skipWorkspaceStorageLockwallabot 8566 0.1 0.2 38136100 81468 ? Sl 23:10 0:01 /usr/share/code/code --ms-enable-electron-run-as-node /home/wallabot/.vscode/extensions/kisstkondoros.vscode-gutter-preview-0.30.0/dist/server.js --node-ipc --clientProcessId=8508wallabot 8575 0.6 0.4 46670736 139408 ? Sl 23:10 0:05 /usr/share/code/code --type=renderer --enable-crashpad --crashpad-handler-pid=8407 --enable-crash-reporter=7a83c65f-14e6-4aa2-9df9-71fc458479f5,no_channel --user-data-dir=/home/wallabot/.config/Code --standard-schemes=vscode-webview,vscode-file --secure-schemes=vscode-webview,vscode-file --bypasscsp-schemes --cors-schemes=vscode-webview,vscode-file --fetch-schemes=vscode-webview,vscode-file --service-worker-schemes=vscode-webview --streaming-schemes --app-path=/usr/share/code/resources/app --no-sandbox --no-zygote --node-integration-in-worker --lang=es --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=5 --launch-time-ticks=219833707 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,8890103601020485358,15523745040863579529,131072 --disable-features=CalculateNativeWinOcclusion,SpareRendererForSitePerProcess --vscode-window-config=vscode:be96c98d-9154-449a-b127-c0211495f4ef --vscode-window-kind=shared-process --enable-crashpadwallabot 8593 0.0 0.2 38177772 78236 ? Sl 23:10 0:00 /usr/share/code/code --ms-enable-electron-run-as-node /usr/share/code/resources/app/out/bootstrap-fork --type=ptyHost --logsPath /home/wallabot/.config/Code/logs/20221202T231016wallabot 8632 0.0 0.2 38185752 94568 ? Sl 23:10 0:00 /usr/share/code/code --ms-enable-electron-run-as-node /usr/share/code/resources/app/out/bootstrap-fork --type=fileWatcherwallabot 8656 0.6 0.5 42430176 182480 ? Sl 23:10 0:05 /usr/share/code/code --type=renderer --enable-crashpad --crashpad-handler-pid=8407 --enable-crash-reporter=7a83c65f-14e6-4aa2-9df9-71fc458479f5,no_channel --user-data-dir=/home/wallabot/.config/Code --standard-schemes=vscode-webview,vscode-file --secure-schemes=vscode-webview,vscode-file --bypasscsp-schemes --cors-schemes=vscode-webview,vscode-file --fetch-schemes=vscode-webview,vscode-file --service-worker-schemes=vscode-webview --streaming-schemes --app-path=/usr/share/code/resources/app --enable-sandbox --enable-blink-features=HighlightAPI --lang=es --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=6 --launch-time-ticks=220495638 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,8890103601020485358,15523745040863579529,131072 --disable-features=CalculateNativeWinOcclusion,SpareRendererForSitePerProcess --vscode-window-config=vscode:13905479-a7dd-4e24-9b88-cf580c42a25dwallabot 8716 1.4 0.5 38140204 169984 ? Sl 23:10 0:12 /usr/share/code/code --ms-enable-electron-run-as-node /home/wallabot/.vscode/extensions/ms-python.vscode-pylance-2022.11.40/dist/server.bundle.js --cancellationReceive=file:3646d9eb9edaa1bd82425403564df0006a57a0df01 --node-ipc --clientProcessId=8508wallabot 8744 0.1 0.3 38140204 104772 ? Sl 23:10 0:01 /usr/share/code/code --ms-enable-electron-run-as-node /home/wallabot/.vscode/extensions/ms-python.vscode-pylance-2022.11.40/dist/server.bundle.js --cancellationReceive=file:f832ffa59d80abd5b35e8851e94332c285b2c3f9bb --node-ipc --clientProcessId=8508wallabot 8781 0.1 0.2 480956 77852 ? Sl 23:10 0:01 /home/wallabot/anaconda3/bin/python -m ipykernel_launcher --ip=127.0.0.1 --stdin=9003 --control=9001 --hb=9000 --Session.signature_scheme="hmac-sha256" --Session.key=b"c6d890f5-5fb6-41d8-9a66-32d953505406" --shell=9002 --transport="tcp" --iopub=9004 --f=/home/wallabot/.local/share/jupyter/runtime/kernel-v2-8508kHWtNFMgKsBL.jsonwallabot 8788 0.0 0.0 116624 29744 ? Sl 23:10 0:00 /bin/python3 /home/wallabot/.vscode/extensions/ms-python.isort-2022.8.0/bundled/tool/server.pywallabot 8898 0.6 0.4 38144304 146508 ? Sl 23:10 0:05 /usr/share/code/code --ms-enable-electron-run-as-node /home/wallabot/.vscode/extensions/ms-python.vscode-pylance-2022.11.40/dist/server.bundle.js --cancellationReceive=file:f57d6ea9bb6b4fa6ae2a6938661d2443c126a7b3df --node-ipc --clientProcessId=8508wallabot 8911 0.0 0.2 38136100 70604 ? Sl 23:10 0:00 /usr/share/code/code --ms-enable-electron-run-as-node /usr/share/code/resources/app/extensions/json-language-features/server/dist/node/jsonServerMain --node-ipc --clientProcessId=8508wallabot 8932 0.0 0.0 13648 5412 pts/0 Ss+ 23:10 0:00 /usr/bin/bash --init-file /usr/share/code/resources/app/out/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.shwallabot 9112 0.0 0.1 816596 50392 ? Ssl 23:10 0:00 /usr/libexec/gnome-terminal-serverwallabot 9120 0.0 0.0 13628 5212 pts/1 Ss+ 23:10 0:00 bashwallabot 10927 0.0 0.3 1184807108 117996 ? Sl 23:19 0:00 /opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=5080 --enable-crash-reporter=, --change-stack-guard-on-fork=enable --lang=es --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=72 --time-ticks-at-unix-epoch=-1670018798736448 --launch-time-ticks=743183717 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 11428 0.1 0.2 38136100 74884 ? Sl 23:21 0:00 /usr/share/code/code --ms-enable-electron-run-as-node /usr/share/code/resources/app/extensions/markdown-language-features/server/dist/node/main --node-ipc --clientProcessId=8508wallabot 12009 0.0 0.2 1184730916 65832 ? Sl 23:24 0:00 /opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=5080 --enable-crash-reporter=, --change-stack-guard-on-fork=enable --lang=es --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=80 --time-ticks-at-unix-epoch=-1670018798736448 --launch-time-ticks=1081580044 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,18391862866948577032,30807856093711604,131072wallabot 12109 0.0 0.0 2616 596 pts/2 Ss+ 23:25 0:00 /usr/bin/sh -c ps aux | grep wallabotwallabot 12110 0.0 0.0 14192 3560 pts/2 R+ 23:25 0:00 ps auxwallabot 12111 0.0 0.0 11668 660 pts/2 S+ 23:25 0:00 grep wallabot
Manipulador de processos top

Com top
podemos ver todos os processos do sistema operacional. Ele mostrará a informação com less
, portanto, assim como foi explicado anteriormente, quando se quiser parar o top
, pressionando q
irá parar.
!top
top - 09:31:32 up 3:21, 1 user, load average: 2,42, 2,79, 2,48Tareas: 382 total, 1 ejecutar, 381 hibernar, 0 detener, 0 zombie%Cpu(s): 14,2 usuario, 1,5 sist, 0,0 adecuado, 84,3 inact, 0,0 en espera, 0,MiB Mem : 32006,4 total, 20281,8 libre, 6229,0 usado, 5495,6 búfer/cachéMiB Intercambio: 2048,0 total, 2048,0 libre, 0,0 usado. 24979,1 disponPID USUARIO PR NI VIRT RES SHR S %CPU %MEM HORA+ ORDEN10192 wallabot 20 0 3347636 388848 84140 S 137,5 1,2 282:24.59 python44161 wallabot 20 0 30,2g 217208 100148 S 12,5 0,7 0:40.92 spotify76 root 20 0 0 0 0 S 6,2 0,0 0:00.12 ksoftir+1105 root -51 0 0 0 0 S 6,2 0,0 2:54.29 irq/125+43990 wallabot 20 0 3998836 246260 145800 S 6,2 0,8 0:53.69 spotify44101 wallabot 20 0 1995108 130316 89848 S 6,2 0,4 0:08.34 spotify51510 wallabot 20 0 14876 4088 3288 R 6,2 0,0 0:00.01 top1 root 20 0 169736 13188 8380 S 0,0 0,0 0:01.51 systemd2 root 20 0 0 0 0 S 0,0 0,0 0:00.00 kthreadd3 root 0 -20 0 0 0 I 0,0 0,0 0:00.00 rcu_gp4 root 0 -20 0 0 0 I 0,0 0,0 0:00.00 rcu_par+5 root 0 -20 0 0 0 I 0,0 0,0 0:00.00 netns7 root 0 -20 0 0 0 I 0,0 0,0 0:00.00 kworker+9 root 0 -20 0 0 0 I 0,0 0,0 0:00.03 kworker+10 root 0 -20 0 0 0 I 0,0 0,0 0:00.00 mm_perc+11 root 20 0 0 0 0 S 0,0 0,0 0:00.00 rcu_tas+12 root 20 0 0 0 0 S 0,0 0,0 0:00.00 rcu_tas+
Como se pode ver, o PID
44161 é o Spotify, que estou usando agora para tocar música, mas com ps
não o tínhamos visto.
Assim como antes, se quisermos matar um processo devemos inserir kill
e seu PID
O bom do top é que nos dá muitas mais utilidades; se pressionarmos h
ele mostrará a ajuda
!h
Help for Interactive Commands - procps-ng 3.3.16Window 1:Def: Cumulative mode Apagado. System: Delay 3,0 secs; Secure mode ApagZ,B,E,e Global: 'Z' colors; 'B' bold; 'E'/'e' summary/task memory scalel,t,m Toggle Summary: 'l' load avg; 't' task/cpu stats; 'm' memory info0,1,2,3,I Toggle: '0' zeros; '1/2/3' cpus or numa node views; 'I' Irix modef,F,X Fields: 'f'/'F' add/remove/order/sort; 'X' increase fixed-widthL,&,<,> . Locate: 'L'/'&' find/again; Move sort column: '<'/'>' left/rightR,H,J,C . Toggle: 'R' Sort; 'H' Threads; 'J' Num justify; 'C' Coordinatesc,i,S,j . Toggle: 'c' Cmd name/line; 'i' Idle; 'S' Time; 'j' Str justifyx,y . Toggle highlights: 'x' sort field; 'y' running tasksz,b . Toggle: 'z' color/mono; 'b' bold/reverse (only if 'x' or 'y')u,U,o,O . Filter by: 'u'/'U' effective/any user; 'o'/'O' other criterian,#,^O . Set: 'n'/'#' max tasks displayed; Show: Ctrl+'O' other filter(s)V,v . Toggle: 'V' forest view; 'v' hide/show forest view childrenk,r Gestiona tareas: «k» detener; «r» reiniciard o s Establece intervalo de actualizaciónW,Y Write configuration file 'W'; Inspect other output 'Y'q Quit( commands shown with '.' require a visible task display window )Press 'h' or '?' for help with Windows,Type 'q' or <Esc> to continue
Para sair, pressione ESC
ou q
Como mostrado na ajuda, se inserirmos u
podemos filtrar por usuário, inserimos meu usuário (wallabot) e posso ver apenas meus processos.
!u
top - 09:35:57 up 3:25, 1 user, load average: 1,02, 2,27, 2,39Tareas: 378 total, 1 ejecutar, 377 hibernar, 0 detener, 0 zombie%Cpu(s): 13,4 usuario, 0,4 sist, 0,0 adecuado, 86,1 inact, 0,1 en espera, 0,MiB Mem : 32006,4 total, 20288,0 libre, 6212,0 usado, 5506,4 búfer/cachéMiB Intercambio: 2048,0 total, 2048,0 libre, 0,0 usado. 24989,1 disponPID USUARIO PR NI VIRT RES SHR S %CPU %MEM HORA+ ORDEN10192 wallabot 20 0 3347636 388848 84140 S 148,2 1,2 288:46.50 python43990 wallabot 20 0 3998836 246552 146092 S 2,7 0,8 0:59.55 spotify1384 wallabot 20 0 4909848 453700 133164 S 1,7 1,4 11:14.02 gnome-s+1119 wallabot 9 -11 3093876 24504 17836 S 1,3 0,1 0:48.99 pulseau+32462 wallabot 20 0 1134,0g 643412 128632 S 1,3 2,0 7:39.91 chrome44161 wallabot 20 0 30,2g 217112 100488 S 1,3 0,7 0:44.87 spotify10135 wallabot 20 0 826220 58164 41648 S 1,0 0,2 0:14.56 gnome-t+6635 wallabot 20 0 33,0g 647936 436252 S 0,3 2,0 4:01.80 chrome6679 wallabot 20 0 32,4g 125564 94016 S 0,3 0,4 0:52.19 chrome8010 wallabot 20 0 1130,9g 232800 116092 S 0,3 0,7 0:13.70 chrome44101 wallabot 20 0 1995108 130444 89916 S 0,3 0,4 0:09.19 spotify1113 wallabot 20 0 19880 10528 8096 S 0,0 0,0 0:00.38 systemd1114 wallabot 20 0 169792 3636 12 S 0,0 0,0 0:00.00 (sd-pam)1121 wallabot 39 19 591436 37256 16676 S 0,0 0,1 0:03.19 tracker+1124 wallabot 20 0 390740 8688 7416 S 0,0 0,0 0:00.45 gnome-k+1128 wallabot 20 0 166804 6596 5956 S 0,0 0,0 0:00.00 gdm-x-s+1134 wallabot 20 0 9152 6144 3796 S 0,0 0,0 0:01.81 dbus-da+
Outra forma de ver isso para poder filtrar por usuário seria fazer um pipeline e usar grep
!top | grep wallabot
1440 wallabot 20 0 4684708 505432 118024 S 6,7 1,5 2:05.92 gnome-s+25326 wallabot 20 0 1133,0g 527912 123732 S 1,7 1,6 1:31.73 chrome1440 wallabot 20 0 4684708 505476 118024 S 1,3 1,5 2:05.96 gnome-s+6199 wallabot 20 0 1131,0g 266068 116164 S 0,3 0,8 0:15.23 chrome17606 wallabot 20 0 818228 52096 39488 S 0,3 0,2 0:02.59 gnome-t+34284 wallabot 20 0 14876 4376 3308 R 0,3 0,0 0:00.02 top
Manipulador de processos htop

É semelhante ao top
, mas mais poderoso.
Provavelmente você não o tem instalado, então para instalá-lo, digite o comando
sudo apt install htop
o
sudo snap install htop
Manipulador de processos glances

É semelhante ao top
, mas mais poderoso.
Provavelmente você não o tem instalado, então para instalá-lo, digite o comando
sudo apt install glances
Gerenciamento de memória RAM
Se quisermos obter informações sobre a memória, podemos usar o comando free
!free
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 a opção -h
(humano) para torná-la mais fácil de ler
!free -h
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 pelo terminal nos dará a informação de todas as pastas da nossa máquina, por isso, para não obter demasiada informação, é necessário introduzir uma rota que queremos escanear
!du ~/Documentos/web/portafolio/posts/
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 a flag -h
(humano) para que seja mais fácil de ler
!du ~/Documentos/web/portafolio/posts/ -h
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, introduzindo CTRL
+ALT
+F<num>
onde o número pode ir do 1 até o 6. Apenas a 2 terá a interface gráfica e a 1 será o início de sessão.
Ao manipular várias interfaces, podemos não saber em qual estamos, então ao introduzir o comando tty
ele nos dirá em qual estamos.
!tty
/dev/pts/0
Gerenciamento de pacotes
Repositórios PPA (Personal Package Archives)
Em Linux, a gestão de pacotes é feita através de repositórios. Isso é uma lista de endereços onde se encontram os binários dos nossos programas. Assim, quando queremos atualizar ou instalar nossos programas (explicaremos como fazer isso mais tarde), o que o sistema operativo fará é ver a lista desses repositórios e ir aos endereços indicados para buscar os binários.
Esta lista de repositórios está localizada em /etc/apt/sources.list
e dentro da pasta /etc/apt/sources.list.d
. Vamos ver essa lista.
terminal("cat /etc/apt/sources.list", max_lines_output=10)
# 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:
mesmo que tenha sido instalado através da rede ou de um USB.
A partir de aqui começam a aparecer várias 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.
Toda direção válida de repositório tem um desses formatos:
- deb http://direção_do_servidor/nome_pasta nome_da_versão (main ou universe ou multiverse ou main restricted, etc)
- deb-src http://endereco_do_servidor/nome_pasta nome_da_versão (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
pelas siglas em inglês (Free and Open-Source Software).
- Universo
Como Main
, Universe
também oferece FOSS
. A diferença é que neste repositório não é a Ubuntu quem garante atualizações de segurança regulares, mas sim a comunidade quem se encarrega do suporte. Vem ativado por padrão, mas nem sempre. Alguns sistemas operacionais o têm desativado por padrão e poderíamos ter que ativá-lo se estivermos executando uma Live Session. Se não o tivermos adicionado, podemos fazê-lo com este comando:
sudo add-apt-repository universe
O que encontramos em «Universe»? Eu diria que a maioria do software que vale a pena, entre o que temos o VLC e o 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 esse repositório por padrão devido a problemas legais e de licenças. Por outro lado, também não pode fornecer patches e atualizações. Com isso em mente, temos que avaliar se o adicionamos ou não, algo que podemos fazer com este comando:
sudo add-apt-repository multiverse
- Restrito
Nos repositórios do Ubuntu podemos encontrar software livre e de código aberto, mas isso não é possível quando se trata de algo relacionado ao 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 pelo Ubuntu de seus parceiros.
- Repositórios de terceiros do Ubuntu
Por último, temos os repositórios de terceiros. O Ubuntu tenta oferecer sempre a melhor experiência do usuário e isso é um dos motivos pelos quais ele rejeita certos softwares. Também há desenvolvedores que preferem ter 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 por meio do comando add-apt-repository <repositório>
. Mas como em outras distribuições que não sejam Ubuntu, não temos esse comando.
Atualizar os repositórios
Com o comando apt update
poderemos atualizar as últimas versões dos pacotes que temos no nosso repositório.
Atualizar os pacotes
Com o comando apt upgrade
poderemos atualizar os programas que tenhamos instalados e dos quais já tenhamos atualizado seu repositório.
Atualizar o kernel
Se usarmos o comando apt dist-upgrade
, também serão atualizados pacotes do kernel.
Cuidado!: Atualizar pacotes do kernel pode levar à quebra de alguns pacotes
Lembrete: Ao atualizar pacotes do kernel, é necessário reiniciar o computador para que as alterações tenham efeito.
Pesquisa de pacotes
Com o comando apt search <pacote>
podemos encontrar pacotes
terminal("apt search vlc", max_lines_output=10)
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 no nosso computador.
terminal("dpkg -l", max_lines_output=10)
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 verificar se temos um pacote instalado, podemos usar o comando anterior e criar um pipe
e buscar o nome do pacote com grep
terminal("dpkg -l | grep vlc")
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 é lhe dar um arquivo .deb
, portanto, para instalá-lo, usamos o comando dpkg -i <file.deb>
Administrador de usuários
Informação do usuário ativo com id

Com o comando id
posso ver qual usuário sou
!id
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
, o ID do grupo gid
e os grupos aos quais pertenço. Nas distribuições baseadas em Debian, os usuários recebem uma ID a partir de 1000, enquanto ao usuário root é atribuída a ID
0.
Informação do usuário ativo com whoami

Outro comando para saber quem é o usuário é whoami
!whoami
wallabot
Arquivo com as informações de todos os usuários
A informação dos usuários está no arquivo /etc/passwd
terminal("cat /etc/passwd", max_lines_output=10)
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
Mudar a senha de um usuário
Se quiser alterar a senha de um usuário, deve-se usar o comando passwd <user> <password>
. Se o usuário não for especificado, será usado o que o comando whoami
retornar.
Criar usuários com useradd

Para criar um novo usuário, use o comando useradd <user name>
, vamos criar um novo usuário.
!sudo useradd usertest1
Vamos ver se está no arquivo com todos os usuários
!cat /etc/passwd | grep usertest
usertest1:x:1001:1001::/home/usertest1:/bin/sh
Como podemos ver, foi criado o usuário com a id
1001, a seguinte à do meu usuário wallabot, que era o último.
No entanto, ao criar esse usuário, não nos pediu para atribuir uma senha. Além disso, se olharmos o que há dentro de home
!ls /home
wallabot
Apenas a pasta do usuário wallabot
está presente, mas não a do usuário test1
.
Criar usuários com adduser

Portanto, vamos ver outro comando para criar usuários que sim solicita uma senha e sim cria uma pasta em home
. Este comando é adduser
.
!sudo adduser usertest2
[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 para o arquivo com todos os usuários
!cat /etc/passwd | grep usertest
usertest1:x:1001:1001::/home/usertest1:/bin/shusertest2:x:1002:1002:,,,:/home/usertest2:/bin/bash
Vemos que se criou o usuário usertest2
!ls /home
usertest2 wallabot
E vemos que foi criada uma pasta para ele em home
Para excluir um usuário, é necessário usar o comando userdel <username>
!sudo userdel usertest1
!sudo userdel usertest2
Vamos ver se eles estão no arquivo com todos os usuários.
!cat /etc/passwd | grep usertest
Vemos que já não aparece nada, de fato vemos o final desse arquivo.
!tail /etc/passwd
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
Tornar um usuário administrador
Primeiro vamos a criar um usuário novo, que no início não será administrador
!sudo adduser noadmin
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>
!groups noadmin
noadmin : noadmin
Como vemos, só está no grupo noadmin
, que é um grupo que foi criado ao criar o usuário
Vamos a ver a quais grupos pertence o meu usuário
!groups wallabot
wallabot : wallabot adm cdrom sudo dip plugdev lpadmin lxd sambashare docker
Como vemos, meu usuário pertence a vários grupos adicionais, incluindo um chamado sudo
. Os usuários que têm acesso a este grupo possuem poderes de administrador, portanto, para que o novo usuário que criamos tenha esses poderes, é necessário adicioná-lo ao grupo sudo
Para adicionar um usuário a um grupo existem duas maneiras: uma é com o comando gpasswd -a <user> <group>
!sudo gpasswd -a noadmin sudo
Añadiendo al usuario noadmin al grupo sudo
Vamos ver agora a quais grupos o usuário noadmin
pertence.
!groups noadmin
noadmin : noadmin sudo
Como podemos ver, ele já pertence ao grupo sudo, portanto já teria poderes de administrador.
Eliminamos o usuário noadmin
do grupo sudo
com o comando gpasswd -d <user> <group>
!sudo gpasswd -d noadmin sudo
Eliminando al usuario noadmin del grupo sudo
Vemos que noadmin
já não pertence ao grupo sudo
!groups noadmin
noadmin : noadmin
O segundo comando para adicionar um usuário a um grupo é usermod -aG <group> <user>
!sudo usermod -aG sudo noadmin
Voltamos a ver a quais grupos o usuário noadmin
pertence.
!groups noadmin
noadmin : noadmin sudo
Removemos o usuário noadmin
do grupo sudo
e o excluímos
!sudo gpasswd -d noadmin sudo
Eliminando al usuario noadmin del grupo sudo
!sudo userdel noadmin
Histórico de comandos
histórico

Se na terminál introduzirmos o comando history
, vemos um histórico dos comandos utilizados.
!history
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 através de !<número do comando>
, por exemplo, se quiser voltar a executar o comando 1996
! !1996
PID TTY TIME CMD6610 pts/0 00:00:00 bash20826 pts/0 00:00:00 ps
pesquisa-inversa-i

Uma maneira mais refinada de buscar no histórico é digitar CTRL
+r
. Ao fazer isso, a seguinte mensagem aparecerá no console.
!reverse-i-search)`':
Assim, à medida que você vai escrevendo, irão aparecendo comandos que coincidam com o que você digitou. Por exemplo, se digitar if
, aparecerá a última vez que utilizei ifconfig
.
Se nós inserirmos novamente CTRL
+r
, irão aparecendo correspondências mais antigas.
Remover comandos do histórico
Existem comandos como ls
, cd
, pwd
que não contribuem muito estando no histórico, por isso podemos configurar para que eles não sejam salvos no histórico. Para fazer 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 verificar isso usamos o seguinte comando
!sudo ufw status
Estado: inactivo
Como vemos por padrão está inativo, então vamos criar um conjunto de regras. Por exemplo, vamos começar abrindo a porta 22 (SSH), para isso usamos o comando sudo allow <porta> comment "<comentário>"
, com o qual abrimos uma porta e adicionamos um comentário.
!sudo ufw allow 22 comment 'ssh'
Regla añadidaRegla añadida (v6)
Como vemos, ele abriu a porta 22 para IPv4 e IPv6. Vamos agora ativar o ufw
com o comando ufw enable
!sudo ufw enable
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
!sudo ufw enable
Hasta Acción Desde----- ------ -----22 ALLOW Anywhere # ssh22 (v6) ALLOW Anywhere (v6) # ssh
Também podemos dizer-lhe para mostrar as regras numeradas com o comando ufw status numbered
!sudo ufw status numbered
Estado: activoHasta Acción Desde----- ------ -----[ 1] 22 ALLOW IN Anywhere # ssh[ 2] 22 (v6) ALLOW IN Anywhere (v6) # ssh
Como as temos numeradas, podemos eliminar uma mediante o comando ufw delete <número da regra>
, portanto, para apagar a regra para IPv6 fazemos
!sudo ufw delete 2
Estado: activoBorrando:allow 22 comment 'ssh'¿Continuar con la operación (s|n)? sRegla eliminada (v6)
Voltamos a ver o estado
!sudo ufw status numbered
Estado: activoHasta Acción Desde----- ------ -----[ 1] 22 ALLOW IN Anywhere # ssh
Vemos que efetivamente foi removida a regra número 2.
Se quisermos habilitar a conexão SSH de um único IP, usamos a flag from <IP>
!sudo ufw allow from 192.168.1.103 proto tcp to any port 22 comment 'ssh ip'
Regla añadida
Voltamos a verificar as regras
!sudo ufw status numbered
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
!sudo ufw reset
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
!sudo ufw status numbered
Estado: inactivo
Vemos que já não há nenhuma regra
Para desativar o firewall usamos o comando ufw disable
!sudo ufw disable
El cortafuegos está detenido y deshabilitado en el arranque del sistema
Voltamos a verificar o estado
!sudo ufw status
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, é necessário usar o comando lynis audit system
. Isso começa a realizar um varredura de todo o sistema e relata os resultados.
Não vou mostrar o resultado do scan do meu sistema para não expor minhas vulnerabilidades na Internet
Programação de comandos
Programação de comandos periódicos com cron

Com o comando cron
podemos agendar comandos para ser executados periodicamente. Para isso, temos que editar o arquivo /etc/crontab
!cat /etc/crontab
# /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 pode ser visto, neste arquivo há uma série de comandos que são executados periodicamente. O formato desses 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ê deseja que o comando seja executado, existem muitos sites online que podem ajudá-lo a escrevê-la 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 seja feito periodicamente, e sim apenas uma única vez, podemos usar o comando at
. Por exemplo, você liga uma máquina da Azure ou Amazon, pelas quais é cobrado, e quer ter certeza de que ela será desligada para evitar surpresas na fatura. Você pode programar para que ela seja desligada à noite. Assim, mesmo se você esquecer de desligá-la, ela se desligará sozinha.
Fazemos um ls
na pasta /tmp
!ls -l /tmp
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 a programar que se crie um novo arquivo em /tmp
dentro de 5 minutos
!at 09:55 touch /tmp/at.txt
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, temos que escrever at <time>
e na linha seguinte o comando que queremos que seja executado.
Vamos agora ver os arquivos que há em /tmp
!ls -l /tmp
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 podemos ver, há um at.txt
que foi criado às 09:55
Atalhos de teclado
A seguir estão alguns atalhos de teclado úteis para o uso do terminal
- Ctrl+a: leva o cursor para o início da linha de comando.
- Ctrl+e: leva o cursor para o final da linha de comando.
- Ctrl+l: limpa o terminal, semelhante ao que faz o comando
clear
. - Ctrl+u: limpa do posição do cursor até o início da linha. Se estiver no final, limpa a linha inteira.
- Ctrl+k: limpa 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 palavra seguinte após o cursor.
- Ctrl+p: define a linha de comandos com o último comando inserido.
- 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. Feita uma busca pressionando novamente a combinação de teclas encontraremos correspondências anteriores.
- Ctrl+c: termina o processo que esteja sendo executado, útil para recuperar o controle do sistema.
- Ctrl+d: sai da 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: troca 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 palavra seguinte na linha, o mesmo que Ctrl+right no terminal do GNOME.
- Alt+b: move o cursor para o início da palavra anterior na linha, assim como Ctrl+left no terminal do GNOME.
- Tab: completa automaticamente 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 pesquisa anterior na terminal.
- Ctrl+Shift+c: copia o texto selecionado da terminal para a área de transferência.
- Ctrl+Shift+v: cola o texto do clipboard na linha de comando.
- Up: estabelece na linha de comandos o comando anterior do histórico, igual que Ctrl+p.
- Down: estabelece na linha de comandos o seguinte comando do histórico.
- Botão Esquerdo do Mouse: seleciona linhas de texto do terminal.
- Ctrl+Botão Esquerdo do Mouse: seleciona blocos de texto da terminal.
Sistema de pastas no Linux
Na imagem seguinte podemos ver como é o sistema de pastas no Linux

Esta imagem foi tirada do post do LinkedIn Roberto Morais
Frituras
Você se esqueceu de usar sudo
Já aconteceu com você de ir usar um comando que precisava ser executado com sudo
, mas esqueceu de escrever sudo
? Bem, depois de receber o erro correspondente, se você fizer sudo !!
o comando anterior será executado com sudo
.
!apt update
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 fazer sudo update
nos dá um erro, mas se agora executarmos sudo !!
será executado sudo apt update
!sudo !!
[sudo] contraseña para wallabot:
Mensagens do kernel
Com o comando dmesg
(exibir mensagens do buffer circular do kernel), podemos ver os mensagens do kernel. Por exemplo, isso é muito útil para verificar se um dispositivo USB foi conectado, ou para depurar erros de hardware do nosso computador.
!dmesg | tail
[ 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 o sinalizador --follow
podemos ver em tempo real as novas mensagens que forem sendo geradas
!dmesg --follow
[ 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
!lshw
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
Há um comando chamado cowsay
ao qual você passa um texto como parâmetro 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 cowsay
terminal("cowsay MaximoFN")
__________< MaximoFN >----------\ ^__^\ (oo)\_______(__)\ )\/\||----w ||| ||
Se você adicionar a bandeira -f dragon
, quem o diz é um dragão.
terminal("cowsay -f dragon MaximoFN")
__________< MaximoFN >----------\ / \ //\\ |\___/| / \// \\/0 0 \__ / // | \ \/ / \/_/ // | \ \@_^_@'/ \/_ // | \ \//_^_/ \/_ // | \ \( //) | \/// | \ \( / /) _|_ / ) // | \ _\( // /) '/,_ _ _/ ( ; -. | _ _\.-~ .-~~~^-.(( / / )) ,-{ _ `-.|.-~-. .~ `.(( // / )) '/\ / ~-. _ .-~ .-~^-. \(( /// )) `. { } / \ \(( / )) .----~-.\ \-' .~ \ `. \^-.///.----..> \ _ -~ `. ^-` ^-_///-._ _ _ _ _ _ _}^ - - - - ~ ~-- ,.-~/.-~
terminal("cowsay -f dragon-and-cow MaximoFN")
__________< 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 deletá-la para deixar tudo como encontramos.
!rm -r prueba