SSH Forwarding

Uma das funções  freqüentemente negligenciadas do protocolo SSH é o encaminhamento (ou forwarding ou ainda tunelamento) de conexões.
Exemplos de uso:
  • Administração remota de serviços que só permitem acesso através do endereço localhost (127.0.0.1). Dois serviços com esse comportamento por padrão são o Webmin e o CUPS. (redirecionamento local -> remoto)
  • Acesso seguro a serviços que normalmente não suportam criptografia, como o VNC (redirecionamento remoto-> local).
  • Acesso seguro (criptografado) a emails e sites através de redes públicas e não criptografadas. (redirecionamento local -> remoto)
  • Permitir o acesso de máquinas remotas à sua rede. (redirecionamento remoto-> local)
  • Exibir a tela de um programa gráfico em outra estação. (redirecionamento X11)

Caso 1: Redirecionamento local -> remoto

Nesse caso, vamos especificar uma porta TCP local (na máquina onde é executado o cliente ssh). Todo o tráfego que atingir essa porta será encaminhado pelo túnel SSH para um endereço na rede remota. Esse endereço pode ser a própria máquina onde roda o servidor SSH ou outra, desde que acessível pelo servidor SSH. A porta local precisa estar disponível. Para fechar o túnel, encerra-se a conexão.

A sintaxe do comando SSH para esse caso é:


ssh -L [endereço local]:porta local:host remoto:porta remota servidor_ssh

Onde:
Endereço Local: Endereço IP que será associado a essa conexão. Esse parâmetro é opcional. Se for omitido, a conexão será criada em todos os endereços/interfaces de rede do computador. Se for informado um endereço IP diferente de 127.0.0.1 (ou localhost), outras máquinas poderão utilizar-se do túnel. Caso  seja informado o endereço 127.0.0.1 o túnel ficará disponível apenas para a própria máquina cliente.
Porta Local: Porta TCP que receberá as conexões na máquina cliente e as encaminhará para a máquina remota. Esta porta precisa estar disponível.
Host Remoto: Endereço na rede do servidor SSH  para onde as requisições serão encaminhadas.
Porta Remota: Porta no Host Remoto para onde as conexões serão encaminhadas.
Servidor SSH: Endereço ou nome do servidor SSH que receberá as conexões.
Obs: outros parâmetros (como nome de usuário, porta SSH, etc) podem ser informados normalmente.

Exemplos:
acessando remotamente a administração de impressoras do CUPS (porta 631):
Vamos direcionar o trafego na porta local 5555 para a porta 631 do servidor 192.168.0.12, através de uma conexão SSH nesse mesmo servidor:

ssh -L 5555:192.168.0.12:631 192.168.0.12

Caso fosse necessário utilizar um usuário específico (por exemplo: joao), o comando ficaria assim:

ssh -L 5555:192.168.0.12:631 joao@192.168.0.12

Caso o servidor SSH estivesse em uma porta diferente da padrão (22), digamos porta 2222, faríamos dessa maneira:

ssh -p 2222 -L 5555:192.168.0.12:631 joao@192.168.0.12

Caso você deseje que as máquinas que se conectarem à sua estação possam utilizar o tunel, o comando seria (supondo que o IP de sua estação seja 10.0.0.28):
ssh -p 2222 -L 10.0.0.28:5555:192.168.0.12:631 joao@192.168.0.12

Com a conexão estabelecia, bastaria abrir o navegador web e acessar o endereço
http://localhost:631 (ou http://10.0.0.28:631 no caso de outras máquinas) para realizar o acesso.

Outro exemplo prático: Suponhamos que você está com seu notebook em um CyberCafe, com conexão WiFi Open (sem criptografia) e deseja acessar os emails no servidor POP de sua empresa de forma segura. Para isso, você precisaria ter acesso SSH a um dos equipamentos da empresa, como um firewall ou outro servidor. Supondo-se que que dados de conexão sejam:
Firewall (com acesso SSH na porta 7788): 200.200.200.200
Servidor de Email (rodando POP na porta 110) : 172.16.100.50
Usuário para acesso SSH: antonio

