quinta-feira, 3 de setembro de 2015

Como capturar o texto de um site pela linha de comandos

O comando wget, muito conhecido pelos usuários de Linux, permite baixar uma página HTML de um site pela linha de comandos. Seu uso é simples:

$ wget www.ricardo.olonca.nom.br
--2015-09-03 16:27:00--  http://www.ricardo.olonca.nom.br/
Resolvendo www.ricardo.olonca.nom.br (www.ricardo.olonca.nom.br)... 162.243.226.87, 198.199.92.59
Conectando-se a www.ricardo.olonca.nom.br (www.ricardo.olonca.nom.br)|162.243.226.87|:80... conectado.
A requisição HTTP foi enviada, aguardando resposta... 302 Found
Localização: http://ricardoolonca.blogspot.com.br [redirecionando]
--2015-09-03 16:27:01--  http://ricardoolonca.blogspot.com.br/
Resolvendo ricardoolonca.blogspot.com.br (ricardoolonca.blogspot.com.br)... 2800:3f0:4003:c01::84, 64.233.190.132
Conectando-se a ricardoolonca.blogspot.com.br (ricardoolonca.blogspot.com.br)|2800:3f0:4003:c01::84|:80... conectado.
A requisição HTTP foi enviada, aguardando resposta... 200 OK
Tamanho: não especificada [text/html]
Salvando em: “index.html”

index.html                   [     <=>                          ] 244,18K   173KB/s   em 1,4s   


2015-09-03 16:27:03 (173 KB/s) - “index.html” salvo [250037]

O wget salva o arquivo index.html (você pode digitar a URL inteira para baixar outro arquivo). Porém, esse arquivo contém todas as marcações e tags HTML. Eis um exemplo de como é o arquivo.

$ head index.html
<!DOCTYPE html>
<html class='v2' dir='ltr'>
<head>
<meta content='width=1100' name='viewport'/>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
<script type="text/javascript">(function() { var b=window,f="chrome",g="tick",k="jstiming";(function(){function d(a){this.t={};this.tick=function(a,d,c){var e=void 0!=c?c:(new Date).getTime();this.t[a]=[e,d];if(void 0==c)try{b.console.timeStamp("CSI/"+a)}catch(h){}};this[g]("start",null,a)}var a;b.performance&&(a=b.performance.timing);var n=a?new d(a.responseStart):new d;b.jstiming={Timer:d,load:n};if(a){var c=a.navigationStart,h=a.responseStart;0<c&&h>=c&&(b[k].srt=h-c)}if(a){var e=b[k].load;0<c&&h>=c&&(e[g]("_wtsrt",void 0,c),e[g]("wtsrt_","_wtsrt",h),e[g]("tbsd_","wtsrt_"))}try{a=null,
b[f]&&b[f].csi&&(a=Math.floor(b[f].csi().pageT),e&&0<c&&(e[g]("_tbnd",void 0,b[f].csi().startE),e[g]("tbnd_","_tbnd",c))),null==a&&b.gtbExternal&&(a=b.gtbExternal.pageT()),null==a&&b.external&&(a=b.external.pageT,e&&0<c&&(e[g]("_tbnd",void 0,b.external.startE),e[g]("tbnd_","_tbnd",c))),a&&(b[k].pt=a)}catch(p){}})();b.tickAboveFold=function(d){var a=0;if(d.offsetParent){do a+=d.offsetTop;while(d=d.offsetParent)}d=a;750>=d&&b[k].load[g]("aft")};var l=!1;function m(){l||(l=!0,b[k].load[g]("firstScrollTime"))}b.addEventListener?b.addEventListener("scroll",m,!1):b.attachEvent("onscroll",m);
 })();</script>
<meta content='blogger' name='generator'/>
<link href='http://ricardoolonca.blogspot.com.br/favicon.ico' rel='icon' type='image/x-icon'/>


Se você quiser somente os textos "úteis" sem as tags e marcações você pode usar o programa html2txt que pode ser instalado via apt-get.

# apt-get install html2txt

Após instalar o programa basta executá-lo passando como parámetro o arquivo index.html

$ html2text index.html
****** Informática, Rede, Software Livre ****** 
Neste espaço eu pretendo escrever pequenos artigos, dicas e opiniões sobre Software Livre e Redes, além de comentários pertinentes ao mundo da Informática. 
***** quarta-feira, 2 de setembro de 2015 ***** 
**** Teste_de_rede_com_hping3 **** 
Se você costuma testar a estabilidade da rede usando o ping, experimente o hping3. 
Com o hping3 você pode controlar melhor o uso do ping. Uma opção que costumo usar faz com que centenas de pacotes icmp sejam enviados para o alvo em um segundo. Muito bom para testar a estabilidade da rede, ou para testar o quanto uma máquina aguenta de requisições. Por exemplo, o comando: 
# hping3 -i u1000 8.8.8.8 -c 1000 -1 
envia 1000 pacotes (-c 1000) icmp (-1) para o alvo (8.8.8.8), cada pacote com um intervalo de 1000 microsegundos (-i u1000). Em outras palavras, 1000 "pings" por segundo. O resultado do comando está resumido abaixo. 
HPING 8.8.8.8 (eth0 8.8.8.8): icmp mode set, 28 headers + 0 data bytes 
len=46 ip=8.8.8.8 ttl=57 id=36829 icmp_seq=0 rtt=7.3 ms 
len=46 ip=8.8.8.8 ttl=57 id=36830 icmp_seq=1 rtt=6.3 ms 
len=46 ip=8.8.8.8 ttl=57 id=36832 icmp_seq=3 rtt=4.9 ms 

quarta-feira, 2 de setembro de 2015

Teste de rede com hping3

Se você costuma testar a estabilidade da rede usando o ping, experimente o hping3.

Com o hping3 você pode controlar melhor o uso do ping. Uma opção que costumo usar faz com que centenas de pacotes icmp sejam enviados para o alvo em um segundo. Muito bom para testar a estabilidade da rede, ou para testar o quanto uma máquina aguenta de requisições. Por exemplo, o comando:

