Tutorial

Como usar o SFTP para transferir arquivos com segurança com um servidor remoto

Linux Basics

Introdução

O FTP, ou “File Transfer Protocol” era um método não criptografado popular de transferência de arquivos entre dois sistemas remotos.

O SFTP, que significa “SSH File Transfer Protocol”, ou “Secure File Transfer Protocol”, é um protocolo separado incluído com o SSH que funciona de forma semelhante, mas com uma conexão segura. A vantagem é a capacidade de aproveitar uma conexão segura para transferir arquivos e percorrer o sistema de arquivos tanto no sistema local quanto no remoto.

Em quase todos os casos, o SFTP é preferível ao FTP devido aos seus recursos de segurança existentes e à capacidade de acompanhar uma conexão via protocolo SSH. O FTP é um protocolo inseguro que deve ser usado apenas em casos limitados ou em redes confiáveis.

Embora o SFTP seja integrado em muitas ferramentas gráficas, este guia irá demonstrar como usá-lo através de sua interface de linha de comando interativa.

Como se conectar com o SFTP

Por padrão, o SFTP usa o protocolo SSH para autenticar e estabelecer uma conexão segura. Por causa disso, os mesmos métodos de autenticação presentes no SSH estão disponíveis.

Embora as senhas sejam fáceis de usar e configuradas por padrão, recomendamos que você crie chaves SSH e transfira sua chave pública para qualquer sistema que precise acessar. Isso é muito mais seguro e pode lhe economizar tempo a longo prazo.

Por favor, consulte este guia para configurar chaves SSH a fim de acessar seu servidor, caso ainda não tenha feito isso.

Se você puder se conectar à máquina usando o SSH, então completou todos os requisitos necessários para usar o SFTP para gerenciar arquivos. Teste o acesso SSH com o seguinte comando:

  • ssh sammy@your_server_ip_or_remote_hostname

Se isso funcionar, saia novamente digitando:

  • exit

Agora, podemos estabelecer uma sessão SFTP executando o seguinte comando:

  • sftp sammy@your_server_ip_or_remote_hostname

Você irá conectar-se ao sistema remoto e seu prompt irá mudar para um prompt SFTP.

Se você estiver trabalhando em uma porta SSH personalizada (não a porta padrão 22), então abra uma sessão SFTP da seguinte forma:

  • sftp -oPort=custom_port sammy@your_server_ip_or_remote_hostname

Isso irá conectá-lo ao sistema remoto através de sua porta especificada.

Recebendo ajuda no SFTP

O comando mais útil para aprender primeiro é o comando help. Isso lhe dá acesso a um resumo da ajuda do SFTP. Você pode chamá-lo digitando um desses comandos no prompt:

  • help

ou

  • ?

Isso irá exibir uma lista dos comandos disponíveis:

Output
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 [-Ppr] remote [local] Download file help Display this help text lcd path Change local directory to 'path' . . .

Vamos explorar alguns dos comandos acima nas seções a seguir.

Podemos navegar pela hierarquia de arquivos do sistema remoto usando alguns comandos que funcionam de maneira semelhante às suas contrapartes do shell.

Primeiro, vamos nos orientar descobrindo em qual diretório estamos atualmente no sistema remoto. Assim como em uma sessão de shell típica, é possível digitar o seguinte para obter o diretório atual:

  • pwd
Output
Remote working directory: /home/demouser

Podemos visualizar o conteúdo do diretório atual do sistema remoto com outro comando familiar:

  • ls
Output
Summary.txt info.html temp.txt testDirectory

Observe que os comandos dentro da interface do SFTP não são os comandos normais do shell e não são tão dotados de recursos, mas implementam alguns dos sinalizadores opcionais mais importantes:

  • ls -la
