Transferindo arquivos via SFTP

O SSH é um verdadeiro canivete suíço. Além de permitir rodar aplicativos e fazer toda a administração de um servidor remotamente, ele também pode ser usado para transferir arquivos. A forma mais básica de fazer isso é usar o sftp, um pequeno utilitário que faz parte do pacote padrão.

Ele oferece uma interface similar à dos antigos programas de FTP de modo texto, mas todos os arquivos transferidos através dele trafegam através de um túnel encriptado, criado através do SSH. Na prática, temos uma espécie de VPN temporária, criada no momento em que é efetuada a conexão. A melhor parte é que o próprio SSH cuida de tudo, não é necessário instalar nenhum programa adicional.

Para se conectar a um servidor usando o sftp, o comando é:

$ sftp usuario@servidor

Se o servidor ssh na outra ponta estiver configurado para escutar em uma porta diferente da 22, é preciso indicar a porta no comando, incluindo o parâmetro “-o port=”, como em:

$ sftp -o port=2222 morimoto@gdhpress.com.br

A partir daí, você tem o prompt do sftp. Use o comando “put” para dar upload de um arquivo e “get” para baixar um arquivo do servidor para a pasta local. Para navegar entre as pastas do servidor, use os comandos “cd pasta/” (para acessar a pasta), “cd ..” (para subir um diretório), “ls” (para listar os arquivos) e “pwd” (para ver em qual diretório está). Veja um exemplo:

morimoto@athenas:~$ sftp -o port=2222 morimoto@gdhpress.com.br
Connecting to gdhpress.com.br…
Password: ********

sftp> ls
gdhpress.tar.gz www

sftp> get gdhpress.tar.gz
Fetching /home/morimoto/gdhpress.tar.gz togdhpress.tar.gz
/home/morimoto/gdhpress.tar.gz 100% 523MB 945.1KB/s 09:13

sftp> put backupdb.gz
Uploading backupdb.gz to /home/morimoto/ backupdb.gz
backupdb.gz 100% 98MB 967KB/s 01:43

sftp> pwd
Remote working directory: /home/morimoto

Você pode estar se perguntando como consegui taxas de transferência de quase 1 MB/s tanto para download quanto para upload. O segredo aqui é que não estou transferindo os arquivos de um servidor remoto para meu micro de trabalho, mas sim transferindo diretamente entre dois servidores remotos, onde me loguei no primeiro via SSH e abri a conexão com o segundo a partir dele. Se os dois servidores estão ligados a portas de 10 megabits e existir uma boa conectividade entre eles, taxas de até 1 MB/s são perfeitamente normais. Se você pagar um pouco a mais para ter portas de 100 megabits, então é possível conseguir taxas 10 vezes maiores. 🙂

Voltando ao sftp, existem ainda os comandos “lcd” (local cd), “lls” (local ls), “lmkdir” (local mkdir) e “lpwd” (local pwd), que permitem mudar o diretório local. Digamos, por exemplo, que você está atualmente no diretório “/mnt/arquivos”. Ao abrir a conexão via sftp, tudo que você baixar será colocado automaticamente neste diretório. Mas, digamos que você queira baixar um determinado arquivo para o diretório “/home/joao”. Você usaria, então, o comando “lcd /home/joao” para mudar o diretório local e depois o “get arquivo” para baixá-lo já na pasta correta. Na hora de dar upload de um arquivo é a mesma coisa. Você pode usar o “lls” para listar os arquivos no diretório local e depois o “put arquivo” para dar upload.

Naturalmente, existem meios mais práticos de transferir os arquivos, usando programas gráficos que suportam o sftp. O dois mais usados são o próprio Konqueror (no KDE) e o Nautilus (no Gnome), que além de serem gerenciadores de arquivos, suportam o uso de diversos protocolos de transferência, incluindo o sftp.

No Konqueror, digite “fish://”, seguido pelo login e o endereço do servidor (separados por uma arroba) na barra de endereços, como em “fish://gdh@gdhn.com.br“. Ele exibe uma janela gráfica pedindo a confirmação da identidade do servidor (apenas na primeira conexão) e em seguida outra, solicitando a senha. Depois de estabelecida a conexão, você tem acesso direto aos arquivos do servidor, dentro das permissões da sua conta de usuário. Você pode também especificar diretamente uma pasta no servidor remoto que quer acessar (por padrão você cai na pasta home), como em “fish://gdh@gdhn.com.br/home/revista/”.

Para tornar as coisas mais práticas, eu uso o recurso de dividir a janela em duas, que você encontra no “Janela > Separar visão em topo/base”. Assim, fico com uma janela mostrando os arquivos locais e outra mostrando os arquivos do servidor, e posso simplesmente arrastar os arquivos que devem ser transferidos:

m4455f4cd

O Konqueror não é muito bom em prever erros com a conexão, se limitando a exibir um “não é possível se conectar ao servidor”. Nesses casos, abra um terminal e experimente tentar se conectar via texto para ver as mensagens de erro e poder assim diagnosticar o problema.