o comando seria: 

ssh -p 7788 -L 110:172.16.100.50: antonio@200.200.200.200

Agora, basta configurar seu cliente de email para acessar o servidor POP-3 no endereço 127.0.0.1, porta 110 e acessar suas mensagens de forma criptografada.

Caso 2: Redirecionamento remoto -> local
Esse redirecionamento é pouco usado, mas mesmo assim bastante útil. Já o utilizei algumas vezes da seguinte maneira: na empresa onde trabalhava, eu administrava algumas máquinas que ficavam dentro da rede dos clientes. Essas máquinas normalmente não tinham acesso à internet, e o processo de liberação de internet para esses equipamentos era muito burocrático, o que causava problemas na hora de fazer alguma atualização ou instalar novos programas. Minha solução foi utilizar um redirecionamento SSH remoto, permitindo que os equipamentos utilizassem o proxy da minha empresa, e saíssem para a internet através do meu link. Em um caso como esse, o comando ficaria assim:

ssh -R 3128:192.168.0.210:8080 juca@200.200.200.200

No exemplo acima, eu conectei com o usuário juca no servidor 200.200.200.200. Após conectar, basta configurar o programa para utilizar um proxy no endereço localhost, porta 3128. Tudo que a máquina remota "jogar" nesta porta será redirecionado para a porta 8080 do IP 192.168.0.210 na minha rede local.

Caso 3: Redirecionamento do X Server (X11 Forwarding)

Esse é um dos mais simples, e ao mesmo tempo mais úteis: é possível "puxar" a tela de um programa de outro servidor Linux. Nesse caso, o programa estará rodando na máquina remota e apenas as informações de mouse, teclado e tela são trafegadas via rede. É semelhante ao próprio protocolo SSH (onde é realizado um acesso a uma máquina remota, e todo o processamento ocorre na máquina acessada. Nossa máquina apenas envia e recebe informações de teclado e tela). A diferença nesse caso é que como é utilizado o protocolo X, as informações de tela são gráficas, ao invés de apenas texto. Para utilizar o redirecionamento, simplesmente abra um terminal modo texto (já dentro do ambiente gráfico) e digite:

ssh -X usuario@192.168.0.1

A opção -X faz toda a mágica para você. Agora basta rodar qualquer aplicativo gráfico, e embora a tela apareça no seu computador, todo o processamento ocorrerá na máquina remota. O aplicativo também estará acessando o hardware (discos, fitas, etc) da máquina remota. Isso é utilizado para acessar consoles de administração remota, para tarefas que seriam muito complexas (ou mesmo inviáveis) em linha de comando. Mais simples impossível!

Resumo dos principais comandos do vi/vim


Opções da linha de comando:
-R abre arquivo como somente leitura
-r/-L lista os arquivos swap no diretório atual, bem como em diretórios chave e sai.
+ começa na última linha
+numero começa na linha determinada. Ex: vim +15 arq.txt começa na linha 15 de arq.txt, ao invés da primeira
-o abre os arquivos em "janelas" (a tela fica dividida horizontalmente). Útil para comparar arquivos.
-O abre os arquivos em "janelas verticais" (a tela fica dividida verticalmente).
-X não conecta em um servidor X
Modos de operação:
O vim possui dois modos de operação:

Modo de inserção de texto:
nesse modo, o vim comporta-se como um editor de texto normal, ou seja, cada tecla pressionada exibirá seu valor na tela normalmente. Para entrar no modo de inserção de texto, pressione a tecla INSERT ou a tecla i.

Modo de comandos:
É o modo inicial do Vim. Nesse modo, cada tecla (ou combinação de teclas) possui uma função especial. Para enttrar no modo de comandos, pressione a tecla ESC.

Arquivos SWAP
Quando você abre um arquivo no vim, ele cria um arquivo oculto de swap. As alterações são registradas inicialmente nesse arquivo de swap e efetivadas no arquivo editado a cada operação de salvamento. Caso haja algum problema durante a edição do arquivo (ex: falta de energia), quando o mesmo arquivo é editado novamente, o vim detecta a presença do arquivo swap e oferece algumas opções:

