Introdução
O FTP, o Protocolo de Transferência de Arquivos, era 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, na maioria das vezes, 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 por meio de uma conexão segura. Normalmente, pode agir como uma substituição direta em qualquer contexto em que um servidor FTP ainda seja necessário.
Em quase todos os casos, o SFTP é preferível ao FTP por causa de seus recursos de segurança subjacentes e da 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 em muitas ferramentas gráficas, este guia demonstrará como usá-lo por meio de sua interface de linha de comando interativa.
Como Conectar-se 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 você precise acessar. Isso é muito mais seguro e pode economizar tempo a longo prazo.
Por favor, veja este guia para configurar chaves SSH para acessar seu servidor, se ainda não o fez.
Se você conseguir se conectar à 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:
Se funcionar, saia digitando:
Agora podemos estabelecer uma sessão SFTP emitindo o seguinte comando:
Você se conectará ao sistema remoto e seu prompt mudará para um prompt SFTP.
Se estiver trabalhando em uma porta SSH personalizada (não na porta padrão 22), então você pode abrir uma sessão SFTP da seguinte forma:
Isso o conectará ao sistema remoto através da porta especificada.
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:
ou
Isso exibirá uma lista dos comandos disponíveis:
OutputAvailable 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.
Navegando com SFTP
Podemos navegar pela hierarquia de arquivos do sistema remoto usando diversos comandos que funcionam de forma semelhante aos seus equivalentes de 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:
OutputRemote working directory: /home/demouser
Podemos visualizar o conteúdo do diretório atual do sistema remoto com outro comando familiar:
OutputSummary.txt info.html temp.txt testDirectory
Observe que os comandos disponíveis na interface SFTP não correspondem diretamente à sintaxe típica do shell e não são tão ricos em recursos. No entanto, eles implementam algumas das flags opcionais mais importantes, como adicionar -la
ao ls
para visualizar mais metadados de arquivos e permissões:
Outputdrwxr-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 usar este comando:
Agora podemos percorrer o sistema de arquivos remoto, mas e se precisarmos acessar nosso sistema de arquivos local? Podemos direcionar os comandos para o sistema de arquivos local antecedendo-os com um l
para local.
Todos os comandos discutidos até agora têm equivalentes locais. Podemos imprimir o diretório de trabalho local:
OutputLocal working directory: /Users/demouser
Podemos listar o conteúdo do diretório atual na máquina local:
OutputDesktop local.txt test.html
Documents analysis.rtf zebra.html
Também podemos alterar o diretório com o qual queremos interagir no sistema local:
Transferindo Arquivos com SFTP
Se quisermos baixar arquivos do nosso host remoto, podemos fazer isso usando o comando get
:
OutputFetching /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 depois:
O comando get
também aceita algumas opções. Por exemplo, podemos copiar um diretório e todos os seus conteúdos especificando a opção recursiva:
Podemos dizer ao SFTP para manter as permissões apropriadas e os tempos de acesso usando a bandeira -P
ou -p
:
Transferindo Arquivos Locais para o Sistema Remoto
A transferência de arquivos para o sistema remoto funciona da mesma maneira, mas com um comando put
:
OutputUploading 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
. Então, para copiar um diretório local inteiro, você pode executar put -r
:
Uma ferramenta familiar que é útil ao baixar e enviar 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 concluir as transferências que você está interessado em:
Output Size Used Avail (root) %Capacity
19.9GB 1016MB 17.9GB 18.9GB 4%
Por favor, note que não há variação local deste comando, mas podemos contornar isso emitindo o comando !
.
O comando !
nos coloca em um shell local, onde podemos executar qualquer comando disponível em nosso sistema local. Podemos verificar o uso do disco digitando:
e então
OutputFilesystem 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:
Agora você deve ver o prompt SFTP retornar.
Manipulações Simples de Arquivos com SFTP
O SFTP permite que você execute alguns tipos de manutenção de sistema de arquivos. Por exemplo, você pode alterar o proprietário de um arquivo no sistema remoto com:
Observe como, ao contrário do comando de sistema chmod
, o comando SFTP não aceita nomes de usuários, mas sim usa UIDs. Infelizmente, não há uma maneira integrada 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ários a UIDs na maioria dos ambientes Linux:
Outputroot: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 !
isoladamente, nós o utilizamos como um prefixo para um comando 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, delimitado por caracteres de dois pontos.
Da mesma forma, podemos alterar o proprietário do grupo de um arquivo com:
Novamente, não há uma maneira incorporada de obter uma lista dos grupos do sistema remoto. Podemos contornar isso com o seguinte comando:
Outputroot: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 SFTP chmod
funciona normalmente no sistema de arquivos remoto:
OutputChanging mode on /home/demouser/publicFile
Não há um comando equivalente para manipular permissões de arquivo local, 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
:
OutputLocal umask: 022
Agora, todos os arquivos regulares baixados (desde que a flag -p
não seja usada) terão permissões 644.
O SFTP também permite que você crie diretórios nos sistemas local e remoto com lmkdir
e mkdir
, respectivamente.
O restante dos comandos de arquivo são direcionados apenas ao sistema de arquivos remoto:
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 pode acessar um shell emitindo este comando:
Ou execute um único comando no sistema local precedendo o comando com !
assim:
Quando terminar sua sessão SFTP, use sair
ou bye
para fechar a conexão.
Conclusão
Embora a sintaxe do SFTP seja muito menos abrangente do que as ferramentas de shell modernas, ela pode ser útil para fornecer compatibilidade com a sintaxe do FTP legado 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 as vantagens de ambos. Embora não seja apropriado para todas as situações, é uma ferramenta flexível para se ter em seu repertório.