No Nautilus, clique em “Arquivo > Conectar ao servidor”. Na janela seguinte, escolha “SSH” na opção “Tipo de serviço” e forneça o endereço do servidor e o login que será usado, no campo “Nome do Usuário”. O campo com a pasta permite especificar qual pasta será acessada por padrão ao efetuar a conexão, mas ela é opcional. O campo “Porta” é usado apenas caso você tenha configurado o servidor SSH para escutar em uma porta diferente da 22:

48e5d58b
143cbb10

Isso cria um ícone de acesso, que aparece tanto no desktop quanto na barra “Locais” do Nautilus. Para finalmente efetuar o acesso, clique sobre o ícone e forneça a senha.

A grande limitação do sftp (e das interfaces gráficas para ele) é que ele exige intervenção manual e, por isso, não é adequado para uso em scripts para realizar transferências automatizadas (como no caso de um script de backup). Para isso, temos o “scp”, um cliente ainda mais primitivo, que permite especificar em uma única linha o login e endereço do servidor, junto com o arquivo que será transferido.

A sintaxe do scp é: “scp arquivo_local login@servidor:pasta_remota”, como em:

$ scp /home/gdh/arquivo.tar gdh@gdhn.com.br:/var/www/download

Você pode adicionar também as opções “-p” (que preserva as permissões de acesso além das datas de criação e modificação do arquivo original), “-r” (que permite copiar pastas, recursivamente), “-v” (verbose, onde são mostradas todas as mensagens) e “-C” (que ativa a compressão dos dados, ajudando muito na hora de transferir grandes arquivos via Internet). Nesse caso, o comando ficaria:

$ scp -prvC /home/gdh/arquivo.tar gdh@gdhn.com.br:/var/www/download

Ao incluir a opção “-r“, você pode especificar diretamente uma pasta no primeiro parâmetro, o que faz com que todo o seu conteúdo seja transferido. Esta opção é interessante para backups.

O SSH pode ser ainda usado como “meio de transporte” por outros programas, como no caso do rsync, um utilitário que permite sincronizar uma pasta local com uma pasta do servidor. Ele é capaz de fazer uma cópia diferencial, transferindo apenas os trechos dos arquivos que foram modificados o que o torna um utilitário quase que ideal para backup de pastas com um grande volume de arquivos. Ele é capaz inclusive de consertar arquivos danificados e dar upload de atualizações, enviando apenas as partes dos arquivos que forem diferentes, o que torna a transferência muito mais rápida.

O uso básico do rsync, para sincronizar duas pastas locais, seria “rsync -a origem/ destino/”. A pasta destino poderia ser um segundo HD, um cartão de memória ou um compartilhamento de rede, por exemplo. Usado dessa forma, o rsync serve apenas para fazer backups locais, mas, ao combiná-lo com o SSH, abrimos uma nova gama de possibilidades.

Para usar o rsync via SSH, o comando acaba sendo bem mais complexo, mas o resultado é bem interessante. Ele vai apenas atualizar as partes dos arquivos remotos que foram modificados, sem dar upload dos arquivos inteiros novamente, como muitos programas de backup fariam.

Para sincronizar a pasta local “/home/gdh” com a pasta remota “/backup“, no servidor “gdhn.com.br” (onde seria feito um backup dos arquivos locais), usando o login “gdh”, por exemplo, o comando seria:

$ rsync -av –rsh=”ssh -l gdh” /home/gdh/ gdh@gdhn.com.br:/backup

Para recuperar posteriormente o backup no caso de um desastre, baixando os arquivos salvos no servidor, bastaria inverter a ordem dos diretórios no comando, como em:

$ rsync -av –rsh=”ssh -l gdh” gdh@gdhn.com.br:/backup /home/gdh/

No primeiro comando os arquivos da pasta “/home/gdh” vão para a pasta /backup do servidor e no segundo eles são recuperados, subscrevendo os arquivos locais. A parte mais significativa deste comando é o parâmetro “–rsh=”ssh -l gdh”, que diz para o rsync usar um programa externo (o SSH) para fazer o trabalho.

Uma observação é que usando apenas os parâmetros “-av”, o rsync apenas atualiza e grava novos arquivos na pasta do servidor, sem remover arquivos que tenham sido deletados na pasta local. Por um lado isso é bom, pois permite recuperar arquivos deletados acidentalmente, mas por outro pode causar confusão. Se você preferir que os arquivos que não existem mais sejam deletados ao atualizar o backup, adicione o parâmetro “–delete”, como em:

$ rsync -av –delete –rsh=”ssh -l gdh” /home/gdh/ gdh@gdhn.com.br:/backup

O rsync não vem instalado por padrão na maioria das distribuições, mas pode ser instalado rapidamente usando o gerenciador de pacotes, como em:

# apt-get install rsync

Sobre o Autor

Redes Sociais:

Deixe seu comentário

X