Operações com arquivos:
Observação: sempre que há a troca do arquivo atual (quando há mais de uma arquivo aberto), quando um arquivo é aberto para edição ou quando o programa for encerrado, é necessário salvar o arquivo, caso o mesmo tenha sofrido alterações. Caso não se deseje salvar as alterações, deve-se acrescentar uma exclamação "!" - para forçar o fechamento/troca do arquivo, desprezando as alterações no arquivo atual.

:e arquivo
abre um arquivo para edição.

:r arquivo
insere o conteúdo de um arquivo na posição atual do cursor

:w
grava o arquivo atual e continua o trabalho.

:w arquivoNovo
salva o arquivo atual com outro nome (arquivNovo) e continua trabalhando no mesmo arquivo (ao contrário de outros editores de texto que passariam a trabalhar com o arquivo recém criado - no caso do exemplo, arquivoNovo).

:q 
sai do programa.

:q!
sai do programa descartando as alterações.

:n 
passa para o proximo arquivo aberto.

:prev
passa para o arquivo anterior

:first 
vai para o primeiro arquivo

:last
vai para o ultimo arquivo

Observação: você pode "juntar" alguns comandos, de modo a realizar duas operações juntas. Por exemplo, para gravar o arquivo e sair do programa, ao invés de executar :w e :q em separado, você pode fazer :wq. Da mesma forma, :wn grava o arquivo atual e vai para o próximo, :wprev grava o arquivo atual e vai para o anterior e assim sucessivamente. Por último, :x é um apelido para :wq (salva e sai).

Comandos para navegação dentro do Texto:

h
um caracter para a esquerda

l
um caracter para a direita


j
uma linha abaixo


k
uma linha acima

método para memorizar: a tecla J lembra uma seta pra baixo, e tem exatamente esta função. A tecla ao seu lado (K) é a seta para cima. A tecla à esquerda das duas (H) faz a seta para a esquerda. E a tecla à direita do conjunto (L) é a seta para a direita. Simples, não?

gg
:1
primeira linha

:numero
vai para a linha desejada. Por exemplo, :50 vai para a 50ª linha.

numero+G
vai para a linha desejada. Por exemplo, 10G vai para a 10ª linha.

G
vai para a última linha. Obs: G maiúsculo.

^
inicio da linha (é preciso digitar um espaço depois do símbolo)

$
final da linha.

Comandos de busca:
f+caracter
avança para a direita até a primeira ocorrência do caracter

F+caracter
retrocede para a esquerda até a primeira ocorrência do caracter

/
pesquisa por string/regex.

?
pesquisa por string/regex. Pesquisa no sentido inverso (para cima).

*
pesquisa pela palavra sobre o cursor.

#
pesquisa pela palavra sobre o cursor. pesquisa no sentido inverso (para cima).

Em quaisquer uma das pesquisas, pressione n para localizar a proxima ocorrência. Pressione N para pesquisar no sentido inverso (ocorrencia anterior - para cima).

Comandos de substituição:
:[range]s/texto\ a\ procurar/[texto a substituir]/[gc]

Onde:
[range] (opcional): range de linhas onde realizar a busca/substituição. Se não informado, faz apenas na linha atual. Caracteres especiais em range:
% - todas as linhas (arquivo todo)
$ - até o fim do arquivo