# hping3 -i u1000 8.8.8.8 -c 1000 -1

envia 1000 pacotes (-c 1000) icmp (-1) para o alvo (8.8.8.8), cada pacote com um intervalo de 1000 microsegundos (-i u1000). Em outras palavras, 1000 "pings" por segundo. O resultado do comando está resumido abaixo.

HPING 8.8.8.8 (eth0 8.8.8.8): icmp mode set, 28 headers + 0 data bytes
len=46 ip=8.8.8.8 ttl=57 id=36829 icmp_seq=0 rtt=7.3 ms
len=46 ip=8.8.8.8 ttl=57 id=36830 icmp_seq=1 rtt=6.3 ms
len=46 ip=8.8.8.8 ttl=57 id=36832 icmp_seq=3 rtt=4.9 ms
len=46 ip=8.8.8.8 ttl=57 id=36831 icmp_seq=2 rtt=5.9 ms
len=46 ip=8.8.8.8 ttl=57 id=36834 icmp_seq=4 rtt=6.0 ms
len=46 ip=8.8.8.8 ttl=57 id=36833 icmp_seq=5 rtt=5.5 ms
len=46 ip=8.8.8.8 ttl=57 id=36835 icmp_seq=6 rtt=4.5 ms
len=46 ip=8.8.8.8 ttl=57 id=36836 icmp_seq=7 rtt=4.1 ms
(...)
len=46 ip=8.8.8.8 ttl=57 id=37804 icmp_seq=994 rtt=5.4 ms
len=46 ip=8.8.8.8 ttl=57 id=37805 icmp_seq=995 rtt=4.7 ms
len=46 ip=8.8.8.8 ttl=57 id=37806 icmp_seq=996 rtt=4.8 ms
len=46 ip=8.8.8.8 ttl=57 id=37807 icmp_seq=997 rtt=4.1 ms
len=46 ip=8.8.8.8 ttl=57 id=37808 icmp_seq=998 rtt=6.7 ms
len=46 ip=8.8.8.8 ttl=57 id=37809 icmp_seq=999 rtt=6.3 ms
--- 8.8.8.8 hping statistic ---
1000 packets transmitted, 978 packets received, 3% packet loss
round-trip min/avg/max = 1.9/5.8/1002.6 ms

Na minha máquina esse comando demorou 2 segundos, com 3% de perda. Uma boa marca.
O hping3 pode ser instalado via apt-get.

# apt-get install hping3

quinta-feira, 27 de agosto de 2015

Como alterar o nome da máquina

No Linux, o nome do computador fica armazenado em /etc/hostname. Se você quiser mudar o nome basta editar esse arquivo. O nome passará a ser usado no próximo boot, mas se você quiser setá-lo agora pode usar o comando hostname.

# hostname novo_nome

Onde "novo_nome" é o nome que você quer colocar no computador.

É importante também colocar o nome do compuador e o domínio (FQDN - Full Qualified Domain Name) no arquivo /etc/hosts.

127.0.1.1 novo_nome.suaempresa.inet novo_nome

Para ver somente o dominio do teu computador você pode usar o parâmetro "-d".

$ hostname -d

Para ver o nome completo FQDN use "-f"

$ hostname -f

quarta-feira, 26 de agosto de 2015

Comandos úteis para a resolução de nomes

Neste artigo descrevo os principais comandos que podem ser usados para analisar o cliente DNS, ou seja, o processo de resolução de nomes em uma estação de trabalho Linux.


Nslookup

O nslookup é usado para consultar registros em servidores DNS. A forma mais simples é:

$ nslookup ricardoolonca.blogspot.com.br
Server: 192.168.1.1
Address: 192.168.1.1#53
Non-authoritative answer:
ricardoolonca.blogspot.com.br canonical name = blogspot.l.googleusercontent.com.
Name: blogspot.l.googleusercontent.com
Address: 74.125.234.107
Name: blogspot.l.googleusercontent.com
Address: 74.125.234.106
Name: blogspot.l.googleusercontent.com
Address: 74.125.234.108

Você pode querer fazer uma consulta usando outro servidor DNS. No exemplo abaixo eu estou fazendo uma consulta DNS, mas não usando o meu DNS, e sim o do Terra (200.176.2.12).

$ nslookup ricardoolonca.blogspot.com.br 200.176.2.12
Server: 200.176.2.12
Address: 200.176.2.12#53

Non-authoritative answer:
ricardoolonca.blogspot.com.br canonical name = blogspot.l.googleusercontent.com.
Name: blogspot.l.googleusercontent.com
Address: 74.125.234.11
Name: blogspot.l.googleusercontent.com
Address: 74.125.234.12
Name: blogspot.l.googleusercontent.com
Address: 74.125.234.10

Para descobrir quem é o servidor DNS do site em questão, use o parâmetro type=ns:

$ nslookup -type=ns ricardoolonca.blogspot.com.br
Server: 192.168.1.1
Address: 192.168.1.1#53

Non-authoritative answer:
ricardoolonca.blogspot.com.br canonical name = blogspot.l.googleusercontent.com.
Authoritative answers can be found from:
l.googleusercontent.com
origin = ns1.google.com
mail addr = dns-admin.google.com
serial = 1529890
refresh = 900
retry = 900
expire = 1800
minimum = 60

Para descobrir qual servidor responde pelos e-mail dos site, utilize type=mx

$ nslookup -type=mx ricardoolonca.blogspot.com.br
Server: 192.168.1.1
Address: 192.168.1.1#53

Non-authoritative answer:
ricardoolonca.blogspot.com.br canonical name = blogspot.l.googleusercontent.com.
Authoritative answers can be found from:
l.googleusercontent.com
origin = ns1.google.com
mail addr = dns-admin.google.com
serial = 1529890
refresh = 900
retry = 900
expire = 1800
minimum = 60

