PostgreSQL para usuários Mysql

Eu sei Mysql, então PostgreSQL não vai ser problema certo ? Errado.

Segue uma lista de soluções que enfrentei , que sirva de guia para quem já enfrentou os mesmos desafios.

Criando o primeiro Banco de Dados

Versão MySQL:

$ mysql -u root -p
 mysql> CREATE DATABASE dbTest;
 mysql> USE dbTest;

No Linux,  você deve logar com o usuário postgres  (após instalar o postgresql ).

$ su - postgres
 postgres@x220:~$ psql # Inicia o console
 postgres=# \h # Lista os comandos SQL disponíveis.
 postgres=# \h [comando] # Mostra o uso do [comando]

Cadê o CREATE DATABASE ?  Não tem, o comando é dado fora do console, deslogue do console com Ctrl-D ou \q e digite:

postgres@x220:~$ createdb dbTest

Legal, vamos entrar no console e usar o USE dbTest… Oops, não tem USE.

postgres=# \? # Lista os comandos internos
postgres=# \c dbTest

Agora você está conectado ao banco de dados “dbTest” como usuário “postgres”.

dbTest=#
OS X

No OS X o usuário postgres não é criado, então você deve rodar o psql no terminal.

CrIANDO UM NOVO USUÁRIO

No Mysql os comandos são parecidos com esses aqui:

mysql> CREATE USER milestone IDENTIFIED BY 'milestone';
mysql> GRANT ALL ON dbTest.* TO milestone;

No postgres a sintaxe é diferente, o comando \h CREATE USER explica.

dbTest=# CREATE USER milestone WITH PASSWORD "milestone";
ERROR: syntax error at or near ""milestone""

dbTest=# CREATE USER milestone WITH PASSWORD 'milestone';
postgres=# GRANT ALL ON DATABASE dbTest TO milestone;
ERROR: database "dbtest" does not exist

Oops, deu erro !!! O problem é que dbtaste realmente não existe, o nome do banco de dados foi convertido para lowercase no comando ( e foi executado dessa forma). A solução é usar aspas duplas como no exemplo abaixo:

postgres=# GRANT ALL ON DATABASE "dbTest" TO milestone;
GRANT

Legal! Agora vamos logar com esse usuário.

postgres=# \c - milestone
FATAL: Peer authentication failed for user "milestone"

hum…. Você deve configurar o  PostgreSQL  para permitir  que o usuario milestone tenha permissão de logar via password.  No arquivo /etc/postgresql/9.<x>/main/pg_hba.conf . Mude as linhas:

local all all peer

para

local all all md5

ou a linha abaixo para permitir apenas para o usuário milestone:

local all milestone md5

Obviamente essa linha deve ser colocada antes da regra válida para todos usuário ou não vai funcionar. Mais ou menos assim:

local all milestone md5
 local all all md5

PostgreSQL deve ser reiniciado:

# service postgresql restart

ou

# /etc/init.d/postgresql restart
PERMISSões Nas TABeLAS

Infelizmente todas as tentativas de ler ou escrever nas tabelas do banco vão falhar.

A especificação define uma hierarquia fixa de catalog.schema.table . No PG “catalog” é o banco de dados.

dbTest=# \dn
List of schemas
Name | Owner
--------+----------
 public | postgres
(1 row)

Então nosso usuário milestone precisa de permissão para acessar dbTest.public.* , tanto para todas as tabelas como as sequencias. A sequencia é usada (e alterada nos inserts) para alguns tipos de dados.

dbTest=# GRANT ALL ON ALL TABLES IN SCHEMA public TO milestone;
dbTest=# GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO milestone;
AUTO_INCREMENT

Obviamente não existe. Mas existe um tipo de dados para isso.

dbTest=# CREATE TABLE foo (id serial PRIMARY KEY, bar text);

O equivalente MySQL é:

mysql> CREATE TABLE foo (id int PRIMARY KEY AUTO_INCREMENT, bar text);
SHOW TABLES, DATABASES etc.
 postgres=# \l # SHOW DATABASES
 postgres=# \dt # SHOW TABLES
 postgres=# \d myTable # DESCRIBE myTable
Arquivos de configuração e testes

Uma instância PostgreSQL possui (e mantém) sua própria área de dados. Esse diretório (também conhecido como datadir) contém arquivos de configuração e a coleção de bancos de dados. Isso permite ter multiplas instâncias do PostgreSQL aceitando conexões em multiplas portas, mas isso também significa ao iniciar o postgres você sempre deverá informar o path dessa área de dados.

