Como Usar SFTP para Transferir Arquivos com Segurança para um Servidor Remoto

Introdução

O FTP, o Protocolo de Transferência de Arquivos, foi um método popular e não criptografado para transferir arquivos entre dois sistemas remotos. A partir de 2022, ele foi descontinuado pela maioria dos softwares modernos devido à falta de segurança e geralmente só pode ser usado em aplicativos legados.

O SFTP, que significa Protocolo de Transferência de Arquivos Seguro, é um protocolo separado incorporado ao SSH que pode implementar comandos FTP sobre uma conexão segura. Tipicamente, ele pode atuar como uma substituição direta em qualquer contexto onde um servidor FTP ainda é necessário.

Em quase todos os casos, o SFTP é preferível ao FTP devido às suas características de segurança subjacentes e à capacidade de se basear em uma conexão SSH. O FTP é um protocolo inseguro que deve ser usado apenas em casos limitados ou em redes confiáveis.

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

Como Conectar com 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 estão disponíveis que estão presentes no SSH.

Embora você possa autenticar com senhas 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 economizar tempo a longo prazo.

Por favor, consulte este guia para configurar chaves SSH para acessar seu servidor se ainda não o fez.

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

  1. ssh sammy@your_server_ip_or_remote_hostname

Se isso funcionar, saia digitando:

  1. exit

Agora podemos estabelecer uma sessão SFTP emitindo o seguinte comando:

  1. sftp sammy@your_server_ip_or_remote_hostname

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

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

  1. sftp -oPort=custom_port sammy@your_server_ip_or_remote_hostname

Isso o conectará ao sistema remoto através da porta especificada por você.

Obtendo Ajuda no SFTP

O comando mais útil para aprender primeiro é o comando de ajuda. Isso lhe dá acesso a um resumo dos outros comandos SFTP. Você pode chamá-lo digitando qualquer um destes no prompt:

  1. help

ou

  1. ?

Isso 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 que você vê nas seguintes seções.

Podemos navegar pela hierarquia de arquivos do sistema remoto usando vários comandos que funcionam de forma semelhante aos seus equivalentes no 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, podemos digitar o seguinte para obter o diretório atual:

  1. pwd
Output
Remote working directory: /home/demouser

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

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

Observe que os comandos disponíveis na interface SFTP não correspondem diretamente à sintaxe do shell típico e não são tão ricos em recursos. No entanto, eles implementam algumas das opções de sinalização mais importantes, como adicionar -la ao ls para visualizar mais metadados e permissões de arquivos:

  1. 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 acessar outro diretório, podemos emitir este comando:

  1. 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 têm equivalentes locais. Podemos imprimir o diretório de trabalho local:

  1. lpwd
Output
Local working directory: /Users/demouser

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

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

Também podemos alterar o diretório com o qual queremos interagir no sistema local:

  1. lcd Desktop

Transferindo Arquivos com SFTP

Se quisermos baixar arquivos do nosso host remoto, podemos fazer isso usando o comando get:

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

Como 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 depois:

  1. get remoteFile localFile

O comando get também aceita algumas opções. Por exemplo, podemos copiar um diretório e todo o seu conteúdo especificando a opção recursiva:

  1. get -r someDirectory

Podemos instruir o SFTP a manter as permissões apropriadas e os tempos de acesso usando a opção -P ou -p:

  1. get -Pr someDirectory

Transferindo Arquivos Locais para o Sistema Remoto

Transferir arquivos para o sistema remoto funciona da mesma maneira, mas com um comando put:

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

As mesmas opções que funcionam com get se aplicam a put. Portanto, para copiar um diretório local inteiro, você pode executar put -r:

  1. put -r localDirectory

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

  1. 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 do disco digitando:

  1. !

e então

  1. 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 SFTP, digite:

  1. exit

Agora você deve ver o prompt SFTP retornar.

Manipulações Simples de Arquivos com SFTP

O SFTP permite que você realize alguns tipos de manutenção do sistema de arquivos. Por exemplo, você pode alterar o proprietário de um arquivo no sistema remoto com:

  1. chown userID file

Observe como, ao contrário do comando de sistema chmod, o comando SFTP não aceita nomes de usuário, mas em vez disso usa UIDs. Infelizmente, não há uma maneira incorporada de saber o UID apropriado de dentro da interface SFTP.

Como solução alternativa, você pode ler do arquivo /etc/passwd, que associa nomes de usuário com UIDs na maioria dos ambientes Linux:

  1. get /etc/passwd
  2. !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 de dar o comando ! sozinho, nós o usamos como um prefixo para um comando de shell local. 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, como delimitado por caracteres de dois pontos.

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

  1. chgrp groupID file

Novamente, não há uma maneira integrada de obter uma listagem dos grupos do sistema remoto. Podemos contornar isso com o seguinte comando:

  1. get /etc/group
  2. !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 contém o ID do grupo associado ao nome na primeira coluna. Isso é o que estamos procurando.

O comando chmod SFTP funciona normalmente no sistema de arquivos remoto:

  1. chmod 777 publicFile
Output
Changing mode on /home/demouser/publicFile

Não há um comando equivalente para manipular permissões de arquivo locais, mas você pode definir o umask local, para que quaisquer arquivos copiados para o sistema local tenham suas permissões correspondentes.

Isso pode ser feito com o comando lumask:

  1. lumask 022
Output
Local umask: 022

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

O SFTP também permite criar diretórios nos sistemas local e remoto com lmkdir e mkdir, respectivamente.

O restante dos comandos de arquivo visa apenas o sistema de arquivos remoto:

  1. ln
  2. rm
  3. rmdir

Esses comandos replicam o comportamento principal de seus equivalentes de shell. Se você precisar executar essas ações no sistema de arquivos local, lembre-se de que você pode entrar em um shell emitindo este comando:

  1. !

Ou execute um único comando no sistema local prefixando o comando com ! assim:

  1. !chmod 644 somefile

Quando terminar a sua sessão SFTP, use exit ou bye para fechar a conexão.

  1. bye

Conclusão

Embora a sintaxe SFTP seja muito menos abrangente do que as ferramentas de shell modernas, pode ser útil para fornecer compatibilidade com a sintaxe FTP legada ou para limitar cuidadosamente a funcionalidade disponível para usuários remotos em alguns ambientes.

Por exemplo, você pode usar o SFTP para permitir que usuários específicos transfiram arquivos sem acesso SSH. Para obter mais informações sobre esse processo, confira nosso tutorial sobre Como Habilitar SFTP Sem Acesso ao Shell.

Se você está acostumado a usar FTP ou 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, é uma ferramenta flexível para se ter em seu repertório.

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-sftp-to-securely-transfer-files-with-a-remote-server