Fazendo upload de diretórios com o sftp?

85

Estou tendo alguns problemas para fazer upload de diretórios (que contêm outros diretórios com alguns níveis de profundidade) por sftp. Eu percebo que eu poderia contornar isso fazendo gzips, mas não vejo por que isso é necessário.

De qualquer forma, eu tento

sftp> put bin/
Uploading bin/ to /home/earlz/blah/bin
bin/ is not a regular file
sftp> put -r bin/
Uploading bin/ to /home/earlz/blah/bin
Couldn't canonicalise: No such file or directory
Unable to canonicalise path "/home/earlz/blah/bin"

Acho que a última mensagem de erro é completamente estúpida. Então o diretório não existe? Por que não criar o diretório?

Existe alguma maneira em torno deste problema com o sftp, ou devo apenas usar o scp?

    
por Earlz 07.02.2011 / 04:04

9 respostas

49

CORRIGIDO : inicialmente aleguei erroneamente que o OpenSSH não suportava put -r . Faz, mas faz de uma maneira muito estranha. Parece esperar que o diretório de destino já exista, com o mesmo nome do diretório de origem.

sftp> put -r source
 Uploading source/ to /home/myself/source
 Couldn't canonicalize: No such file or directory
 etc.
sftp> mkdir source
sftp> put -r source
 Uploading source/ to /home/myself/source
 Entering source/
 source/file1
 source/file2

O que é especialmente estranho é que isso se aplica mesmo se você der um nome diferente para o destino:

sftp> put -r source dest
 Uploading source/ to /home/myself/dest
 Couldn't canonicalize: ...
sftp> mkdir dest
sftp> put -r source dest
 Uploading source/ to /home/myself/dest/source
 Couldn't canonicalize: ...
sftp> mkdir dest/source
sftp> put -r source dest
 Uploading source/ to /home/myself/dest/source
 Entering source/
 source/file1
 source/file2

Para uma porcentagem recursiva implementada melhorput, você pode usar a ferramenta de linha de comando PuTTY psftp . Está no pacote putty-tools no Debian (e provavelmente no Ubuntu).

Como alternativa, o Filezilla fará o que quiser, se você quiser usar uma GUI.

    
por 07.02.2011 / 07:17
126

Eu não sei porque o sftp faz isso, mas você pode copiar apenas recursivamente se o diretório de destino já existir. Então faça isso ...

sftp> mkdir bin
sftp> put -r bin
    
por 16.10.2012 / 21:39
20

Você pode estar interessado em usar rsync . O comando para isso seria

 rsync --delete --rsh=ssh -av bin/ remote-ip-or-fqdn:/home/earlz/blah/bin/

Isso copiará tudo em bin/ e o colocará no servidor remoto em /home/earlz/blah/bin/ . Como benefício adicional, ele primeiro verificará se o arquivo no lado remoto não foi alterado e, se não tiver, não o reenviará. Além disso, você pode adicionar uma opção -z e ela será compactada para você.

    
por 07.02.2011 / 20:24
8

Posso sugerir uma resposta um pouco complicada, sem zipar, mas incluindo tar?

Aqui vamos nós:

tar -cf - ./bin | ssh target.org " ( cd /home/earlz/blah ; tar -xf - ) "

Isto irá empacotar o diretório ./bin com tar (-cf: = criar arquivo), nome_do_arquivo - (nenhum, stdout) e canalizá-lo através do comando ssh para o target.org (que pode muito bem ser um IP) onde o comando entre aspas é executado, que é: cd para blah e tar -xf (arquivo de extração) - nenhum, nenhum nome, apenas stdin.

É como se você empacotasse um pacote em casa, o trouxesse para o correio, depois dirigisse para o trabalho, onde você esperava o pacote e o abrisse.

Talvez haja uma solução muito mais elegante que apenas use o sftp.

    
por 07.02.2011 / 05:00
8

lcd : sua pasta local (com subpastas)

cd : sua pasta remota

put -r .

    
por 13.02.2015 / 19:37
2

Você pode usar o yafc (ainda anoter FTP / SFTP client). A opção -r funciona muito bem.

    
por 24.01.2012 / 08:23
0

Você pode usar o rsync , que é uma alternativa muito poderosa para scp e sftp, especialmente ao atualizar as cópias da máquina A para a máquina B, já que ele não copia os arquivos que não foram copiados. foi alterado; também é capaz de remover arquivos da máquina B que foram apagados da máquina A (somente quando isso for dito, é claro).

por exemplo:

rsync -zrp /home/a/ [email protected]:/home/b/  

A opção -r é para recursivamente copiar arquivos, -z ativa a compactação durante a transferência, e -p preserva as permissões de arquivo (criação de arquivo, edição, etc.) ao copiar, que é algo que o scp não faz AFAIK . Muitas outras opções são possíveis; como de costume, leia as man pages.
Resposta original de Karolos

    
por 02.01.2016 / 23:42
0

Faça login no servidor remoto com ssh, use sftp para se conectar de volta à sua caixa e, em seguida, use o comando get -r para transferir diretórios para o servidor remoto. O comando get permite que você transfira diretórios recursivamente sem ter o diretório já criado.

ssh remote ip
sftp local ip 
get -r whichever-dir
    
por 22.09.2016 / 13:19
0

Caso do SFTP:

Eu precisava copiar essa estrutura no meu ftp:

mainfolder --- folder --- subfolder
                  |           |
              file1.txt   file2.txt

Isso resolveu meu problema:

cd ./mainfolder
mkdir folder
put -r /from/source/folder/* /mainfolder/folder/
cd ./folder
mkdir subfolder
put -r /from/source/folder/subfolder/* /mainfolder/folder/subfolder/
    
por 24.11.2016 / 13:36

Tags