Output
drwxr-xr-x 5 demouser demouser 4096 Aug 13 15:11 . drwxr-xr-x 3 root root 4096 Aug 13 15:02 .. -rw------- 1 demouser demouser 5 Aug 13 15:04 .bash_history -rw-r--r-- 1 demouser demouser 220 Aug 13 15:02 .bash_logout -rw-r--r-- 1 demouser demouser 3486 Aug 13 15:02 .bashrc drwx------ 2 demouser demouser 4096 Aug 13 15:04 .cache -rw-r--r-- 1 demouser demouser 675 Aug 13 15:02 .profile . . .

Para chegar a outro diretório, emitimos este comando:

  • cd testDirectory

Agora, podemos percorrer o sistema de arquivos remoto, mas e se precisarmos acessar nosso sistema de arquivos local? Podemos direcionar comandos para o sistema de arquivos local precedendo-os com um l para local.

Todos os comandos discutidos até agora possuem equivalentes locais. Podemos imprimir o diretório de trabalho local:

  • lpwd
Output
Local working directory: /Users/demouser

Podemos listar o conteúdo do diretório atual na máquina local:

  • lls
Output
Desktop local.txt test.html Documents analysis.rtf zebra.html

Podemos também alterar o diretório com o qual desejamos interagir no sistema local:

  • lcd Desktop

Transferindo arquivos com o SFTP

Navegar pelos sistemas de arquivos remotos e locais é de utilidade limitada sem a possibilidade de transferir arquivos entre os dois.

Transferindo arquivos remotos para o sistema local

Se quisermos baixar arquivos do nosso host remoto, fazemos isso usando o seguinte comando:

  • get remoteFile
Output
Fetching /home/demouser/remoteFile to remoteFile /home/demouser/remoteFile 100% 37KB 36.8KB/s 00:01

Como você pode ver, por padrão, o comando get baixa um arquivo remoto para um arquivo com o mesmo nome no sistema de arquivos local.

Podemos copiar o arquivo remoto para um nome diferente especificando o nome em seguida:

  • get remoteFile localFile

O comando get também recebe alguns sinalizadores de opção. Por exemplo, podemos copiar um diretório e todo o seu conteúdo especificando a opção recursiva:

  • get -r someDirectory

Podemos dizer ao SFTP para manter as permissões e tempos de acesso apropriados usando o sinalizador -P ou -p:

  • get -Pr someDirectory

Transferindo arquivos locais para o sistema remoto

Transferir arquivos para o sistema remoto é também bastante fácil, utilizando o comando “put” nomeado apropriadamente:

  • put localFile
Output
Uploading localFile to /home/demouser/localFile localFile 100% 7607 7.4KB/s 00:00

Os mesmo sinalizadores que funcionam com o get se aplicam ao put. Sendo assim, para copiar um diretório local inteiro, emita o comando:

  • put -r localDirectory

Nota: Atualmente, existe um bug nas versões do OpenSSH enviadas com os lançamentos atuais do Ubuntu (pelo menos de 14.04 a 15.10) que impede o comando acima de funcionar corretamente. Ao emitir o comando acima para transferir conteúdo para um servidor usando a versão problemática do OpenSSH, o seguinte erro ocorrerá: Couldn't canonicalise: No such file or directory.

Para contornar esse problema, crie o diretório de destino na parte remota primeiro digitando mkdir localDirectory. Depois disso, o comando acima deve funcionar sem erros.

Uma ferramenta familiar útil ao baixar e carregar arquivos é o comando df, que funciona de forma semelhante à versão de linha de comando. Usando isso, verifique se você possui espaço suficiente para completar as transferências que lhe interessam:

  • df -h
Output
Size Used Avail (root) %Capacity 19.9GB 1016MB 17.9GB 18.9GB 4%

Observe que não há variação local deste comando, mas podemos contornar isso emitindo o comando ! .

O comando ! nos leva a um shell local, onde podemos executar qualquer comando disponível em nosso sistema local. Podemos verificar o uso de disco digitando:

  • !

