Caríssimos leitores, o último post desta série apresentou a poderosa ferramenta SSH e alguns de seus principais usos em sistemas GNU/Linux. Agora, vamos abordar os comandos de cópia de arquivos incluídos no SSH.
Cópia de arquivos
Quando você está no trabalho e decide que precisa ter determinado arquivo em casa, como você faz?
Se você costuma usar um pen drive como meio de transporte, ou enviar um e-mail para sua própria conta, não se envergonhe. Estas são as soluções usadas pela maioria das pessoas.
No entanto, se você lá os blogs do IBM developerWorks, suponho que você tenha interesse em fazer o melhor uso possível da tecnologia, e não permanecer com os hábitos mais comuns e menos eficientes.
Vamos ver agora como o nosso querido SSH pode ajudar a copiar arquivos diretamente de um local para outro, sem recorrer a pen drives, e-mails ou qualquer outro intermediário.
SCP
O primeiro comando de cópia do SSH é o scp
. Seu nome vem de Secure copy, e ele funciona de forma muito semelhante ao comando cp
.
Vamos voltar ao cenário proposto no início deste artigo: você está no trabalho (computador chamado trab
), encontra uma imagem perfeita para usar como papel de parede e grava-a localmente com o nome imagem.jpg
na pasta /home/ftal/
. O objetivo é usar essa imagem no computador de casa (chamado casa
), pois no trabalho o papel de parede infelizmente tem que ser o logo da empresa... :)
Nota: Para estas instruções, é fundamental que o servidor SSH esteja instalado e em funcionamento nos dois computadores: trab
e casa
.
Suponhamos ainda que o seu usuário, no trabalho, seja ftal
(de Fulano de Tal) e, no computador de casa, seja fulano
.
Abra um shell no computador do trabalho e digite o comando:
[ftal@trab ~]$ scp imagem.jpg fulano@casa:~/
Este comando diz: copie o arquivo local imagem.jpg
para o usuário fulano
no computador casa
, no diretório ~/
(um atalho para o diretório home do usuário fulano
).
Quando for pedida a senha, forneça a senha que o usuário fulano
usa no computador casa
.
Vamos conferir?
É sempre bom conferir se as cópias que fizemos de fato ocorreram conforme esperado.
Para isso, vamos voltar a entrar na máquina remota (agora, a máquina remota é o computador de casa):
[ftal@trab ~]$ ssh fulano@casa fulano@casa's password:
Preencha a senha do usuário fulano
no computador casa
para completar seu login remoto e visualizar o prompt do computador casa
:
[fulano@casa ~]$ _
Puxa, já vi que o usuário fulano
no computador casa
não leu o post sobre como deixar seu prompt do Bash mais útil e bonito. ;)
Agora, liste o conteúdo do diretório home desse usuário:
ls
Veja que o arquivo imagem.jpg
está lá. Caso contrário, ocorreu algum erro na cópia. Repita alguns passos e veja se aparece alguma mensagem de erro, até corrigir o problema.
Depois de confirmar que tudo correu certo, pode sair do computador de casa.
[fulano@casa ~]$ logout
Cópia para outro diretório
Se você já tem uma pasta onde guarda todos os seus papéis de parede (por exemplo, eu uso ~/temas/backgrounds/
para isso), pode usá-la diretamente no comando, da seguinte forma:
[ftal@trab ~]$ scp imagem.jpg fulano@casa:~/temas/backgrounds/
Viu? Funciona exatamente como o comando cp
.
Agora ao contrário!
Se você estava trabalhando muito e não deu tempo de enviar o arquivo gravado para o computador de casa, não se aflija. Contanto que o computador do trabalho esteja ligado, basta usar o mesmo scp
a partir do computador de casa:
[fulano@casa ~] scp ftal@trab:~/imagem.jpg temas/backgrounds/
Viu só? De uma única vez, copiamos o arquivo imagem.jpg
que estava no home do usuário ftal
no computador trab
para a pasta temas/backgrounds/
no home do usuário fulano
na máquina local. Nada mal para um comando de três letras. :)
Se você quisesse copiar o arquivo remoto para a pasta atual:
[fulano@casa ~] scp ftal@trab:~/imagem.jpg ./
E se, além disso, o arquivo imagem.jpg
estivesse na pasta Desktop/
da máquina trab
:
[fulano@casa ~] scp ftal@trab:~/Desktop/imagem.jpg ./
Cópia de diretório inteiro (recursiva)
Quer copiar um diretório inteiro? Basta usar a opção -r
(de recursive):
[fulano@casa temas] scp -r backgrounds ftal@trab:~/ Password: paisagem-01.jpg 100% 0 15.0KB/s 00:00 paisagem-02.jpg 100% 0 13.0KB/s 00:00 paisagem-03.jpg 100% 0 19.0KB/s 00:00 abstrato-01.jpg 100% 0 24.0KB/s 00:00 abstrato-02.jpg 100% 0 17.0KB/s 00:00 espaço-001.jpg 100% 0 14.0KB/s 00:00 espaço-002.jpg 100% 0 27.0KB/s 00:00 espaço-003.jpg 100% 0 19.0KB/s 00:00 espaço-004.jpg 100% 0 23.0KB/s 00:00 espaço-005.jpg 100% 0 20.0KB/s 00:00 espaço-006.jpg 100% 0 11.0KB/s 00:00
Com -r
, o scp
copia o diretório e todo seu conteúdo (inclusive subdiretórios e seus respectivos conteúdos). Evidentemente, a opção -r
pode ser usada em cópias nos dois sentidos: local para remoto e remoto para local.
Melhor que FTP
O venerável FTP (File Transfer Protocol) existe em sua forma atual desde 1985, ou seja, já mostra sinais da idade. Mas muitas pessoas já se acostumaram a usá-lo para enviar e baixar arquivos pela Internet, de forma que simplesmente abandoná-lo é uma má ideia.
Felizmente, o pessoal do OpenSSH (a implementação do protocolo SSH mais usada no planeta, a mesma presente em todas as distribuições GNU/Linux) pensou nisso e criou o sftp
, uma espécie de FTP sobre SSH.
O principal uso do sftp
é nos casos em que o usuário não sabe com exatidão o que deseja baixar do computador remoto, ou para onde no computador remoto ele deseja enviar seus arquivos locais.
Suponhamos que você tenha baixado no computador do trabalho uma outra imagem boa para usar como papel de parede, mas não consegue se lembrar do nome usado para salvá-la. Você tem duas possibilidades:
- Entrar via SSH, procurar o arquivo, fazer logout e usar o
scp
para copiar o arquivo, ou - Entrar via
sftp
, procurar o arquivo e baixá-lo imediatamente.
O recurso de SFTP vem ativado por padrão na maioria dos sistemas GNU/Linux, então basta ter o servidor instalado na máquina para entrar nela via sftp
.
No cenário acima, bastaria usarmos o seguinte comando:
[fulano@casa ~]$ sftp ftal@trab Connecting to ftal@trab... ftal@trab's password: sftp> _
Note que a última linha indica que estamos num prompt SFTP. Ou seja, podemos digitar comandos.
Infelizmente, o prompt do SFTP não é igual ao Bash, ou seja, ele não é um shell completo, nem possui a capacidade de executar scripts. Os comadnos que ele aceita podem ser listados com o comando ?
no seu prompt:
sftp> ? Available commands: bye Quit sftp cd path Change remote directory to 'path' chgrp grp path Change group of file 'path' to 'grp' chmod mode path Change permissions of file 'path' to 'mode' chown own path Change owner of file 'path' to 'own' df [-hi] [path] Display statistics for current directory or filesystem containing 'path' exit Quit sftp get [-P] remote-path [local-path] Download file help Display this help text lcd path Change local directory to 'path' lls [ls-options [path]] Display local directory listing lmkdir path Create local directory ln oldpath newpath Symlink remote file lpwd Print local working directory ls [-1aflnrSt] [path] Display remote directory listing lumask umask Set local umask to 'umask' mkdir path Create remote directory progress Toggle display of progress meter put [-P] local-path [remote-path] Upload file pwd Display remote working directory quit Quit sftp rename oldpath newpath Rename remote file rm path Delete remote file rmdir path Remove remote directory symlink oldpath newpath Symlink remote file version Show SFTP version !command Execute 'command' in local shell ! Escape to local shell ? Synonym for help
Um bom primeiro comando, assim que se entra num servidor SFTP, é o ls
:
sftp> ls arquivo1.txt arquivo2.txt arquivo3.txt Desktop temas fotos foto-03.jpg foto-1.jpg foto-2.jpg foto-99.jpg sftp> _
Nem adianta experimentar as opções do comando ls
, como ls -lah
, porque não se trata do mesmo comando; o ls
do sftp
está embutido neste.
Para entrar no diretório Desktop/
, basta usar o comando cd
:
sftp> cd Desktop sftp> ls googleearth.desktop irpf2009-desktop.desktop irpf2010-desktop.desktop mozilla-thunderbird-bin.desktop pidgin.desktop rfb-receitanet201002.desktop skype.desktop papel_de_parede_legal.jpg sftp> _
Opa! Temos um arquivo que queremos: papel_de_parede_legal.jpg
, dentro de Desktop/
. Vamos baixá-lo para a máquina local?
Primeiro, veja onde você está na máquina local com o comando lpwd
(de local pwd):
sftp> lpwd Local working directory: /home/fulano/ sftp> _
Acontece que o objetivo é gravar o arquivo remoto no diretório de temas da máquina local. Então, temos que mudar de diretório na máquina local. Isso é feito com o comando lcd
(de local cd):
sftp> lcd temas/backgrounds sftp> lpwd Local working directory: /home/fulano/temas/backgrounds sftp> _
Ok, então estamos nos locais certos dos dois computadores. Agora, basta baixar o arquivo desejado:
sftp> get papel_de_parede_legal.jpg Fetching /home/ftal/Desktop/papel_de_parede_legal.jpg to papel_de_parede_legal.jpg /home/fulano/temas/backgrounds/papel_de_parede_legal.jpg 100% 230523 50.1KB/s --:-- ETA sftp> _
Seria possível salvar o arquivo localmente com um nome diferente:
sftp> get papel_de_parede_legal.jpg pdpl.jpg Fetching /home/ftal/Desktop/papel_de_parede_legal.jpg to pdpl.jpg /home/fulano/temas/backgrounds/pdpl.jpg 100% 230523 50.1KB/s 00:00 ETA sftp> _
Upload
Se você quiser enviar um arquivo, basta usar o comando put
:
sftp> lpwd Local working directory: /home/fulano/temas/backgrounds sftp> lls paisagem-01.jpg paisagem-02.jpg paisagem-03.jpg abstrato-01.jpg abstrato-02.jpg espaço-001.jpg espaço-002.jpg espaço-003.jpg espaço-004.jpg espaço-005.jpg espaço-006.jpg sftp> put abstrato-01.jpg Uploading abstrato-01.jpg to /home/ftal/Desktop/abstrato-01.jpg abstrato-01.jpg 100% 75390 32.4KB/s 00:00 sftp> _
Prático, não?
Ao final, saia do shell SFTP remoto com CTRL+D ou digite o comando bye
.
SFTP gráfico
Meu objetivo aqui é que você permaneça na linha de comando, aproveitando e aprendendo ao máximo os poderes dessa ferramenta. Porém, é claro que existem vezes em que um programa gráfico cai muito melhor.
Nesses casos, a boa notícia é que a maioria dos gerenciadores de arquivos e programas de download para GNU/Linux são compatíveis com SFTP. Então, basta abri-los, informar qual é o servidor, o nome e a senha do usuário remoto e conectar.
Conclusão
O SSH é uma ferramenta poderosa. Neste post, mostrei os recursos de transferência de arquivos por meio do SSH, que estão entre os mais usados. Nos próximos posts, vou apresentar outros usos ainda mais flexíveis e poderosos. Até lá!