Fazendo upload de diretórios com sftp?


97

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

Enfim, 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"

Eu 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 de contornar esse problema com o sftp, ou devo apenas usar o scp?

Respostas:


68

CORRIGIDO : Inicialmente, afirmei erroneamente que o OpenSSH não suportava put -r. Sim, mas de uma maneira muito estranha. Parece esperar que o diretório de destino já exista, com o mesmo nome que o 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 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 recursiva melhor implementada put, você pode usar a psftpferramenta de linha de comando PuTTY . Está no putty-toolspacote Debian (e provavelmente Ubuntu).

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


FYI: sftppermite a put -rpartir do OpenSSH 5.4
Tino

3
Obrigado - corrigi minha resposta. Já era hora, não é? ;-P
Jander

128

Não sei por que o sftp faz isso, mas você só pode copiar recursivamente se o diretório de destino já existir. Então faça isso ...

sftp> mkdir bin
sftp> put -r bin

1
-rprecisa OpenSSH 5.4 ou superior
Tino

22

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 bin/e o colocará no servidor remoto em /home/earlz/blah/bin/. Como um benefício adicional, ele primeiro verifica se o arquivo no lado remoto não foi alterado e, se não foi, não será reenviado. Além disso, você pode adicionar uma opção -z e a compactará para você.


Awsome! Tão simples!
Perguntado

3
Por favor, note que sftpé um comando e um protocolo . rsyncnão suporta o sftpprotocolo
Tino

9

lcd: sua pasta local (com subpastas)

cd: sua pasta remota

put -r .


na verdade, eu acho que essa é a resposta mais correta ... com a finalidade de colocar toda a minha pasta lá
nopole

O sftp reclamou quando entrei na pasta pai local e tentei colocar o diretório pelo nome. Mas cdentrando no diretório que eu queria enviar, fiz isso. Obrigado!
karimkorun

8

Posso sugerir uma resposta um tanto complicada, sem fechar, mas incluindo o alcatrão?

Aqui vamos nós:

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

Isso empacotará o diretório ./bin com tar (-cf: = create file), filename - (none, stdout) e o encaminha através do comando ssh para o target.org (que também pode ser um IP) onde o comando entre aspas é executado, que é: cd para blá e tar -xf (arquivo de extração) - nenhum, nenhum nome, apenas stdin.

É como se você empacote um pacote em casa, leve-o para o correio e depois vá para o trabalho, onde espera o pacote e o abra.

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


Um canal taré uma solução muito boa, no entanto, isso precisa de sshsuporte de login ( sftpé um protocolo diferente no topo ssh). tar, diferentemente de outros, por padrão , é executado recursivamente, transfere todos os arquivos especiais (FIFO, dispositivos de bloco / caractere etc.), tenta converter o mapeamento UID / GID da origem para o sistema de destino e possui uma linha de comando curta tradicional. (Uma exceção, porém: "soquetes de domínio Unix" não são transferidos Mas quem precisa deles.?)
Tino

Eu uso este método quando eu preciso de compressão entre os nós também você pode usar a pvferramenta para assistir a velocidade em transferências longas
Felipe Alcacibar


1

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, pois não copia os arquivos que não foram alterados; também é capaz de remover arquivos da máquina B que foram excluídos da máquina A (somente quando solicitado, é claro).

por exemplo :

rsync -zrp /home/a/ user@remote.host.com:/home/b/  

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


0

Entre no servidor remoto com ssh, use sftp para conectar-se novamente à sua caixa e use o get -rcomando para transferir diretórios para o servidor remoto. O comando get permite transferir diretórios recursivamente sem ter o diretório já criado.

ssh remote ip
sftp local ip 
get -r whichever-dir

0

Caso 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/

0

Acabei de aprender com o Arch Linux Wiki que é possível montar o sftp-share usando sshfs. Estou executando um servidor sftp com chroot e jail e sshfs funciona muito bem.

  1. Montagem: sshfs <sftpuser>@<server>:<read/writable/directory> <your/local/mount/directory>
  2. Desmontar: fusermount -u <your/local/mount/directory>
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.