postgres@x220:~$ mkdir db13 # Cria nova area de dados
postgres@x220:~$ initdb -D db13 # Inicializa area de dados
postgres@x220:~$ postgres -D db13 & # Roda o PostgreSQL em background
postgres@x220:~$ pg_ctl status -D db13 # Checa se esta rodando
postgres@x220:~$ createdb dbTest # Cria novo banco
postgres@x220:~$ psql # Conecta ao PostgreSQL rodando na porta default (5432)
postgres@x220:~$ pg_ctl stop -D db13 # Para a instancia rodando em db13
postgres@x220:~$ postgres -D db12 -p 6543 & # Roda outro servidor, mas em uma area diferente e em outra porta (6543)
postgres@x220:~$ createdb dbTest -p 6543 # Cria novo DB (mantido pela segunda instancia na porta 6543)
postgres@x220:~$ psql -p 6543 # Conecta em db12

Para encontrar em qual diretório sua instancia do postgres está rodando, você pode usar algo como ps aux | grep postgres .

Socket file errors

Erros como:  /var/run/postgresql/.s.PGSQL.5432.lock not found podem acontecer em sistemas  Debian onde o PostgreSQL não está configurado para subir na inicialização ( rcconf –off postgresql por exemplo)
Existem duas soluções para esse problema, ou você cria /var/run/postgresql :

# mkdir /var/run/postgresql 
# chmod a+w /var/run/postgresql # adiciona permissão de escrita para o diretório

Ou você muda o arquivo postgresql.conf para escrever o socket em outro diretório, como o /tmp

unix_socket_directory = '/tmp' # (reinicie o postgres)

Por outro lado, você pode indicar ao postgreSQL o novo diretório de socket direto da linha de comando:

postgres@x220:~$ psql -h /tmp # Our socket directory is now /tmp

fonte: http://granjow.net/postgresql.html

O ano do linux chegou, e agora ?

O Anahuac soltou um texto no Br-Linux sobre o estado das comunidades linux no Brasil, seguem as minhas opiniões sobre o assunto.

Eu não concordo com tudo que o Anahuac escreveu, mas entendo um pouco dessa amargura que ele tá sentido. Em 200x quando eu conheci o Anahuac por meio de listas de discussão, o ano do linux era o ano corrente + 1, várias empresas se estruturaram em torno das migrações de windows para linux, tinha a Conectiva empregando um monte de gente que desenvolvia software livre no Brasil, tinha um lobby forte pra fazer os governos usarem software livre, hordas de estudantes se envolvendo com traduções.

A gente usava jabber como im, email bacana era o do pessoal do riseup, tinha pouco espaço mas tinha 4 níveis de criptografia no disco. O grande desafio era montar um setup de desktop com o mínimo de drivers proprietários possivel, tinha sites listando softwares alternativos livres, o legal era xingar o KDE pq o QT era livre mas não era GPL. Conheci gente que preferia não usar o Wifi do que instalar driver proprietário ou usar o ndiswrapper com driver do windows… Pessoal se juntava de fim de semana pra fazer uma distro linux bootavel com interface gráfica caber em um disquete de 1.4 Mb só por diversão, o gentoo era uma distro que permitia compilar o sistema inteiro escolhendo a dedo as dependências usadas, era possível escolher a implementação da libPNG desejada por exemplo. Liberdade total pra tunar o SO.

Era tudo muito legal, a própria flexibilidade do software livre permitiu a evolução de modelos de negócio, dos serviços de internet e da própria internet. Com o surgimento dos webApps, compartilhar o código deixou de ser requisito, a liberdade também, o caso mais emblemático foi o Gmail, ele surgiu em uma era onde administrar emails era um pepino, servidor e espaço em disco eram caros. Ele seduziu muita gente oferecendo 1Gb de espaço… naquela época eu tinha um HD de 14.3Gb… Em troca o google só queria a autorização para ler os emails e gerar propaganda direcionada. Muita gente olhou torto, mas a interface era bonita, clean e tinha muito espaço.

Um outro gargalo na adoção do linux era a suite Office, o Star/Open/Br/LibreOffice demorou um tempão pra chegar no nível do MS Office, e quando chegou as pessoas perceberam que era mais cômodo usar uma suite Office on-line, mesmo que com recursos limitados. Ninguém mais se importava em deixar sua planilha de gastos pessoais ou teses acadêmicas em serviços on-line, todos concordam em autorizar o provedor do serviço a vasculhar os documentos para gerar métricas.

