sftp로 디렉토리를 업로드 하시겠습니까?


97

sftp로 디렉토리를 업로드하는 데 문제가 있습니다 (몇몇 수준의 다른 디렉토리가 들어 있음). 나는 gzipping 으로이 문제를 해결할 수 있다는 것을 알고 있지만 그것이 왜 필요한지 알지 못합니다.

어쨌든, 나는 시도

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"

마지막 오류 메시지가 완전히 바보라고 생각합니다. 그래서 디렉토리가 존재하지 않습니까? 왜 디렉토리를 만들지 않습니까?

어쨌든 sftp 에이 문제가 있습니까? 아니면 scp를 사용해야합니까?

답변:


68

수정 : 나는 처음에 OpenSSH가 지원하지 않는다고 잘못 주장했다 put -r. 그것은하지만 매우 이상한 방식으로 수행합니다. 소스 디렉토리와 이름이 같은 대상 디렉토리가 이미 존재하는 것으로 보입니다.

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

이상한 점은 목적지에 다른 이름을 지정해도 적용된다는 것입니다.

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

더 잘 구현 된 재귀 put를 위해서는 PuTTY psftp명령 줄 도구를 대신 사용할 수 있습니다 . 그것은에서의 putty-tools데비안 (그리고 대부분 우분투)에서 패키지로 제공된다.

또는 GUI를 사용하려는 경우 Filezilla가 원하는 작업을 수행합니다.


참고 : OpenSSH 5.4 에서 sftp허용put -r
Tino

3
감사합니다-답변을 수정했습니다. 시간이 다 됐어? ;-P
Jander

128

sftp가 왜 이런 일을하는지 모르겠지만 대상 디렉토리가 이미 존재하는 경우에만 재귀 사본을 사용할 수 있습니다. 그러니 이렇게 ...

sftp> mkdir bin
sftp> put -r bin

1
-rOpenSSH 5.4 이상 필요
Tino

22

rsync대신 에 사용하고 싶을 수도 있습니다 . 그 명령은

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

그러면 모든 것이 복사 bin/되어의 원격 서버에 배치 /home/earlz/blah/bin/됩니다. 추가 이점으로, 먼저 원격 쪽의 파일이 변경되지 않았는지 확인하고, 그렇지 않은 경우 다시 보내지 않습니다. 또한 -z 옵션을 추가하면 압축됩니다.


대박! 너무 간단합니다!
Asken

3
그주의 sftp명령입니다 및 프로토콜 . rsync- sftp프로토콜을 지원하지 않습니다 .
티노

9

lcd: 로컬 폴더 (하위 폴더 포함)

cd: 원격 폴더

put -r .


실제로, 나는 이것이 가장 정답이라고 생각합니다 ... 전체 폴더를 거기에두기위한 목적으로
nopole

sftp가 로컬 상위 폴더로 cd하고 디렉토리를 이름으로 넣으려고 할 때 불평했습니다. 그러나 cd'내가 업로드하고 싶은 디렉토리에 들어가면 그렇게했습니다. 감사합니다!
karimkorun

8

압축하지 않고 tar를 포함하여 다소 복잡한 답변을 제안 할 수 있습니까?

여기 우리는 간다 :

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

이것은 ./bin 디렉토리를 tar (-cf : = create file), filename-(none, stdout)으로 압축하고 ssh-command를 통해 target.org (IP 일 수도 있음)로 파이프합니다. 따옴표로 수행됩니다 : cd to blah, tar -xf (추출 파일)-없음, 이름 없음, stdin.

마치 집에서 패키지를 포장하고, 포스트로 가져온 다음, 출퇴근 할 수있는 곳으로 이동하여 패키지를 기대하고 엽니 다.

아마도 sftp를 사용하는 훨씬 더 우아한 해결책이있을 수 있습니다.


파이프 tar는 매우 좋은 솔루션이지만 ssh로그인 지원 이 필요 합니다 (의 sftp위에 다른 프로토콜 임 ssh). 기본적으로tar 다른와 달리 재귀 적 으로 실행 되고 모든 특수 파일 (FIFO, 블록 / 문자 장치 등)을 전송하고 소스에서 대상 시스템으로 UID / GID 매핑을 변환하려고 시도하며 전통적인 짧은 명령 줄을 사용합니다. (단 하나의 예외 : "유닉스 도메인 소켓"은 전송되지 않습니다. 그러나 누가 필요합니까?)
Tino

노드 간 압축이 필요할 때이 방법을 사용합니다. 또한 pv툴을 사용하여 전송 속도를 볼 수 있습니다.
Felipe Alcacibar


1

변경되지 않은 파일을 복사하지 않기 때문에 특히 시스템 A에서 시스템 B로 사본을 업데이트 할 때 scp 및 sftp에 대한 강력한 대안 인 rsync 를 사용할 수 있습니다 . 또한 컴퓨터 A에서 삭제 된 컴퓨터 B에서 파일을 제거 할 수도 있습니다 (물론 지시가있을 때만).

예를 들면 다음과 같습니다.

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

-r 옵션은 파일을 재귀 적으로 복사하는 데 사용되며 -z는 전송 중에 압축을 활성화하며 -p는 복사 할 때 파일 권한 (파일 작성, 편집 등)을 유지합니다. 이는 scp가 AFAIK를 수행하지 않는 것입니다. 더 많은 옵션이 가능합니다. 평소와 같이 매뉴얼 페이지를 읽으십시오.
Karolos의 원래 답변


0

ssh로 원격 서버에 로그인하고 sftp를 사용하여 상자에 다시 연결 한 다음 get -r명령을 사용하여 디렉토리를 원격 서버로 전송하십시오. get 명령을 사용하면 디렉토리를 작성하지 않고 디렉토리를 재귀 적으로 전송할 수 있습니다.

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

0

SFTP 사례 :

내 FTP에서 해당 구조를 복사해야했습니다.

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

내 문제가 해결되었습니다.

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

방금 Arch Linux Wiki 에서 sshfs를 사용하여 sftp-share를 마운트 할 수 있다는 것을 알게되었습니다 . chroot와 jail을 사용 하여 sftp-server를 실행 중이며 sshfs가 매우 잘 작동합니다.

  1. 산: sshfs <sftpuser>@<server>:<read/writable/directory> <your/local/mount/directory>
  2. 마운트 해제 : fusermount -u <your/local/mount/directory>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.