it-swarm-vi.com

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

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?

97
Earlz

ĐÃ SỬA : 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ạ 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 put được triển khai tốt hơn, bạn có thể sử dụng công cụ dòng lệnh PuTTY psftp thay thế. Nó ở trong PuTTY-tools gói trong 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.

68
Jander

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
130
Useful Dude

Thay vào đó, bạn có thể quan tâm đến việc sử dụng rsync. 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ứ trong bin/ và đặt nó vào máy chủ từ xa trong /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.

22
Shawn J. Goff

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 .

9
eliseu

Tôi có thể đề nghị 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 lệnh.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.

8
user unknown

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

2
Dmitry Shpakov

Bạn có thể sử dụng rsync , đây là một thay thế rất mạnh 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 ' t sao chép các tập tin 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/ [email protected]:/home/b/  

Tùy chọn -r dành cho 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

1
Sherlock

Đăng nhập vào máy chủ từ xa bằng ssh, sử dụng sftp để kết nối lại với hộp của bạn, sau đó sử dụng get -r lệnh chuyển 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
Cyb3rT00th

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
Nikita Malovichko

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 sftp-server 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. Không đếm được: fusermount -u <your/local/mount/directory>
0
saltani