As pessoas mudaram, aquela neura com privacidade se foi, pra quase todo mundo é ok trocar a privacidade dos dados por comodidade, bater uma foto e ela aparecer magicamente em um repositório on-line e de graça putz, é ou não é um sonho ?

Então com os devices móveis, todos concordam em deixar aberto seus logs de movimentação, fazendo checkins públicos em estabelecimentos comerciais, ensinando ao provedor do serviço os hábitos de consumo de quem usa o serviço, em troca o usuário sabe onde outros usuários estão indo.

Então fomos invadidos por APIs, os sites deixaram de ser meros portais de informação e se tornaram provedores de serviços e troca de dados, aplicativos desktop foram gradativamente substituídos com vantagens por soluções superiores hospedados em servidores sabe-se lá onde.

Enquanto isso, as listas de discussão foram esvaziando, as comunidades deixaram de crescer …

Em 2002 colaborei com um grupo de entusiastas para apresentar o linux para os bixos de Física na USP, foram palestras e mini-cursos, acho que 80% da turma que participou usa linux até hoje em suas pesquisas de pós-graduação e em seus empregos. Sondei a criação de um grupo de estudos de software livre em 2013 com os bixos de Sistemas de informação na USP Leste e a aceitação foi muito ruim, disseram que trabalhariam com o que pagasse mais, e que não queriam se envolver com discussões políticas, teve um que falou que parecia coisa de comunista, outro falou que não trabalha de graça.

99% dos softwares que o cara usa no dia a dia são software livre, mas pensar em contribuir com a comunidade é quase uma ofensa. Me senti um xiita pregando pra quem não quer ouvir.

Hoje em dia o Stallman é taxado como gordo barbudo excêntrico, ninguém leva nada do que ele diz a sério, provavelmente o garoto que fez o joguinho dos passarinho e desistiu de distribuir por causa da “pressão” seja mais exemplo a ser seguido do que o cara que criou as bases pra industria de TI que temos hoje.

Vejo num futuro próximo o fim da computação pessoal, tudo vai rodar em servidores de empresas e o que teremos em nossos escritórios serão apenas terminais burros.

Boot remoto com pxe no ubuntu server

Configurar um serviço de boot remoto é um skill dos sysadmins da era paleozóica, a idéia é usar um servidor dedicado à persistência de dados, servindo todos os dados, incluindo o sistema operacional via rede. A vantagem desse modelo é o custo de administração, como os sistemas são centralizados em uma máquina, instalar, remover ou configurar todo o parque é muito mais rápido, e é possível administrar o SO de uma máquina mesmo com ela desligada.

Essa técnica, é a base primordial da cloud computing, à partir dessa infra é possível configurar e servir VPS, e migrar de um node pra outro de forma transparente, e com a dose de redundancia certa, o sistema se torna muito confiável, já que uma falha de hardware é minimizada, já que a persistência é feita em outra máquina.

A topologia é simples:

O processo de boot remoto é relativamente simples:

  • o node chama o boot via PXE, que envia pacotes arp pela rede pedindo um IP.
  •  O storage capta esses pacotes, envia um IP para o node junto com algumas configurações, como o path do root e o kernel que será usado.
  • O node, agora portando um IP, pede ao storage um kernel e a imagem de ram via tftp.
  • O kernel boota no node, monta o sistema de arquivo contido na imagem de ram (initramfs), os drivers de rede são carregados.
  • O sistema contido no initramfs monta o sistema root do SO via nfs.
  • O processo de boot continua normalmente, como se fosse de um disco qualquer.

 

As ferramentas usadas para a tarefa são:

  • ISC DHCP Server, serve os IPs e as configurações iniciais.
  • TFTP-HPA, um servidor FTP super simples, que aceita poucos comandos.
  • nfs-kernel-server, um servidor nfs que roda parcialmente em kernel space, e tem um desempenho superior ao seu equivalente user space.

O primeiro passo é instalar os pacotes:

apt-get install dhcp3-server tftpd-hpa nfs-kernel-server initramfs-tools

Uma boa configuração do DHCP server (/etc/dhcp/dhcpd.conf ) tem mais ou menos o seguinte aspecto:

