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.
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.
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:
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 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
OutputRemote working directory: /home/demouser
Podemos visualizar o conteúdo do diretório atual do sistema remoto com outro comando familiar:
- ls
OutputSummary.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
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 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
OutputLocal working directory: /Users/demouser
Podemos listar o conteúdo do diretório atual na máquina local:
- lls
OutputDesktop 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
Navegar pelos sistemas de arquivos remotos e locais é de utilidade limitada sem a possibilidade de transferir arquivos entre os dois.
Se quisermos baixar arquivos do nosso host remoto, fazemos isso usando o seguinte comando:
- get remoteFile
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 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
Transferir arquivos para o sistema remoto é também bastante fácil, utilizando o comando “put” nomeado apropriadamente:
- put localFile
OutputUploading 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
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 do SFTP, digite:
- exit
Agora, você deve ver o retorno do prompt do 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
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 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
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 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
OutputChanging 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
OutputLocal 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
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.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Sign up for Infrastructure as a Newsletter.
Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.
Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.
É seguro configurar o sftp com noip para acesso remoto? Existe algum risco nessa operação?