e em seguida

  • df -h
Output
Filesystem Size Used Avail Capacity Mounted on /dev/disk0s2 595Gi 52Gi 544Gi 9% / devfs 181Ki 181Ki 0Bi 100% /dev map -hosts 0Bi 0Bi 0Bi 100% /net map auto_home 0Bi 0Bi 0Bi 100% /home

Qualquer outro comando local funcionará como esperado. Para retornar à sua sessão do SFTP, digite:

  • exit

Agora, você deve ver o retorno do prompt do SFTP.

Manipulações de arquivo simples com o SFTP

O SFTP permite executar um tipo de manutenção de arquivos básica que é útil ao trabalhar com hierarquias de arquivos.

Por exemplo, é possível alterar o proprietário de um arquivo no sistema remoto com:

  • chown userID file

Observe como, ao contrário do comando de sistema chmod, o comando do SFTP não aceita nomes de usuário, e usa ao invés disso UIDs. Infelizmente, não há nenhuma maneira fácil de saber o UID apropriado de dentro da interface do SFTP.

Uma solução alternativa poderia ser:

  • get /etc/passwd
  • !less passwd
Output
root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh . . .

Observe como em vez utilizar o comando ! por si só, usamos ele como um prefixo para um comando local de shell. Isso funciona para executar qualquer comando disponível em nossa máquina local e poderia ter sido usado com o comando local df anteriormente.

O UID estará na terceira coluna do arquivo, conforme delimitado por caracteres de dois-pontos.

Da mesma forma, podemos alterar o proprietário do grupo de um arquivo com:

  • chgrp groupID file

Novamente, não há nenhuma maneira fácil de se obter uma listagem dos grupos do sistema remoto. Podemos contornar esse problema com o seguinte comando:

  • get /etc/group
  • !less group
Output
root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4: tty:x:5: disk:x:6: lp:x:7: . . .

A terceira coluna possui o ID do grupo associado com nome na primeira coluna. É isso que estamos procurando.

Felizmente, o comando chmod funciona como esperado no sistema de arquivos remoto:

  • chmod 777 publicFile
Output
Changing mode on /home/demouser/publicFile

Não há nenhum comando para manipular permissões de arquivos locais, mas é possível definir a máscara de usuário local, de forma que qualquer arquivo copiado para o sistema local tenha as permissões apropriadas.

Isso pode ser feito com o comando lumask:

  • lumask 022
Output
Local umask: 022

Agora, todos os arquivos regulares baixados (desde que a sinalização -p não seja usado) terão as permissões 644.

O SFTP permite criar diretórios em sistemas remotos e locais com lmkdir e mkdir, respectivamente. Eles funcionam como esperado.

O resto dos comandos de arquivo tem como destino apenas o sistema de arquivos remoto:

  • ln
  • rm
  • rmdir

Esses comandos replicam o comportamento básico das versões do shell. Se precisar executar essas ações no sistema de arquivos local, lembre-se de que é possível acessar um shell emitindo este comando:

  • !

Ou execute um comando único no sistema local precedendo o comando com ! , desta forma:

  • !chmod 644 somefile

Quando tiver terminado com sua sessão do SFTP, use exit ou bye para encerrar a conexão.

  • bye

Conclusão

Embora o SFTP seja uma ferramenta simples, é bastante útil para administrar servidores e transferir arquivos entre eles.

Por exemplo, é possível usar o SFTP para possibilitar usuários específicos a transferir arquivos sem acesso ao SSH. Para mais informações sobre este processo, confira nosso tutorial sobre Como habilitar o SFTP sem acesso ao shell.

Se você estiver acostumado a usar o FTP ou o SCP para realizar suas transferências, o SFTP é uma boa maneira de aproveitar os pontos fortes de ambos. Embora não seja apropriado para todas as situações, ele é uma ferramenta flexível para ter em seu repertório.

Creative Commons License