ddns-update-style none;
option domain-name "exemplo.com";
option domain-name-servers 8.8.8.8;
default-lease-time 86400;
max-lease-time 604800;
option time-offset -18000;
authoritative;
log-facility local7;
allow booting;
allow bootp;
subnet 192.168.0.0 netmask 255.255.255.0 {
        get-lease-hostnames on;
        use-host-decl-names on;
        range 192.168.0.200 192.168.0.210;
        option routers 192.168.0.10;
        option subnet-mask 255.255.255.0;
        option broadcast-address 192.168.0.255;
        filename "pxelinux.0";
        next-server 192.168.0.10;
}

Lembrando que o IP 192.168.0.10 é o IP do servidor DHCP/Storage/Gateway

Atente ao Range de IPs na no parametro “range”, preste atenção nele isso é importante, volto nesse ponto já já.

A configuração do TFTPD é simples e auto explicativo:

# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"

A configuração do serviço de compartilhamento NFS é simples, por exemplo:

/srv/client_root_fs 192.168.0.*(rw,no_root_squash,async) 
/srv/node01 192.168.0.*(rw,no_root_squash,async) 
/srv/node02 192.168.0.*(rw,no_root_squash,async) 
/srv/node03 192.168.0.*(rw,no_root_squash,async) 
/srv/node04 192.168.0.*(rw,no_root_squash,async) 
/data 192.168.0.*(rw,no_root_squash,async)

O PXE tem uma configuração, /var/lib/tftpboot/pxelinux.cfg/default, ela tem mais ou menos o aspecto abaixo:

DEFAULT linux
LABEL linux
    kernel vmlinuz
    append root=/dev/nfs initrd=initrd.img nfsroot=192.168.0.10:/srv/client_root_fs ip=dhcp rw

Todas as requisições que chegarem, receberão essa configuração, com esses parâmetros, isso é bacana, mas teremos problemas se todos os nodes usarem a mesma imagem de disco. É relativamente simples separar os diretórios /var e /tmp dos nodes usando links. Mas é possivel individualizar toda a imagem de root, inclusive personalizando os pacotes e serviços instalados.

Criando por exemplo 10 clones da imagem principal, denominados de node01, node02 …. node10. É possivel ter 10 máquinas completamente individualizadas, podendo inclusive servir distros diferentes.

Pra essa mágica funcionar, devemos criar uma configuração PXE para cada IP do range de ips que definimos na configuração do dhcpd. Por padrão o PXE procura pelas configurações em um arquivo com o mac address da placa que fez a requisição, por exemplo:

pxelinux.cfg/01-00-14-22-a1-53-85

Depois ele tenta pegar o arquivo à partir do IP que o node recebeu, mas antes o IP deve ser convertido para Hexadecimal, por exemplo:

pxelinux.cfg/C0A800C9

O ip 192.168.0.201 convertido para Hex é : C0A800C9, uma forma simples de converter esses ips esta no site: http://www.kloth.net/services/iplocate.php

Por último o PXE tenta ler o arquivo default, ou seja, todas as máquinas que você não declarar vão subir com a configuração do arquivo default.

pxelinux.cfg/default

Segue um exemplo de configuração PXE para um IP declarado (pxelinux.cfg/C0A800C9
) , por exemplo :

DEFAULT linux
LABEL linux
    kernel vmlinuz
    append root=/dev/nfs initrd=initrd.img nfsroot=192.168.0.10:/srv/node01 ip=dhcp rw

 

Feito isso, toda máquina que pegar um IP pelo DHCP, vai subir o sistema à partir de uma das cópias de imagem de sistema, se o IP estiver no range, ele pega um diretório especifico, se não estiver pega o default.

Deu pra sacar a mágica envolvida ? Não importa qual máquina boota, a partição de root não tá atrelado ao hardware, se o hardware pifa ? É só espetar outro que ele funciona ! Sem precisar configurar nada, é só mandar subir o PXE. Precisa aumentar o número de nodes ? Sem problema ! É só clonar as imagens, as configurações do PXE e aumentar o range no DHCP, simples assim.

Back to the Mac

Depois quase 3 anos sem usar mac como sistema principal, comprei um imac 🙂 Me arrependo de não ter comprado antes.

Já falei em outros posts, gosto do hacrdware da apple, ele é bem equilibrado, bonito, funcional e na minha mão, dura muito… Tenho 2 imacs de 98, funcionando, rodando debian… só não uso no dia a dia pq preciso da WEB e seus ajaxes e js usam memória e processador demais pra um G3 233Mhz com 192Mb de RAM. Tenho um ibook, funcionando, com um safari safado, mas funcionando e por ai vai. Meu único produto apple que morreu foi um macbook pro Rev A, que foi o primeiro mac com processador intel a ser vendido…. Por ser um Rev A, era esperado… as vezes ele liga, mas não é confiável.

