Tải lên thư mục với sftp?


97

Tôi gặp một số vấn đề khi tải lên các thư mục (chứa các thư mục khác sâu một vài cấp) bởi sftp. Tôi nhận ra rằng tôi có thể giải quyết vấn đề này bằng cách gzipping, nhưng tôi không hiểu tại sao điều đó lại cần thiết.

Dù sao, tôi cố gắng

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"

Tôi nghĩ rằng thông báo lỗi cuối cùng là hoàn toàn ngu ngốc. Vì vậy, thư mục không tồn tại? Tại sao không tạo thư mục?

Có cách nào xung quanh vấn đề này với sftp, hay tôi chỉ nên sử dụng scp?

Câu trả lời:


68

ĐÚNG : Ban đầu tôi đã tuyên bố sai rằng OpenSSH không hỗ trợ put -r. Nó làm, nhưng nó làm theo một cách rất lạ. Dường như mong đợi thư mục đích đã tồn tại, cùng tên với thư mục nguồn.

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

Điều đặc biệt là điều này thậm chí còn áp dụng nếu bạn đặt tên khác cho điểm đến:

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

Để đệ quy được triển khai tốt hơn put, bạn có thể sử dụng psftpcông cụ dòng lệnh PuTTY thay thế. Nó nằm trong putty-toolsgói dưới Debian (và rất có thể là Ubuntu).

Thay phiên, Filezilla sẽ làm những gì bạn muốn, nếu bạn muốn sử dụng GUI.


FYI: sftpcho phép put -rtừ OpenSSH 5.4
Tino

3
Cảm ơn - Tôi đã sửa câu trả lời của mình. Đến giờ rồi hả? ;-P
Jander

128

Tôi không biết tại sao sftp làm điều này nhưng bạn chỉ có thể sao chép đệ quy nếu thư mục đích đã tồn tại. Vì vậy, làm điều này ...

sftp> mkdir bin
sftp> put -r bin

1
-rcần OpenSSH 5.4 trở lên
Tino

22

Bạn có thể quan tâm đến việc sử dụng rsyncthay thế. Lệnh cho điều đó sẽ là

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

Điều này sẽ sao chép mọi thứ vào bin/và đặt nó vào máy chủ từ xa /home/earlz/blah/bin/. Là một lợi ích bổ sung, trước tiên, nó sẽ kiểm tra xem liệu tệp ở phía xa không thay đổi hay không và nếu không, nó sẽ không gửi lại. Ngoài ra, bạn có thể thêm tùy chọn -z và nó sẽ nén nó cho bạn.


Tuyệt vời! Quá đơn giản!
Asken

3
Xin lưu ý rằng đó sftplà một lệnh và một giao thức . rsynckhông hỗ trợ các sftp-protatio.
Tino

9

lcd: thư mục cục bộ của bạn (có thư mục con)

cd: thư mục từ xa của bạn

put -r .


thực ra, tôi nghĩ rằng đây là câu trả lời đúng nhất ... cho mục đích đặt toàn bộ thư mục của tôi ở đó
nopole

Sftp phàn nàn khi tôi cd'd vào thư mục cha cục bộ và cố gắng đặt thư mục theo tên. Nhưng cd'vào thư mục tôi muốn tải lên đã làm điều đó. Cảm ơn bạn!
karimkorun 7/07/2016

8

Tôi có thể đề xuất một câu trả lời hơi phức tạp, không nén, nhưng bao gồm tar?

Ở đây chúng tôi đi:

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

Điều này sẽ đóng gói thư mục ./bin với tar (-cf: = tạo tệp), tên tệp - (none, stdout) và chuyển nó qua lệnh ssh đến target.org (cũng có thể là IP) trong đó lệnh trong dấu ngoặc kép được thực hiện, đó là: cd to blah và tar -xf (giải nén tập tin) - không, không tên, chỉ stdin.

Như thể bạn đóng gói một gói ở nhà, mang nó đến bưu điện, sau đó lái xe đi làm, nơi bạn mong đợi gói và mở nó.

Có lẽ có một giải pháp thanh lịch hơn nhiều chỉ sử dụng sftp.


Một đường ống tarlà một giải pháp rất tốt, tuy nhiên điều này cần sshhỗ trợ đăng nhập ( sftplà một giao thức khác ở trên cùng ssh). tar, không giống như những người khác, theo mặc định , chạy đệ quy, chuyển tất cả các tệp đặc biệt (FIFO, thiết bị khối / ký tự, v.v.), cố gắng dịch ánh xạ UID / GID từ nguồn sang hệ thống đích và có một dòng lệnh ngắn truyền thống. (Một ngoại lệ: "Ổ cắm tên miền Unix" không được chuyển. Nhưng ai cần những thứ đó?)
Tino

Tôi sử dụng phương pháp này khi tôi cần nén giữa các nút, bạn cũng có thể sử dụng pvcông cụ để xem tốc độ trong các lần chuyển dài
Felipe Alcacibar

2

Bạn có thể sử dụng yafc (Máy khách FTP / SFTP anoter). Các -rtùy chọn hoạt động ở đó rất tốt.


1

Bạn có thể sử dụng rsync , một sự thay thế rất mạnh mẽ cho scp và sftp, đặc biệt là khi cập nhật các bản sao từ máy A sang máy B, vì nó không sao chép các tệp chưa bị thay đổi; nó cũng có thể xóa các tệp khỏi máy B đã bị xóa khỏi máy A (tất nhiên chỉ khi nó được thông báo).

ví dụ :

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

Tùy chọn -r là để sao chép đệ quy các tệp, -z cho phép nén trong quá trình truyền và -p bảo vệ các quyền của tệp (tạo tệp, chỉnh sửa, v.v.) khi sao chép, đó là điều mà scp không làm AFAIK. Nhiều lựa chọn hơn là có thể; như thường lệ, đọc các trang người đàn ông.
Câu trả lời gốc của Karolos


0

Đăng nhập vào máy chủ từ xa bằng ssh, sử dụng sftp để kết nối trở lại hộp của bạn, sau đó sử dụng get -rlệnh để chuyển các thư mục đến máy chủ từ xa. Lệnh get cho phép bạn chuyển các thư mục theo cách đệ quy mà không cần tạo thư mục.

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

0

Trường hợp SFTP:

Tôi cần phải sao chép cấu trúc đó trên ftp của mình:

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

Điều đó đã giải quyết vấn đề của tôi:

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

Tôi vừa học được từ Arch Linux Wiki rằng có thể gắn kết chia sẻ sftp bằng sshfs. Tôi đang chạy một máy chủ sftp với chroot và jail và sshfs hoạt động rất tốt.

  1. Núi: sshfs <sftpuser>@<server>:<read/writable/directory> <your/local/mount/directory>
  2. Bỏ qua: fusermount -u <your/local/mount/directory>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.