Podemos ver que este domínio não tem serviço de e-mail. Vamos tentar com outro domínio:

$ nslookup -type=mx google.com
Server: 192.168.1.1
Address: 192.168.1.1#53

Non-authoritative answer:
google.com mail exchanger = 40 alt3.aspmx.l.google.com.
google.com mail exchanger = 10 aspmx.l.google.com.
google.com mail exchanger = 20 alt1.aspmx.l.google.com.
google.com mail exchanger = 30 alt2.aspmx.l.google.com.
google.com mail exchanger = 50 alt4.aspmx.l.google.com. Authoritative answers can be found from:
alt1.aspmx.l.google.com internet address = 173.194.75.27
alt2.aspmx.l.google.com internet address = 173.194.67.27

Podemos notar que há cinco servidores que tratam as mensagens de e-mail do Google, sendo o aspmx.l.google.com o prioritário.


Dig

O dig é outro utilitário usado para consultar nomes. Sua sintaxe é simples:

$ dig ricardoolonca.blogspot.com.br
; <<>> DiG 9.9.5-6-Debian <<>> ricardoolonca.blogspot.com.br
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- 20754="" id:="" noerror="" opcode:="" p="" query="" status:="">
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1280
;; QUESTION SECTION:
;ricardoolonca.blogspot.com.br. IN A

;; ANSWER SECTION:
ricardoolonca.blogspot.com.br. 600 IN CNAME blogspot.l.googleusercontent.com.
blogspot.l.googleusercontent.com. 300 IN A 64.233.186.132

;; Query time: 117 msec
;; SERVER: 172.20.1.6#53(172.20.1.6)
;; WHEN: Wed Aug 26 15:32:48 BRT 2015
;; MSG SIZE  rcvd: 120



Para consulta o servidor mx:

$ dig -q-type=mx google.com
;<<>> DiG 9.9.5-6-Debian <<>> -q-type=mx google.com
; global options: +cmd
;; Got answer:
;; ->>HEADER<<- 16201="" id:="" opcode:="" p="" query="" servfail="" status:="">;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1280
;; QUESTION SECTION:
;-type=mx. IN A

;; Query time: 0 msec
;; SERVER: 172.20.1.6#53(172.20.1.6)
;; WHEN: Wed Aug 26 15:33:54 BRT 2015
;; MSG SIZE  rcvd: 37

;; Got answer:
;; ->>HEADER<<- 46779="" id:="" noerror="" opcode:="" p="" query="" status:="">;; flags: qr rd ra; QUERY: 1, ANSWER: 11, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1280
;; QUESTION SECTION:
;google.com. IN A

;; ANSWER SECTION:
google.com. 298 IN A 173.194.118.34
google.com. 298 IN A 173.194.118.37
google.com. 298 IN A 173.194.118.35
google.com. 298 IN A 173.194.118.40
google.com. 298 IN A 173.194.118.46
google.com. 298 IN A 173.194.118.39
google.com. 298 IN A 173.194.118.41
google.com. 298 IN A 173.194.118.32
google.com. 298 IN A 173.194.118.38
google.com. 298 IN A 173.194.118.33
google.com. 298 IN A 173.194.118.36

;; Query time: 0 msec
;; SERVER: 172.20.1.6#53(172.20.1.6)
;; WHEN: Wed Aug 26 15:33:54 BRT 2015
;; MSG SIZE  rcvd: 215


Host

Outro comando usado para resolver nomes é o host. O host gera saídas mais enxutas.

$ host ricardoolonca.blogspot.com.br
ricardoolonca.blogspot.com.br is an alias for blogspot.l.googleusercontent.com.
blogspot.l.googleusercontent.com has address 74.125.234.138
blogspot.l.googleusercontent.com has address 74.125.234.139
blogspot.l.googleusercontent.com has address 74.125.234.140
blogspot.l.googleusercontent.com has IPv6 address 2800:3f0:4001:802::100b

Você pode fazer consultas reversas:

$ host 74.125.234.138
138.234.125.74.in-addr.arpa domain name pointer gru03s13-in-f10.1e100.net.


Whois

O comando whois mostra informações sobre o domínio, como o nome e contato dos responsáveis, o DNS, a data da última atualização, etc.

