Transcrição do áudio
todo o processo, ele tem três descritores, tá? Imagine descritor com um número na memória, que tem uma posição de memória, certo? E que lá nessa posição, eu estou simplificando para caramba, tá? Você é muito ninja nesse assunto, não vai querer complicar a vida dos meus coleguinhas que estão começando. Então, você imagina que você tem um número, esse número aponta para uma posição de memória de alguma forma, e nessa posição de memória, então, eu tenho um tipo de arquivo do tipo string, tá? Ou seja, são binários passando, sem uma forma muito bem definida, e que eles são utilizados, por exemplo, para que outro processo possa capturar, ler, ou que eu possa, naturalmente, comunicar de um processo com outro, e aí você vem a ideia do pipe, como isso aí, legal? Você ligar o output de um processo, o que é o pipe? Pipe, grep, vocês não viram? PS ao X, não fizemos isso? PS ao X, pipe, é isso, grep. O que foi aquele pipe? Aquele pipe, nós pegamos e conectamos o output do PS no input do grep. Então, não preciso de traduzir aqui, né, cara? Output, saída, input, entrada. Então, peraí, você está pegando o descritor, do PS, output, e apontando para o descritor de input do grep. E aí, tudo que o PS vai escrevendo de caracteres, preste atenção, terminal é texto, texto, texto, mais nada é texto. Ah, pá, escreveu um numerozinho, não é texto, beleza? E aí ele vai escrevendo isso, né, esses bits, e o Mildtru, muito louco, dentro do grep, fica lendo o input e fazendo alguma coisa com ele, filtrando, no caso, e jogando para o output. Então, veja, o PS tem input, que não entrou nada, output, e error, legal? O output do PS foi injetado no input do grep, não foi? E aí o grep leu com aço infinito, feito um louco, e fez seu trabalho, e escreveu no output. Output, naturalmente, do próprio grep. E aí, o que acontece? Aí é que vem a mágica, a mágica. O shell, ele vai pegar isso, esse output do grep, e vai mandar para o meu terminal. Então, craft, ele escreve na tela. Entenderam todo o procedimento? É assim que aconteceu. Então, o que acontece? Você tem o input, o output e o error. O que é o error? Todo o erro que vai tendo, nós vamos escrevendo no descritor de error. Beleza? Galera, eu vou ter que dar um espirro. Ai, desculpa, gente, estou muito doente. Eu gravo essas coisas de madrugada. Então, olha só. Os erros vão acontecendo, nós vamos empilhando, por isso que é stack de erro, meu amigo. Está brincando? Está brincando você, programador Java? A tal da stack trace de erro? Você, programador Python. A stack trace de erro? Nós vamos empilhando erros no descritor de error. E aí, o seu accept, ou o seu catch, ele lê esse error. Eu posso limpar o error antes? Pode. Eu posso escrever no error? Pode. Eu posso fazer o que eu quiser no meu Linux? Pode. Problema é teu, coleguinha. Mano, eu tenho que trazer o treco para me ajudar na aula. Não sei se vocês conhecem, tem o Tico, o Teco e o Treco. Procurem Mundo Carimbal. Vamos lá. Então, zero é o descritor de input. Lembra que eu falei para você que é um número? Então, zero vai apontar para o endereço de memória, que é o input. Nós, vulgarmente, conhecemos, chamamos de stgen. Geralmente, abreviado. O descritor do arquivo 1 é o output. stdot. E o 2 é o stder. Beleza? É nome. Mas, nem sempre você tem que saber isso. Na verdade, posso te falar a verdade? Acho que 99% dos caras não sabem essa bosta aí. E são formados em infraestrutura. Todo esse paranauê que eu estou explicando para vocês. Por quê? Meu livro envolve programação. Meu livro não é um livro básico de programação. Sabe onde os caras começam essa explicação aqui? Os caras não têm essa explicação que eu passei para vocês. Eles começam aqui. Começa aqui. No maior, no menor. Entenderam? Então, vamos aprender a usar isso aqui. Imagine que você tem um comando. E que você pode mandar ele para um arquivo. Legal. Então, você poderia mandar ele para um outro programa. No input de um outro programa. Ou usar um pipe. Tanto faz fazer. Você pode carregar no stgen um arquivo. Vamos lá. wc-l. Não é o 1. Não é o 1. Beleza? No meu próximo livro. Eu vou reescrever esse livro todo. E vou trocar essa sintaxe aqui. Desculpe. Essa letra. Provavelmente eu vou usar o corre-n1. Então, vamos lá. Nós temos um arquivo. Então, wc-l. W-C. Traço L de contar o número de linhas. W-C. Traço L de contar o número de linhas. W-C. Traço L de contar o número de linhas. W-C. Traço L de contar o número de linhas. W-C. Traço L de contar o número de linhas. E vamos lá. Vamos lá. de linhas. E aí eu vou injetar o ponto barra script. Legal? Eu vou pegar, ler o ponto script, vou injetar no WC-L e ele me falou que tem seis linhas lá dentro. Me pegou a jogada? Porque eu injetei isso aqui. Cara, e se eu te contar que o laço de repetição é um comando, é um programa. É um comando e um programa. Então eu consigo injetar isso aqui num laço de repetição, cara. É muito louco, cara. Poderia jogar no Xagons. Muito louco, cara. E quando eu quero fazer o input e pegar o resultado e jogar nesse output, assim. Tá? E quando eu quero pegar somente o erro, quero pegar somente o erro. Comando, o erro, eu pego somente o erro. Tá? Aqui é o 2, tá vendo? Os caras decoram, os caras decoram, mas você não decora, porque você sabe que, ó, STDIN primeiro, entrada primeiro. Saída, né, seria em segundo. E terceiro seria o erro. Só que começa de zero. Então só pode ser zero, 1 e 2. Entenda, Coreba. Tá? Pense você, programador, cara. Ah, eu quero escrever nesse cara aqui a saída, certo? Aqui. E também eu quero que junte com ele com 1, que junte com o descritor 1, junte o descritor 2 pra mim fazendo, tá bom? Aí ele vai colocar o erro e o output no mesmo arquivo de saída. Tá? Bom, eu quero apendar. O arquivo já existia e eu quero só injetar, né, lá no final. Então você utiliza 2. Ele vai apendar. Beleza? Eu quero fazer um... um output. Ai, caralho. Como é que eu posso explicar isso pra vocês? Vamos lá. O Linux, ele é auditável. Certo? Então tem uma forma de você conseguir apagar as provas e os hackers fazem. Lógico que você não é hacker, nem eu, nem ninguém aqui quer ser essa porra. Certo? Então, como que nós apagamos o rastro? Mandando... Eu poderia ter colocado não só o output e poderia ter colocado o erro também. Pra dentro do devnull, cara. O que é o devnull? O devnull ele é um dos arquivos clássicos e ele é um stream, tá? Um arquivo de stream binário e que tem um processo que fica limpando ele. Então tudo que você vai escrevendo ele, ele é binariamente limpo. Não fica registro no jornal, não fica registro em lugar nenhum. Entendeu? Ele é um arquivo em memória inclusive. Não fica nem no disco. Arquivo em memória. E que vai sendo limpo. É espaço de memória que é limpo o tempo inteiro. Desalocado o tempo inteiro. Cara, é assim que os hackers fazem para esconder. Por quê? Muitos desses outputs, esses errors são jogados num sistema de logger do Linux. O Linux tem um sistema, uma uma camada chamada logger. Em que ele registra tudo, cara. Para auditoria. E sim, cara. Erros podem ir para auditoria. Podem ser capturados pelo sistema profissional e ir para auditoria. Outputs podem ser enviados para auditoria. Pode não, né? O normal é enviar. O sistema profissional normalmente envia para esses arquivos de logger, essa plataforma de logger e que isso é possivelmente auditado. Dos incidentes, de segurança que tiveram invasão, que eu participei lá ajudando, trabalhando junto com a equipe toda, porque trabalho sem equipe. Você nunca trabalha sozinho nesse negócio. Tá? Ou a verdade seja dita. Cara, todas as vezes nós vamos nos logs do sistema profissional. Todas as vezes nós vamos no logger. Nós capturamos o logger, jogamos não poderia falar tecnologia, mas vamos colocar aqui uma somente. O gray log. O gray log, tá? É um dos... Mas as tecnologias tem tantas outras. Eu prometo que eu dou uma aula de segurança mais lá no curso hack e aí eu falo bastante sobre essa questão de aonde ficam esses logs para auditoria. Legal? Até mais. Tchau!