texto\ a\ procurar: texto que será buscado. Caracteres especiais (que têem significado devem ser protegidos (ou escapados) com "\" (sem aspas), como no exemplo. Para pesquisar por uma "\" utilize "\\".
[texto a substituir] (opcional): texto que será trocado pelo que for encontrado. Se não for informado, o texto encontrado é removido e nada é posto em seu lugar.
g: substitui todas as ocorrencias do texto encontrado. Se não estiver presente, apenas a primeira ocorrência de cada linha é substituida.
c: pede confirmação antes de fazer a substituição


Exemplos de ranges:
:%s/brasil/Brasil/        (arquivo todo)
:50,60s/brasil/Brasil/   (da linha 50 até a 60)
:20,$s/brasil/Brasil/      (da linha 20 até o fim do arquivo)



Mais exemplos:
:%s/brasil/Brasil/gc

Comandos para alteração de caracteres:
~
inverte a caixa do caracter (converte maiusculas em minusculas e vice-versa)

x
d+espaço
exclui o caracter sobre o cursor

r+caracter
troca o caracter sobre o cursor pelo digitado.

Comandos para operações com Buffer (área de transferência)
D
dd
recorta toda a linha e coloca no buffer

Y
yy
copia toda a linha para o buffer, sem removê-la do local atual.

p
cola o conteúdo do buffer na posição atual do cursor.

P
cola o conteúdo do buffer na linha acima da posição atual do cursor.

Repetição de comandos:
numero+comando
executa o comando um certo numero de vezes. Exemplos:

10x
exclui 10 caracteres (o que está sob o cursor mais nove à direita)

3yy
copia 3 linhas para o buffer (a linha atual mais duas abaixo)

5l
"anda" 3 caracteres para a direita

Mistureba (misturando comandos):
dG
recorta tudo entre a posição atual do cursor e o fim do arquivo. Mistura de d (recortar) com G (ir para o final do arquivo)

dgg
recorta tudo entre a posição atual do cursor e o começo do arquivo. Mistura de d (recortar) com gg (ir para o começo do arquivo)

:r !cmd
executa o comando cmd e insere sua saída no texto.

:wq
salva e sai

:wn
salva e avança para o próximo arquivo

:wlast
salva e avança para o último arquivo

Modos Visuais:
Permitem selecionar trechos do texto, para definir o local que será afetado pelo próximo comando (uma busca e substituição ou copiar/recortar, por exemplo).
Existem dois tipos:
Visual (ativado com a tecla v): permite selecionar trechos de linhas, linhas inteiras ou uma combinação disso (uma linha interira e um pedaço de outra abaixo ou acima, por exemplo). Após selecionar, é possível recortar (com d), copiar (com y) ou substituir por outro conteúdo (com p).
Visual Block (ativado com ctrl+v): similar ao modo visual, porém permite selecionar blocos de texto. Por exemplo, é possível selecionar apenas a primeira coluna de cada linha (útil para descomentar várias linhas de uma vez em arquivos de configuração).

Opções úteis
Obs: a maioria dessas opções pode ser colocada diretamente no arquivo de configuração do vim, /etc/vim/vimrc

:set ai
:set noai
Liga/desliga autoidentação. Normalmente é desejavel deixar a identação ligada, principalmente quando se está escrevendo programas/scripts (deixa o texto mais organizado). Porém, em algumas situações pode atrapalhar. Por exemplo, quando se cola texto no PuTTY (a partir do Windows) e essa opção está ativada, o texto fica com um aspecto de "escada" (veja imagem abaixo).

:set bg=dark
:set bg=light
Informa ao vim qual se a cor de fundo da tela é clara ou escura, para que ele possa utilizar um esquema de cores agradável. Normalmente conexões via console e SSH tem fundo escuro, enquanto que em emuladores de console dos ambientes gráficos (kterm no KDE, gterm no Gnome, etc) costumam ter o fundo claro.

:set showcmd
:set noshowcmd
Faz com que os comandos digitados, bem como os modificadores numéricos apareçam, à esquerda da informação de posição do cursor.

:set number
:set nonumber
Exibe/oculta o numero de cada linha

:help assunto
Mostra o help do vim sobre o assunto/comando informado. Será aberta uma nova "janela" (a tela ficará dividida horizontalmente em duas). Para alternar entre as janelas, pressione CTRL+W CTRL+W (duas vezes). Assim, você pode alternar entre a navegação no texto do help e no seu próprio texto. Para sair do help, pressione :q. Você voltará à edição do seu arquivo.

:! cmd
executa o comando cmd no shell dentro do vim, e mostra o resultado na tela (mas não altera o arquivo). Útil para compilar código/realizar testes durante a programação sem precisar sair do editor. Ou para trocar a permissão do arquivo sendo editado, para permitir salvar as alterações.
Ex:
:! gcc -o main main.c
:!php arquivo.php
:chmod u+w arquivo.txt