$ whois ricardoolonca.blogspot.com.br 
% Copyright (c) Nic.br
% The use of the data below is only permitted as described in
% full by the terms of use (http://registro.br/termo/en.html),
% being prohibited its distribution, comercialization or
% reproduction, in particular, to use it for advertising or
% any similar purpose.
% 2013-08-19 16:36:04 (BRT -03:00)


domain: blogspot.com.br
owner: Google Brasil Internet Ltda
ownerid: 006.990.590/0001-23
responsible: Domain Administrator
country: BR
owner-c: DOADM17
admin-c: DOADM17
tech-c: DOADM17
billing-c: NAB51
nserver: ns1.google.com
nsstat: 20130818 AA
nslastaa: 20130818
nserver: ns2.google.com
nsstat: 20130818 AA
nslastaa: 20130818
nserver: ns3.google.com
nsstat: 20130818 AA
nslastaa: 20130818
nserver: ns4.google.com
nsstat: 20130818 AA
nslastaa: 20130818
created: 20041205 #1920190
expires: 20131205
changed: 20121113
status: published


nic-hdl-br: DOADM17
person: Domain Admin
e-mail: ccops@markmonitor.com
created: 20100520
changed: 20130423


nic-hdl-br: NAB51
person: NameAction do Brasil
e-mail: cctld@nameaction.com
created: 20020619
changed: 20130430


% Security and mail abuse issues should also be addressed to
% cert.br, http://www.cert.br/, respectivelly to cert@cert.br
% and mail-abuse@cert.br
%
% whois.registro.br accepts only direct match queries. Types
% of queries are: domain (.br), ticket, provider, ID, CIDR
% block, IP and ASN.


Você pode usar o whois para saber quem é o responsável por um ip específico:

$ whois 74.125.234.138

#
# ARIN WHOIS data and services are subject to the Terms of Use
# available at: https://www.arin.net/whois_tou.html
#


#
# The following results may also be obtained via:
# http://whois.arin.net/rest/nets;q=74.125.234.234?showDetails=true&showARIN=false&ext=netref2
#


NetRange: 74.125.0.0 - 74.125.255.255
CIDR: 74.125.0.0/16
OriginAS:
NetName: GOOGLE
NetHandle: NET-74-125-0-0-1
Parent: NET-74-0-0-0-0
NetType: Direct Allocation
RegDate: 2007-03-13
Updated: 2012-02-24
Ref: http://whois.arin.net/rest/net/NET-74-125-0-0-1


OrgName: Google Inc.
OrgId: GOGL
Address: 1600 Amphitheatre Parkway
City: Mountain View
StateProv: CA
PostalCode: 94043
Country: US
RegDate: 2000-03-30
Updated: 2013-08-07
Ref: http://whois.arin.net/rest/org/GOGL


OrgTechHandle: ZG39-ARIN
OrgTechName: Google Inc
OrgTechPhone: +1-650-253-0000
OrgTechEmail: arin-contact@google.com
OrgTechRef: http://whois.arin.net/rest/poc/ZG39-ARIN


OrgAbuseHandle: ZG39-ARIN
OrgAbuseName: Google Inc
OrgAbusePhone: +1-650-253-0000
OrgAbuseEmail: arin-contact@google.com
OrgAbuseRef: http://whois.arin.net/rest/poc/ZG39-ARIN


#
# ARIN WHOIS data and services are subject to the Terms of Use
# available at: https://www.arin.net/whois_tou.html
#

Essas são as principais ferramentas de resolução de nomes usadas para fazer análise de rede. Caso algum site não esteja acessível, antes de ficar fuçando no Squid, verifique se o site existe, usando nslookup, ping, dig, etc.

sexta-feira, 21 de agosto de 2015

Trabalhando com o histórico de comandos

O terminal texto, mais precisamento o Bash, possui duas propriedades muito úteis que facilitam a nossa vida: o histórico de comandos, e o complemento de comandos.

O complemento funciona como um encurtador de comandos e nomes de arquivos. Por exemplo, quando se quer executar o comando chkrootkit, ao se digitar chk e precionar TAB duas vezes, o Bash vai retornar todos os comandos que começam com chk. Se houver apenas um único comando que começa com a sequencia digitada, então no primeiro TAB o comando será completado. O mesmo para nomes de arquivos. Se você estiver no diretório raiz (/) e quiser entrar no /etc, basta digitar "cd e" e apetar TAB para que o comando seja preenchido com "cd etc".

O histórico lista os últimos comandos digitados. Usando as teclas "seta acima" e "seta abaixo" você pode navegar pelos últimos comandos digitados. Você também pode digitar "history" para ver a lista completa do histórico.

$ history
599 ping -c 1 8.8.8.8 | grep icmp | cut -d" " -f7 | cut -d"=" -f2 | sed 's/\./\,/g'
600 ssh -v 200.144.25.50
601 clear
602 ping -c 1 172.20.1.17
603 clear
604 env | grep HIST
605 env
606 vi .bashrc
607 vi .bash_history
608 wc -l .bash_history
609 ls -lh .bash_history
610 vi .bashrc
611 ssh ricardoolonca@172.20.1.146
612 ls -lh .bash
613 ls -lh .bash_history
614 wc -l .bash_history
615 vi .bashrc
616 cd /
617 history

Para executar o comando número 599, basta digitar:

$ !599
ping -c 1 8.8.8.8 | grep icmp | cut -d" " -f7 | cut -d"=" -f2 | sed 's/\./\,/g'
4,60

O histórico fica armazenado em .bash_history, no diretório raiz dos usuários. Por padrão, o histórico mantém os últimos 1000 comandos (em algumas distros é 500), e o tamanho do arquivo não pode passar de 2Mb. Para alterar essas opções, abra o arquivo .bashrc e altere os valores de HISTSIZE e HISTFILESIZE. Para limitar em 10.000 comandos e 10Mb, altere conforme abaixo.

HISTSIZE=10000
HISTFILESIZE=10000

Além disso, há alguns atalhos interessantes. Por exemplo, para repetir o último comandos digite:

$ "!!"

Para repetir o último comando que começa com "ssh" use:

$ "!ssh"

Para executar o último comandos mas substituindo o texto 146 por 147, digite:

$ ^146^147

quarta-feira, 19 de agosto de 2015

Listando as primeiras linhas de um arquivo textto

O comando head é usado para listar as primeiras linhas de um arquivo. Se executado sem parâmetros, head mostra as primiras 10 linhas.

$ head arquivo.txt

Você pode especificar o número de linhas que quer mostrar. Por exemplo, para mostrar as 4 primeiras linhas use:

$ head -4 arquivo.txt

Para exibir os primeiros bytes, use o parâmetros "-c". Por exemplo, para mostrar os primeiros 10 bytes, digite:

$ head -c 10 arquivo.txt

Você pode usar as letras K, M e G para especificar Kilo, Mega e Gigabyte.

$ head -c 10K arquivo.txt

O comando tail faz basicamente o mesmo, mas mostra as últimas linhas do arquivo. Você pode combiná-los para mostrar, por exemplo, somente a terceira linha.

$ head -3 arquivo.txt | tail -1


terça-feira, 18 de agosto de 2015

Sistema lento? Pode ser o disco.

Quando o computador está lento a primeira coisa que vem na mente do usuário é o processador. Mas o processador não é o único ítem que afeta o desempenho. Uso de memória, uso do link de internet e qualidade gráfica da aplicação são outros fatores que podem estar degradando o desempenho do equipamento. Outro ponto a verificar é o uso do disco. Neste artigo vamos mostrar como verificar se o disco é o causador do problema.

Para verificar o desempenho dos discos em sistemas Linux, use o hdparm, que você pode instalar com o tradicional apt-get.

# apt-get install hdparm

Para descobrir o endereço fisico do disco digite:

# fdisk -l 

Disco /dev/sda: 465,8 GiB, 500107862016 bytes, 976773168 setores
Unidades: setor de 1 * 512 = 512 bytes
Tamanho de setor (lógico/físico): 512 bytes / 4096 bytes
Tamanho E/S (mínimo/ótimo): 4096 bytes / 4096 bytes
Tipo de rótulo do disco: dos
Identificador do disco: 0x000102eb


Device     Boot     Start       End   Sectors   Size Id Type

/dev/sda1  *         2048 195311615 195309568  93,1G 83 Linux
/dev/sda2       195313664 585936895 390623232 186,3G 83 Linux
/dev/sda3       585936957 976768064 390831108 186,4G  f W95 Ext'd (LBA)
/dev/sda5       585936959 976768064 390831106 186,4G 83 Linux

Repare na linha que começa com "Disco". No meu caso, o endereço físico do disco é /dev/sda. Agora teste o desempenho sem cache...

# hdparm -t /dev/sda

/dev/sda:

 Timing buffered disk reads:  178 MB in  3.02 seconds =  58.85 MB/sec

e com cache...

# hdparm -T /dev/sda

/dev/sda:


 Timing cached reads:   14418 MB in  2.00 seconds = 7217.59 MB/sec

Agora que você já sabe a velocidade do disco, veja o quanto ele está sendo requisitado neste momento com iostat, que faz parte do pacote sysstat, que também pode ser instalado vai apt-get.

# apt-get install sysstat

Agora execute o iostat

# iostat -m /dev/sda
Linux 3.16.0-4-686-pae (fpawks0703) 18-08-2015 _i686_ (4 CPU)


avg-cpu:  %user   %nice %system %iowait  %steal   %idle

          14,24    0,39    1,99    2,72    0,00   80,67


Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn

sda              36,12         0,40         0,40      11524      11660

Veja que no meu caso o acesso ao disco está bem tranquilo com cerca de 0,4 MB de leitura e 0,4 MB de escrita, enquanto que o limite, sem cache, é de 59 MB. Então o problema da lentidão está em outro lugar, mas isso é assunto para outro artigo.

Você pode melhorar o desempenho do disco alterando alguns parâmetros. Consulte:

# hdparm --help

Mas cuidado! Faça isso em um ambiente de testes antes!

sexta-feira, 14 de agosto de 2015

Vários comandos para desligar e reiniciar o Linux

É comum no ambiente Linux ter várias formas de fazer a mesma coisa. Um exemplo é o desligamento do sistema. Há pelo menos quatro comandos para fazer isso, shutdown, reboot, halt e init.

O comando shutdown pode ser usado tanto para desligar quanto para reiniciar o equipamento. Por exemplo:

# shutdown -r now

Esse comando reinicia (-r) o servidor imediatamente (now)

# shutdown -h 10

Esse último desliga (-h) o sistema em 10 minutos. Ideal quando se está baixando da internet um arquivo muito grande na madrugada. Se o tempo estimado for de 60 minutos você pode mandar desligar o equipamento em 100 minutos.

Se você desconfia de um problema de disco você pode forçar o checagem no boot com a opção -F

# shutdown -F -r now

O Linux faz a checagem do disco se ele foi montado pela última vez há muitos dias ou se você já o montou um certo número de vezes. Se você quer evitar isso no próximo boot (se sua empresa vai passar por uma parada elétrica, por exemplo), você pode usar o parâmetro -f.

# shutdown -f -h now

O reboot também pode ser usado para reiniciar o equipamento.

# reboot

Para desligar, o halt é outra opção.

# halt

Também pode-se usar o comando init. O init é usado para se mudar o runlevel do sistema. Há vários runlevels definidos, sendo "0" o halt e "6" o reboot.

# init 6

# init 0


quarta-feira, 12 de agosto de 2015

Olonca Live CD 2015 - Amerigo

Atualizei o Linux Olonca Live CD. O sistema é uma mistura de Debian 8 com Debian CDD. A versão 2015 está homenageando o Amerigo, um macaquinho que estimação do Marcos, um desenho sobre um menino que saia pelo mundo afora procurando pela mãe.


Nesta versão eu utilizo o Window Maker como gerenciador de janelas, só para fugir dos tradicionais sistemas Gnome, KDE, Cinnamon e Mate.


O sistema roda com 512 Mb Ram e um processador de 2.3 Ghz. Se quiser instalar é necessário um disco com 20Gb de espaço livre.

Você pode baixá-lo no link abaixo. 



terça-feira, 11 de agosto de 2015

Qual o melhor comando para compactar um arquivo?

No Linux há várias ferramentas usadas para compactar arquivos. Umas compactam melhor, mas demoram mais. Outras são mais rápidas, mas usam mais o processador. Enfim, cada uma tem suas vantagens e desvantagens. Neste artigo eu analiso algumas delas.

Na análise eu compactei a pasta /etc dez vezes com cada aplicativo medindo o tempo gasto no processo. Também analisei o tamanho final do arquivo compactado. O resultado está na tabela e no gráfico abaixo.


Tecnologia Comando Tempo (s) Tamanho (mb)
Zip zip -r arquivo.zip pasta 5,62 37,00
Gzip tar zcvf arquivo.tar.gz pasta 0,75 3,30
Bzip tar jcvf arquivo.tar.bz2 pasta 2,35 3,00
Compress tar cvf arquivo.tar pasta; compress arquivo.tar 1,23 4,72
Arj arj a arquivo.arj pasta -r 9,02 36,25
Rar rar a arquivo.rar pasta 6,71 29,95


Conclusão

Para minha surpresa o formato ZIP foi o que menos compactou. Até o antigo ARJ, que usei muito na época do MS-DOS, compactou melhor. Já o ARJ foi o que mais tempo levou. Se quiser transferir arquivos para o ambiente Windows a melhor opção será usar o formato RAR. Já os formatos mais usados no Linux tiveram um desempenho nem melhor. Aqui, o BZIP foi o que melhor compactou. Em seguida foi o GZIP. O COMPRESS levou menos tempo que o BZIP, mesmo sendo necessário compactar em dois passos usando primeiro o TAR.

quarta-feira, 1 de abril de 2015

Como recuperar o boot do Linux?

O computador tem o Windows 7 e o cara instala o Ubuntu (ou qualquer outra distribuição Linux) em dual-boot. Aparece aquele menuzinho básico na hora de iniciar o computador perguntando qual sistema você quer iniciar. Tudo funciona até que usuário resolve instalar o Windows 8. Aí o menu de inicialização (o Grub) some. Não dá mais prá carregar o Linux. O que fazer?

Já vi várias pessoas com esse tipo de problema. O que ocorre é que na instalação do Linux o sistema de boot (geralmente o Grub) detecta os sistemas operacionais instalados no computador e cria o menu de opções. Quando você instala uma nova versão do Windows este acha que você só vai usar Windows e simplesmente ignora o Linux.

Para resolver isso é simples. Primeiro dê o boot no computador com um live-cd da mesma forma que você faria se fosse instalar o Linux. Em um terminal texto digite o comando abaixo como root.

# fdisk -l
Disk /dev/sda: 21 GB, 21467980800 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          13      104391    7  HPFS/NTFS
Warning: Partition 1 does not end on cylinder boundary.
/dev/sda2              17        1337    10602900    7  HPFS/NTFS
Warning: Partition 2 does not end on cylinder boundary.
/dev/sda3            1337        2611    10233405    5  Extended
Warning: Partition 3 does not end on cylinder boundary.
/dev/sda5            1337        2548     9727357   83  LinuxWarning: Partition 5 does not end on cylinder boundary.
/dev/sda6            2548        2611      506047   82  Linux swap
Warning: Partition 6 does not end on cylinder boundary.
Warning: Unable to open /dev/sr0 read-write (Sistema de arquivos somente para leitura).  /dev/sr0 has been opened read-only.
Error: /dev/sr0: unrecognised disk label
Error: /dev/zram0: unrecognised disk label

Reparem na linha em negrito. A partição /dev/sda5 contém o drive raiz do Linux. Crie uma pasta para podermos montar o disco.

# mkdir /mnt/disco

Monte a partição do Linux na pasta criada.

# mount /dev/sda5 /mnt/disco

É necessário montar o drive virtual /dev dentro do /mnt/disco

# mount -o bind /dev/ /mnt/disco/dev/

Agora devemos usar o drive /mnt/disco como nosso drive raiz

# chroot /mnt/disco

Agora basta reinstalar o grub.

# grub-install /dev/sda 
Installation finished. No error reported.

Pront! Agora basta reiniciar o equipamento e testar.

segunda-feira, 23 de fevereiro de 2015

Linux no Desktop - aula 01 - Introducao

Após um período ausente estou voltando a postar.

Estive envolvido em alguns projetos no final de 2014, saí de férias de janeiro e agora estou colocando as coisas em dia.

Esse é o primeiro video que pretendo fazer sobre o Linux no Desktop. Aos poucos vou colocar mais aqui no blog. O áudio está um pouco baixo, mas os próximos serão melhores.


terça-feira, 23 de dezembro de 2014

Futurologia

Como em todos os finais de ano, várias pessoas fazem as suas previssões para o ano seguinte. E eu também vou fazer as minhas baseadas em matérias e artigos de revistas, jornais e blogs da internet. Só lembrando algumas que previsões que fiz há alguns anos:

Em 2011 smartphones e tablets eram coisas raras, e o acesso móvel era sofrível. Não se viam pessoas andando pela rua postando coisas no Facebook. O máximo que o pessoal tinha era um celular com alguns mp3, ou um iPod. A tendência mostrava que a partir de 2012 as coisas iriam mudar, e que a computação móvel via smartphone e tablet seria comum em um ou dois anos. Documentos na nuvem, como no Dropbox, seriam mais usados, mas a rede 3g ainda não permite a adição on-line. Pagamentos via smartphone ainda não é muito utilizado, como imaginei que seria, mas acessar banco via dispositivo móvel é bem comum.

Para 2013 eu previa o aumento da virtualização em nuvem, como muitos servidores sendo migrados para a Amazon e Google. Hoje isso é comum, mas achei que em 2014 isso seria bem mais utilizado. A rede 4g chegou, mas só em alguns lugares, e a velocidade não é assim tão alta como previsto. Achei que a copa do mundo traria mais benefícios tecnológicos para as sedes da copa, mas isso não aconteceu, pelo menos não na medida que eu imaginei. Pelo menos a fibra da Tim chegou em casa com 35Mb! O uso dos desktop diminuiu enquanto o de dispositivos móveis, como tablet, aumentou. A utilização do IPv6 não mudou muito, embora alguns sites já respondem a ele. E o FirefoxOS ficou só na previsão. Já na área espacial, empresas privadas começaram e investir nessa área, mas os pacotes turísticos ainda são um sonho.

Mas aqui vão as minhas previsões para os próximos anos.

Para 2015
  • Todos os municípios brasileiros serão cobertos pela banda larga.
  • O uso de smartphone como meio de pagamento deverá ser mais utilizado.
  • As empresas cada vez mais utilizarão a infraestrutura na nuvem.
  • A Artemis deferá lançar e rede sem fio que promete ser mil vezes mais veloz do que as atuais.
  • O uso da energia aeólica será mais utilizada.
  • Algumas casas produzirão 100% da energia que consomem.
  • A TV digital estará implantada em todo o estado de São Paulo.
  • Começarão os testes com carros que farão baliza automaticamente.
  • A administração da internet começará a passar para a  ONU. 


Em 1 ano
  • O uso da nuvem só crescerá.
  • 1/3 dos usuários terão dados na nuvem.
  • 1/2 das empresas colocarão seus dados na núvem.
  • A banda larga popular promete ser expandida para todo o país.
  • 1/2 dos usuários de computador não vão mais depender do desktop.
  • A maioria das TVs serão smart.
  • O IPv6 deverá estar implantado em toda a internet.
  • Carros sairão de fábrica com GPS.
  • Sondas deverão ser enviadas para Marte e Júpiter.
  • São Paulo terá 400 km de ciclovias, enclusive uma ligando o Ibirapuera ao Morumbi.


Em 2 anos
  • Telas de touchscreen deverão ser substituídas devido a falta do produto Índio.
  • Celulares comuns serão raridades.
  • O sistemas Windows Vista e Redhat 5 deixarão de ser suportados.
  • A realidade aumentada será usada em larga escala.
  • Haverá viajens espaciais turísticas, inclusive em torno da Lua.
  • A China será o maior mercado do mundo, passando os EUA. 
  • São Paulo passará a usar também as águas do rio São Lourenço em seu abastecimento.


Em 5 anos
  • O Governo da China migrará seus servidores e desktops para Linux.
  • O Linux será o principal sistema operacional do mundo.
  • 1/2 dos software adquiridos pelas empresas será livre.
  • A rede 5g entrará em operação
  • 95% das cidades brasileiras terão fibra ótica.
  • Saturação do IPv4 na África. 
  • Fim do suporte ao Windows 7 e do Red Hat 6. 
  • Fim das transmisões de TV analógica no Brasil. 
  • Comercialização de TVs de 8 K. 
  • 30% da energia do país não virá de hidroelétricas
  • A energia solar será usada em larga escala. 
  • O trem bala brasileiro deverá entrar em operações. 
  • Começarão a aparecer os carros elétricos autônomos. 
  • Os Vants serão usados pela polícia. 
  • Novas missões para a Lua.
  • Começará a colonização de Marte com a Mars One enviando a primeiro unidade de moradia. 

Em 10 anos
  • Começam a surgir as redes exclusivamente IPv6. 
  • Maior uso de realidade aumentada inclusive com óculos e lentes projetoras. 
  • Aparecerão os robôs para uso doméstico. 
  • 10% do PIB brasileiro deverá ser investido em educação. 
  • Começam as missões tripuladas a Marte. 
  • 2/3 da população do mundo sofrerá com a falta de água potável.
  • O petróleo começará a faltar.


Em 20 anos
  • As casas terão links de internet com 500 Mb, computadores com 20 Tb e processadores de 1 Thz. 
  • Dinheiro em papel será raro. 
  • Muitos voos comerciais não serão tripulados. 
  • Haverá carros comerciais movidos a água, embora a maioria será movido a eletricidade. 
  • Janelas poderão ser substituídas por monitores. 
  • Dormiremos em conchas acústicas. 
  • Faremos exames simples ao usarmos o banheiro. 
  • Sensores monitorarão nossa saúde, com os dados sendo transmitidos via rede sem fio. 
  • Operações a distância serão comuns. 
  • O etanol será mais usado no Brasil do que a gasolina. 
  • As residências reciclarão o lixo que produzirem. 
  • O mundo deverá chegar a 8 bilhões de habitantes e a a Índia será o país mais populoso
  • A Terra terá um défict de 40% de água potável, 50% de alimentos e 45% de energia.


Em 50 anos
  • Bug do timestamp.
  • Será possível fazer upload e download de/para o cérebro. 
  • Entra a operação a rede 6g. 
  • As residências terão links de internet de 5 Gb, micros com 500 Tb e processadores com 1 Phz. 
  • A população do mundo deverá se estabilizar em torno de 10 bilhões. 
  • 50% da população do mundo consumirá 100% dos recursos naturais. 
  • A temperatura da Terra será 5 graus maior do que em 2010. 
  • Haverá um conselho mundial das democracias na ONU. 
  • Será possível fazer escolhas genéticas. 
  • Haverá prédios com mais de 1 Km de altura. 
  • O Brasil será a quarta economia do mundo, Índia a terceira, EUA segunda e a China primeira. 
  • Haverá uma base em Marte. 
  • A clonagem humana será possível tecnicamente.


Em 100 anos
  • Equipamentos serão controlados pela mente. 
  • Carros terão piloto automático. 
  • A Terra será 6,4 graus mais quente do que em 2000. 
  • O nível do mar deverá subir até 82 cm se comparado com 2005.


quarta-feira, 17 de dezembro de 2014

Trabalhando com File Glob e Expressões Regulares

Muito usado em pesquisa de arquivos, File Glob é uma forma de fazer referência a vários arquivos usando uma única expressão. As mais conhecidas, também usadas na linha de comandos do Windows, são o asterisco "*" e o sinal de interrogação "?".

O "?" substitui um único caracter no nome do arquivo. Por exemplo, vamos supor que você tem uma pasta com os seguintes arquivos:

$ ls
carta1.odt  carta4.odt      carta_ext2.odt  ci1.odt  memorando1.odt
carta2.odt  carta5.odt      carta_ext3.odt  ci2.odt  memorando2.odt
carta3.odt  carta_ext1.odt  carta.odt        ci3.odt  memorando3.odt

Para listar os arquivos "carta1.odt", "carta2.odt", etc, mas não "carta.odt", digite.

$ ls carta?.odt
carta1.odt  carta2.odt  carta3.odt  carta4.odt  carta5.odt

O "*" substitui uma sequência qualquer de caracteres, inclusive nenhum. Para listar todos os arquivos que possuem "memorando" no nome, digite:

$ ls memorando*
memorando1.odt  memorando2.odt  memorando3.odt

Outro exemplo, vamos listar todos os arquivos que começam com "carta".

$ ls carta*
carta1.odt  carta3.odt  carta5.odt        carta_ext2.odt  carta.odt
carta2.odt  carta4.odt  carta_ext1.odt  carta_ext3.odt

Reparem que, ao contrário do "?", o "*" também listou o arquivo carta.odt.

Mas há ainda outras construções que não existem no ambiente Windows. Para listar todas as cartas com número 1 até 3 digite:

$ ls carta[123]*
carta1.odt  carta2.odt  carta3.odt

Essa construção considera todos os caracteres dentro de "[]". Para listar, por exemplo, "menino.txt" e "menina.txt" poderíamos usar "menin[ao].txt".

Outra forma é a seguinte:

$ ls carta[1-3]*
carta1.odt  carta2.odt  carta3.odt

O "-" diz "do primeiro caracter até o último". Se quiséssemos listar todos os arquivos que comaçam com números poderíamos usar "[0-9]*".

Podemos usar a negação "^". Para listar todos os arquivos que NÃO sejam de 1 a 3 digitamos:

$ ls carta[^1-3]*
carta4.odt  carta5.odt  carta_ext1.odt  carta_ext2.odt  carta_ext3.odt  carta.odt

Se eu não quiser "carta_ext", basta incluir o caracter "_" no comando acima.

$ ls carta[^1-3_]*
carta4.odt  carta5.odt  carta.odt

Você pode querer também listar todos os arquivos "carta" e "memorando". Para isso, use o "{}".

$ ls {carta,memorando}*
carta1.odt  carta2.odt  carta3.odt  carta4.odt  carta5.odt  carta_ext1.odt  carta_ext2.odt carta_ext3.odt  carta.odt  memorando1.odt  memorando2.odt  memorando3.odt

Reparem que "ci" não foi mostrado.

Essas regras podem ser misturadas. Por exemplo, para mostrar todos os arquivos "carta" ou "memorando" mas que sejam de 3 até 5, digite:

$ ls {carta,memorando}[3-5]*
carta3.odt  carta4.odt  carta5.odt  memorando3.odt

A tabela abaixo resume as opções de File Glob

*
Qualquer coisa
*.txt
?
Um caractere qualquer
arquivo-??.zip
[...]
Qualquer um dos caracteres listados
[Aa]rquivo.txt
[^...]
Qualquer um caractere, exceto os listados
[^A-Z]*.txt
{...}
Qualquer um dos textos separados por vírgula
arquivo.{txt,html}

Já as expressões regulares, ou REGEX, são expressões usadas para referenciar várias sentenças. São muito parecidas com o FileGlob, mas são usadas para pesquisa de texto. Por exemplo, o ponto (.) é usado para substituir um caracter. Já a barra invertida (\) diz que o próximo carcter deve ser interpretado literalmente. Por exemplo, para listar todos os sites dos tribunais regionais estaduais você pode fazer a seguinte regex:

trt\...\.gov\.br

Em outras palavras a regex acima diz para trazer qualquer texto que tenha a string "trt" seguida de um ponto literal (\.) seguida de dois caracteres quaisquer (..) seguida de outro ponto literal (\.) seguida do texto "br".

trt.sp.gov.br
trt.rj.gov.br
trt.ms.gov.br

Se eu quiser apenas os tribunais do Mato Grosso e do Mato Grosso do Sul posso usar o [] para referenciar todos os caracteres que podem aparecer na posição.

trt\.m[st]\.gov\.br

Se quisermos todos os tribunais menos os do Distrito Federal e do Ceará usamos o caracter de negação (^).

trt\.[^cd].\.gov\.br

Uma regex que uso bastaste é para omitor as linhas em branco de um arquivo texto . Para isso uso os posicionadores "^" (começo de linha) e o "$" (fim de linha).

grep -v ^$ arquivo.txt

No comando acima estou pedindo para o grep listar todas as linhas do arquivo "arquivo.txt"" com excessão (-v) daquelas que começam (^) e logo em seguida terminam ($), ou seja, as linhas em branco.

Em meus filtros de conteúdo eu costumo bloquear todos os sites que são acessados por IP. Para isso posso usar a regex {}. Por exemplo, para se referir a qualquer número de 0 a 999, uso a seguinte expresão.

grep -E '^[0-9]{1,3}' arquivo.txt

A regex {a,b} nos diz que a sequência anterior deverá se repetir pelo menos "a" vezes e no máximo "b" vezes. Se quisermos um número com exatos 3 algarismos, podemos usar [0-9]{3,3}. Se quisermos 3 ou mais vezes usamos [0-9]{3,}

Logo, para fazer referência a um endereço IP no começo da URL eu posso usar o seguinte:

^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

Abaixo segue um resumo das expressões regulares.

Meta Nome Descrição
. Ponto Curinga de um caractere
[] Lista Casa qualquer um dos caracteres listados
[^] Lista negada Casa qualquer caractere, exceto os listados
? Opcional O item anterior pode aparecer ou não (opcional)
* Asterisco O item anterior pode aparecer em qualquer quantidade
+ Mais O item anterior deve aparecer no mínimo uma vez
{,} Chaves O item anterior deve aparecer na quantidade indicada {mín,máx}
^ Circunflexo Casa o começo da linha
$ Cifrão Casa o fim da linha
\b Borda Limita uma palavra (letras, números e sublinhado)
\ Escape Escapa um metacaracter, tirando seu poder
| Ou Indica alternativas (usar com o grupo)
() Grupo Agrupa partes da expressão, é quantificável e multinível
\1 Retrovisor Recupera o conteúdo do grupo 1
\2 Retrovisor Recupera o conteúdo do grupo 2 (segue até o \9)
.* Curinga Casa qualquer coisa, é o tudo e o nada
?? Opcional NG Idem ao opcional comum, mas casa o mínimo possível
*? Asterisco NG Idem ao asterisco comum, mas casa o mínimo possível
+? Mais NG Idem ao mais comum, mas casa o mínimo possível
{}? Chaves NG Idem às chaves comuns, mas casa o mínimo possível
Para saber mais sobre esse assunto eu recomendo o site http://aurelio.net/shell/canivete e o livro Programação Shell Script de Julio Cezar Neves.