Usando sftp para transferir um diretório?


50

Quando tento usar o sftp para transferir um diretório que contém arquivos, recebo uma mensagem de erro:

skipping non-regular file directory_name

O diretório contém alguns arquivos e dois subdiretórios.

O que estou fazendo errado?

Respostas:


49

sftp, like cpe scp, exige que, ao copiar uma pasta (e seu conteúdo, obviamente), você tenha que dizer explicitamente que deseja transferir a pasta recursivamente com a -ropção

Então, adicione -rao comando.


2
-r após o comando put? Estou recebendo uma mensagem de erro "put: Invalid flag -r", se estiver. Adicioná-lo ao comando sftp original também não funciona.
haziz

5
Adicione -rao sftpcomando quando você estiver se conectando. sftp -r user@host
21711 Kevin

1
@Kevin Estou recebendo o seguinte erro "sftp: unknown option --r"
Amatya 27/03

2
Tenha em atenção que existe um bug bastante longa data em SFTP do OpenSSH: ao copiar recursivamente um diretório para um servidor remoto, o próprio diretório já deve existir no servidor de destino caso contrário, a transferência falhará com uma mensagem de erro não-explícito: Couldn't canonicalise: No such file or directory.
WhiteWinterWolf

5
deve ser algo como:# sftp user@remote-host #> get -r remote-folder
hbinduni

21

Só posso sugerir, você usa rsync. É um padrão do setor, ao mover arquivos através de conexões seguras.

rsync -alPvz ./source_dir server.com:destination_dir

É o que venho usando há anos.

(a -aopção cuida de coisas como recursão de diretório)


3
Um pouco de esclarecimento sobre os parâmetros mencionados: -a= recursão + manter links simbólicos, permissões, tempos de modificação, proprietário, grupo, arquivos especiais e arquivos de dispositivos (o último requer privilégios de superusuário); -l= manter links simbólicos (já incluídos -a); -P= mostra o progresso durante a transferência + mantém arquivos parcialmente transferidos; -v= modo detalhado (no entanto, parece obrigatório quando usado -Ppara evitar um erro estranho (bug?) protocol version mismatch); -z= habilita a compactação dos dados transferidos.
precisa saber é o seguinte

@WhiteWinterWolf, parece ser dependente da versão se o -lswitch deve ou não ser usado. Lembro-me de versões mais antigas não incluiu -lno -a.
precisa saber é

5

Você também pode usar o uso scp. O formato geral é

scp -rp sourceDirName username@server:destDirName

scpsignifica "cópia segura". As bandeiras são

  • -r recursão em subdiretórios
  • -p preservar os tempos de modificação

Eu acredito que o restante dos itens é auto-explicativo


e scp -rp -P <port> .... ao usar uma porta não padrão
Pancho

4

Isso funciona para mim:

1) conectar via sftphost remoto

2) mude para o diretório remoto que deseja copiar. (Exemplo: cd Music)

3) mude para o diretório local para o qual deseja copiar as coisas. (Exemplo: desktop lcd)

4) Emita este comando: get -r *


4

Se rsyncnão for uma opção, eu recomendaria a seguir lftp:

lftp sftp://user@host.com/path/path/

Em seguida, use o mirrorcomando para fazer upload recursivamente, assim:

mirror -R

(Observe que a recursão é o padrão. O inverso-R é o de fazer o upload do comando mirror em vez de fazer o download. Tente adicionar para fazer uma avaliação para garantir que está fazendo o que você espera.)--dry-run

Ou fazer upload sem recursão:

mirror --no-recursion

Você precisa cdentrar nos diretórios que deseja espelhar. Funciona bem!


2

Se você puder, use sshfs . É um sistema de arquivos FUSE , disponível nas organizações mais modernas, e funciona com qualquer servidor SFTP. Este é um sistema de arquivos remoto: permite manipular arquivos remotos (através do protocolo SFTP) com os utilitários usuais.

mkdir /mount/point
sshfs server.example.com:/remote/path /mount/point
ls /mount/point
cp -Rp /mount/point/somedir /local/location
fusemount -d /mount/point

0

É um pouco complicado, mas o que funciona para mim é:

  1. Use sshpara fazer login na máquina remota
  2. Use sftpda máquina remota para a sua máquina local
  3. Em seguida, use o getcomando com a -ropção de mover o diretório e todos os seus arquivos.

1
começar o trabalho não faça com -rsftp> get -r data /opt/bin get: Invalid flag -r
Skynet

0

Se a sua pergunta é realmente 'como uso o sftp para transferir um diretório', então

 sftp -r user@server

Mas se você estiver transferindo um diretório, sugiro duas opções melhores, dependendo de suas necessidades. sftprequer o login no servidor remoto em um prompt de comando do tipo ssh, mas se tudo o que você deseja é o (s) arquivo (s), existem maneiras mais fáceis e rápidas.

Scp

Para uma transferência única, faça o upload, tente:

 # upload source directory to remote server
 scp -rp source_dir user@server:dest

 #download directory from remote server:
 scp -rp user@server:source_dir dest

 #specifying ssh key:
 scp -rp -i ~/.ssh/key user@server:source_dir dest

 #remote directory has spaces
 scp -rp -i ~/.ssh/key user@server:"source\\ dir" dest

Rsync

Se você planeja sincronizar os diretórios regularmente, usar o rsync faz mais sentido. Ele realiza deltas entre os dois diretórios, economizando tempo de transferência e dados através da conexão.

rsync -r -a -v -e ssh --delete source_dir user@server:dest

Aqui está uma lista de algumas das opções mais comuns do rsync: ( extraídas daqui )

  • --delete - exclui arquivos que não existem no remetente (sistema)
  • -v - detalhado (-vv fornecerá informações mais detalhadas)
  • -e "ssh options" - especifique o ssh como shell remoto
  • -a - modo de arquivo - preserva permissões (proprietários, grupos), horas, links simbólicos e dispositivos
  • -r - recursão em diretórios
  • -z - comprime dados do arquivo durante a transferência
  • --exclude 'foldername' - exclui a pasta correspondente da transferência
  • -P - mostra o progresso durante a transferência

Espero que ajude!


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.