A apple perdeu um pouco do esmero, lembro de um imac aluminio que tirei da caixa em 2008, ele veio até com flanelinha pra limpar a tela, esse meu, só veio com mouse, teclado, o mac e o cabo…. nada de DVD, controle remoto ou flanelinha.

O que me motivou a comprar um iMac principalmente foram os problemas de hardware dos meus dois computadores domésticos. Meu desktop, de 2008 mas com tecnologia de 2007 que foi por 2 anos um hackintosh de respeito, mas que tinha um problema de limitação de memória (apenas 2gb sem possibilidade de expansão). Com o tempo ele ficou muito lerdo pra rodar o Leopard, troquei por um linux, mas como uso muitas maquinas virtuais ficou inviavel.

A outra máquina é um dell studio, máquina que me arrependo de ter comprado, apesar do processador potente o resto não acompanha, teclado mole, tela com cores ruins, som péssimo, HD lerdo e bateria que arriou com menos de 2 anos… nas ultimas semanas a rede tanto por wifi quanto por cabo se tornaram intermitentes… não importa o SO, um fiasco. A gota ficou pela atualização do driver proprietário da AMD/ATI, ela abandonou o suporte a minha placa, e o driver livre não presta… Já passei por isso antes, daqui a alguns releases do kernel o driver velho não vai compilar mais, e eu vou ficar na mão … Acho que usar um windows 7 com cygwin é um final mais digno pro notebook.

Enfim, não desisti do linux, onde ele funciona sem me encher o saco ele continuará sendo usado, como no meu netbook, mas o imac me traz uma estabilidade, tenho garantia pelos próximos 3 anos, e pelo menos mais 5 anos de suporte ao sistema operacional pela apple, e após esse período ele será uma workstation bacana rodando um linux leve pra máquinas antigas.

Minha fase de sair recomendando macs a torto e a direito passou, mas me traz uma satisfação enorme dizer que daquela época pra cá, temos 3 sistemas operacionais decentes tanto pra users avançados quanto iniciantes, tá de saco cheio de um vai pro outro, sem frescura, simples assim.

 

 

 

 

Como fazer um keylogger/mouse no linux ?

É bem simples, mais do que qualquer um pode imaginar… existe um comando chamado xinput, ele testa e configura dispositivos de entrada conectados ao Xorg, pois bem, para listar os devices conectados:

 

 

 

