linguagens são como mulheres: se você usa muitas, não vai prestar para nenhuma

Essa área contém anotações pessoais: "quebra-galhos" do dia-a-dia. Serve para eu acessar de qualquer lugar, mas resolvi tornar pública na esperança que alguma nota "quebre o galho" de outra pessoa.

bash: atalho para o último argumento do comando anterior

$ mkdir -p um/diretorio/la/na/pqp
$ cd !$
$ ping site.com.br
$ nc !$ 80

bash: criar um arquivo vazio

Aprendi com o @juliobash:
$ > arquivo

Abrir no terminal com Nautilus

Uma alternativa ao plugin nautilus-open-terminal pode ser criada com um script:

#!/bin/bash

if [ $# -eq 0 ]; then
   dir=$(echo "$NAUTILUS_SCRIPT_CURRENT_URI" | cut -c 8-)
else
   read i <<< "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"
   [ -d "$i" ] && dir="$i" || dir=$(dirname "$i")
fi

gnome-terminal --working-directory="$dir" --tab

Ao salvar este cara com algum nome como "abrir no shell" em ~/.gnome2/nautilus-scripts e dar permissão de execução (chmod +x), a opção de utilizá-lo será adicionada ao menu de contexto do Nautilus.

O script segue a lógica:

- Se você clicar com o direito numa área vazia (nenhum arquivo), ele abre um terminal no diretório atual.
- Se você selecionar um diretório, ele abre o tal diretório.
- Se você selecionar um ou mais arquivos, ele abre o diretório pai do primeiro arquivo.

Conversão de base no shell

Dica: o projeto bashacks pode ajudar a fazer estes cálculos de maneira mais rápida.

# hexa para decimal
$ echo $((0xa))
41

# hexa para caractere
$ echo -e "\x41"
A

# decimal pra hexa
$ printf "%x\n" 32
20

# string para caracteres hexa
$ echo -n "Fernando" | hd
00000000  46 65 72 6e 61 6e 64 6f  |Fernando|

# caracteres hexa para string
$ echo -e "\x46\x65\x72\x6e\x61\x6e\x64\x6f"
Fernando

No bc, ibase significa "input base", ou seja, base da entrada. E obase, "output base", base da saída. Então é só se divertir:

$ bc -q
obase=2
255
11111111
ibase=10
obase=16
10
A
obase=8
ibase=16
A
12

# one-liner de hexa para binário

$ echo "ibase=16; obase=2; FF" | bc
11111111

# função para converter decimal para binário
$ function dec2bin { echo "obase=2;$1" | bc; }
$ dec2bin 127
1111111

PS.: O bc só trabalha com números hexa com letras maiúsculas.

Tamanho em bytes dos arquivos um diretório

$ (find . -type f -printf "%s+"; echo 0) | bc

Conversão de .csv para planilha .ods

# apt-get install python python-pip
# pip install odfpy
$ csv2ods -i arquivo.csv -o planilha.ods

Mais sobre a ODFPY.

Gnome 3 no Debian Sid com nvidia

# apt-get update && apt-get install gnome-shell module-assistant nvidia-kernel-common
# m-a auto-install nvidia-kernel-source
# apt-get install nvidia-glx

Na wiki do Debian há instruções mais detalhadas para instalação do driver da nVidia.

"Hello world" em nasm no Linux

; # apt-get install nasm
; $ nasm -f elf64 hello.asm
; $ ld -o hello hello.o
; $ ./hello

   section .data ; seção .data do ELF, onde ficam os dados
msg: db "Mente Binária", 10
len: equ $-msg ; "$" significa "aqui" -> posição atual menos posição do texto. len terá o tamanho da string

   section .text ; seção .text do ELF, onde fica o código
global _start ; faz o label "_start" visível ao linker (ld)

mov edx,len ; arg3 da syscall write(), quantidade de bytes para imprimir (tamanho)
mov ecx,msg ; arg2, pointeiro para o endereço da string
mov ebx,1 ; arg1, em qual file descriptor (fd) escrever. 1 é stdout
mov eax,4 ; 4 é o código da syscall write()
int 0x80 ; interrupção 0x80 do kernel (executa a syscall apontada em eax)

mov ebx,0 ; arg1 da syscall exit(). 0 significa execução com sucesso
mov eax,1 ; 1 é o código da syscall exit()
int 0x80 ; executa a syscall apontada em eax, que vai sair do programa

Montar uma imagem raw

# ver filesystem
sudo fdisk -ul file.img

# criar um loop device
sudo losetup -fs file.img -o $((START_SECTPR*512)) # depende do filesystem

# montar o loop device
sudo mount -o loop /dev/loop0 /mnt

Bloquear CTRL+C no Bash

#!/bin/bash
trap '' 2 # ou INT
echo "Pressione [Ctrl+C] pra testar..."
sleep 20
trap 2

Converter um IPv4 inteiro em xxx.xxx.xxx.xxx

/* Código em C */

int i = 3232235521;

printf("%d.%d.%d.%d\n",
  (i>>24) & 0xff,
  (i>>16) & 0xff,
  (i>>8) & 0xff,
  i & 0xff);

/* 192.168.0.1 */

Dá uma olhada no ipconv também.

Substituir \n com o sed

$ sed ':a;N;$!ba;s/\n/NADA/g' teste

Deletar somente binários ELF de um diretório

$ for i in *; do file "$i" | grep -Fqw "ELF" && rm "$i"; done

Configurar data e hora

# date -s MMDDHHmmAAAA

Via NTP:
# apt-get install ntpdate
# ntpdate ntp.cais.rnp.br

Enviar a data e hora do sistema para o BIOS (se bem que o recomendável é deixar a hora do BIOS em UTC)

# hwclock --systohc

Compartilhamento de conexão

# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Redirecionamento para host

# iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 81 -j DNAT --to-destination 192.168.0.100

Redirecionamento de porta

# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3128

Backup de arquivo

$ cp arquivo.conf{,.old}
ou mesmo
$ cp arquivo.conf{,.`date +%Y%m%d`}

watch sem watch

$ while :; do netstat -na; sleep 2; done

Túnel SSH

ssh -ND 9999 usuario@host

-N -> não executa comandos remotos
-D 9999 -> porta do SOCKS local

É necessário configurar o browser para usar o SOCKS v5 localhost:9999.

Montar compartilhamento Windows

# mount -t smbfs //192.168.0.1/dados /mnt -o username=admin,password=1234

chmod em tipos de arquivo

$ find . -type d -exec chmod 0755 {} \;
$ find . -type f -exec chmod 0644 {} \;
$ find . -type f -name '*.htm*' -exec chmod 0644 {} \;

Testar SSLv2

$ openssl s_client -connect localhost:443 -ssl2
$ openssl ciphers -v 'HIGH'

dos2unix sem dos2unix

$ tr -d \\r < dosfile > unixfile

Renomear placas de rede em distros Debian-based

# vi /etc/udev/rules.d/70-persistent-net.rules