[liquuid@catalina ~]$ xinput list
⎡ Virtual core pointer                    	id=2	[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]
⎜   ↳ Microsoft  Microsoft Basic Optical Mouse v2.0 	id=10	[slave  pointer  (2)]
⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]
    ↳ Virtual core XTEST keyboard             	id=5	[slave  keyboard (3)]
    ↳ Power Button                            	id=6	[slave  keyboard (3)]
    ↳ Power Button                            	id=7	[slave  keyboard (3)]
    ↳   USB Keyboard                          	id=8	[slave  keyboard (3)]
    ↳   USB Keyboard                          	id=9	[slave  keyboard (3)]
    ↳ cx88 IR (Prolink Pixelview MPEG         	id=11	[slave  keyboard (3)]

 

 

 

Isso mostra o ID do meu teclado, no caso o número 8, então o comando abaixo é suficiente para capturar tudo que eu digitar:

 

 

[liquuid@catalina ~]$ xinput  test 8
key release 36 
key press   54 
ckey release 54 
key press   52 
zkey press   53 
xkey release 52 
key release 53 
key press   56 
bkey release 56 
key press   25 
wkey release 25

 

 

Basta então deixar isso rodando em background e processar as teclas digitadas com mais calma depois.

Um exemplo de código para o keylogger pode ser encontrado aqui.

 

Para nossa felicidade da pra gravar o mouse também, basta usar :

[liquuid@catalina ~]$ xinput  test 10
motion a[0]=1046 a[1]=270 
motion a[0]=1055 a[1]=269 
motion a[0]=1063 a[1]=266 
motion a[0]=1068 a[1]=264 
motion a[0]=1070 a[1]=264 
motion a[0]=1071 a[1]=263 
motion a[0]=1072 a[1]=262 
motion a[0]=1073 a[1]=261 
motion a[0]=1074 a[1]=260 
motion a[0]=1075 a[1]=259 
motion a[0]=1075 a[1]=258 
motion a[0]=1076 a[1]=257 
motion a[0]=1077 a[1]=256 
motion a[0]=1076 a[1]=256 
motion a[0]=1075 a[1]=255 
motion a[0]=1074 a[1]=255 
motion a[0]=1073 a[1]=255 
motion a[0]=1072 a[1]=255 
motion a[0]=1071 a[1]=255 
motion a[0]=1070 a[1]=255 
motion a[0]=1069 a[1]=254 
motion a[0]=1068 a[1]=253 
button press   1 
motion a[0]=1069 a[1]=252 
motion a[0]=1071 a[1]=252 
motion a[0]=1072 a[1]=252 
motion a[0]=1073 a[1]=252 
motion a[0]=1074 a[1]=253 
motion a[0]=1076 a[1]=254 
motion a[0]=1077 a[1]=254 
motion a[0]=1078 a[1]=254 
motion a[0]=1079 a[1]=254 
motion a[0]=1080 a[1]=255 
motion a[0]=1081 a[1]=256 
motion a[0]=1083 a[1]=257 
motion a[0]=1085 a[1]=258 
motion a[0]=1086 a[1]=259 
motion a[0]=1088 a[1]=260 
motion a[0]=1089 a[1]=260 
motion a[0]=1091 a[1]=262 
motion a[0]=1092 a[1]=263 
motion a[0]=1093 a[1]=264 
motion a[0]=1094 a[1]=265 
motion a[0]=1095 a[1]=265 
motion a[0]=1096 a[1]=266 
motion a[0]=1097 a[1]=267 
motion a[0]=1098 a[1]=268 
motion a[0]=1099 a[1]=269 
motion a[0]=1100 a[1]=270 
motion a[0]=1101 a[1]=271 
motion a[0]=1102 a[1]=272 
motion a[0]=1103 a[1]=272 
motion a[0]=1105 a[1]=273 
motion a[0]=1106 a[1]=274

 

Alguns encaram o xinput como uma mega falha de segurança e você caro leitor ?

Como salvar um vídeo do (seu site de videos favorito) no novo flash plugin ?

Houve um tempo (até poucas semanas atrás), em que para salvar um vídeo FLV qualquer da web, bastava ir no diretório /tmp, e copiar o arquivo FlashFEYHS2W34F para o desktop com outro nome, ou ainda assistir o vídeo usando o mplayer enquanto o mesmo era baixado.

Mas as coisas mudaram, a Adobe, visando proteger o direito autoral da indústria, mudou o comportamento do Flash, agora ao começar o stream de vídeo ele deleta o arquivo do HD, assim ele fica inacessível para o sistema e para os outros programas, mas não para o processo que originou o stream. Ou seja, enquanto esse processo estiver rodando o sistema de arquivos não libera o espaço ocupado pelo arquivo deletado, assim ele continua disponível para o processo pai indefinidamente.

Que tal usar essa característica dos sistemas de arquivos do linux a nosso favor ?

Primeiro passo, escolha um vídeo no youtube e dê play, em seguida abra um terminal e digite:

lsof | grep deleted | grep /tmp/Flash

Essa etapa pode demorar alguns minutos, dependendo do tamanho do seu sistema e da quantidade de processos rodando, e no fim ele vai te gerar uma saida semelhante a essa:

chromium- 4103    liquuid   22w      REG       8,21  20022146     394236 /tmp/FlashXXfBMa8x (deleted)

Esse comando nos mostra qual o comando e o número do processo que tem um arquivo aberto deletado cujo o nome se inicia com ‘/tmp/Flash’. Se você pegar o nome do arquivo ‘/tmp/FlashXXfBMa8x’ e der um ‘ls’, ele não vai estar lá, por outro lado todos os processo do linux tem seus files decriptors muito bem organizados e guardados no diretório ‘/proc’.

Dessa forma usando o número do processo (segunda coluna) 4103, basta dar o comando:

ls -l /proc/4103/fd/ | grep '/tmp/Flash'

A saída será parecida com essa :

l-wx------ 1 liquuid liquuid 64 2011-03-26 16:31 22 -> /tmp/FlashXXfBMa8x (deleted)

Ou seja, existe um link chamado ’22’ linkado com o conteúdo do arquivo deletado, então basta copiar ‘/proc/4103/fd/22’ para outro diretório, para ter sua cópia do vídeo. Não é simples, mas é uma forma.

EDIT: Esse post não mostra uma solução de como baixar videos do Youtube, mas de qualquer site e qualquer conteúdo.