Làm thế nào để đường ống dữ liệu để kết nối sftp?


9

ftp hỗ trợ put "|..." "remote-file.name"lệnh truyền dữ liệu tới kết nối ftp. Có một cái gì đó tương tự có sẵn cho sftp?

Trong sftp tôi nhận được lỗi sau:

sftp 'jmw@backupsrv:/uploads'
sftp> put "| tar -cx /storage" "backup-2012-06-19--17-51.tgz"
stat | tar -cv /storage: No such file or directory

như trên máy khách sftp rõ ràng không thực thi lệnh.

tôi muốn sử dụng lệnh pipe để chuyển hướng trực tiếp luồng tập tin sang sftp. (vì không còn đủ dung lượng để tạo tệp sao lưu trên cùng một đĩa trước khi tải nó lên máy chủ sftp.)


1
Tôi đã nghĩ về việc sử dụng một FIFO cho việc này, nhưng cả SFTP và SCP đều không đọc được từ một FIFO.
Tom Anderson

1
cũng là ý tưởng hay, đây là của tôi: qxs.ch/2012/07/05/sftp-upload-tool
JMW

Câu trả lời:


4

Tôi đã có rất nhiều niềm vui để tìm ra một giải pháp cho vấn đề này. Nó yêu cầu công cụ nc (netcat) trên cả hai máy và SSH (SFTP không cần thiết).

Trong ví dụ này, tôi sẽ gọi máy có dữ liệu cần sao lưu linux-a và máy cần nhận bản sao lưu linux-b.

Trên linux-a, có netcat lắng nghe trên một cổng (tôi lấy 2000) và chuyển hướng nó đến một tệp. Điều này sẽ chỉ ngồi ở đó và chờ cho đến khi một cái gì đó đi qua trên cổng đó.

[kenny@linux-b /var/backups]$ nc -l 2000 > backup.tgz

Trên linux-b, mở một đường hầm ssh sang linux-a, tôi đã sử dụng lại cổng 2000. Điều này sẽ chuyển hướng bất cứ thứ gì bạn ném vào cổng TCP 2000 trên localhost sang cổng TCP 2000 trên linux-a, nơi netcat đang lắng nghe.

[kenny@linux-a /var/data]$ ssh -L 2000:localhost:2000 -CfN linux-b

Bây giờ tạo kho lưu trữ tar, nhưng gửi đầu ra tới thiết bị xuất chuẩn (bằng cách sử dụng -) và chuyển nó sang gzip để nén. Bây giờ chuyển sang một netcat khác gửi nó đến localhost trên TCP trên cổng 2000.

[kenny@linux-a /var/data]$ tar cf - important-data | gzip -fc | nc localhost 2000

Đã được thực hiện! Trên linux-b, netcat không còn nghe và một tệp mới được tạo. Phần tốt nhất là kho lưu trữ tar không bao giờ được đặt trên đĩa cứng của linux-a.

[kenny@linux-b /var/backups]$ file backup.tgz 
backup.tgz: gzip compressed data, from Unix, last modified: Thu Jul  5 13:48:03 2012

Tôi biết đó không chính xác là những gì bạn đã yêu cầu trong câu hỏi, nhưng nếu bạn có sẵn netcat, thì đó là một giải pháp khả thi cho loại vấn đề của bạn.

Chỉnh sửa: Tôi đã quên một điều: nếu bạn làm theo các hướng dẫn này, bạn vẫn sẽ có một đường hầm SSH nổi trên linux-a. Tìm hiểu ID tiến trình là gì và giết nó.

[kenny@linux-a /var/data]$ ps -ef | grep "ssh -L"
kenny     5741     1  0 13:40 ?        00:00:00 ssh -L 2000:localhost:2000 -CfN linux-b
kenny     5940  3360  0 14:13 pts/1    00:00:00 grep --color=auto ssh -L
[kenny@linux-a /var/data]$ kill 5741

3
Tôi thích nó, nhưng có 2 vấn đề: người dùng sftponly thường không thể sử dụng chuyển tiếp cổng và người dùng sftponly không thể truy cập nc trên máy chủ sftp (hãy nhớ rằng họ không có quyền truy cập ssh)
JMW

1
Đó là lời chỉ trích hoàn toàn hợp lệ.
Kenny Rasschaert

Không có chủ đề, nhưng tại sao lại có ảnh chụp màn hình "Uy tín" được nhúng trong bài đăng này?
Rilindo

4

Vì đây là kết quả đầu tiên bạn tìm thấy bằng cách googling cho câu hỏi này và nó đã không được đề cập đến nên tôi cũng sẽ thêm giải pháp tôi tìm thấy ở đây:

bạn có thể sử dụng lọn tóc thực hiện sftp cho việc này. Vì curl có thể đã được cài đặt trên rất nhiều hệ thống, điều này có thể được ưu tiên cho giải pháp sử dụng các máy khách tùy chỉnh.

sử dụng ví dụ:

pg_dump -d database | pigz -1 | curl -u username -T - sftp://sftpserver/folder/dbbackup.sql.gz

curlsử dụng .ssh/known_hoststệp của bạn để xác minh chính. Điều này có thể thất bại trong trường hợp máy khách ssh của bạn sử dụng các tiêu chuẩn mã hóa mới hơn không được thư viện sử dụng trong curl

Để khắc phục điều này, bạn có thể thêm các loại khóa khác vào tệp máy chủ đã biết bằng lệnh sau:

ssh-keyscan sftpserver >> ~/.ssh/known_hosts

hoặc bạn có thể vô hiệu hóa xác minh khóa bằng -kcờ (mặc dù tôi không khuyến nghị điều đó)


2

output-stream-generating-command | ssh user@remotehost 'input-stream-accepting-command' là một tùy chọn, nếu người dùng từ xa của bạn có vỏ hợp lệ.


5
Đây không phải là sftp!
jirib

3
@JiriXichtkniha Không, tuy nhiên, SFTP hầu như không được triển khai như một hệ thống con của máy chủ SSH của bạn và đây là chức năng tương tự gần nhất với chức năng mà tôi thấy được yêu cầu từ câu hỏi (dữ liệu đường ống qua SFTP được xử lý bởi một chương trình ở đầu bên kia). Đôi khi câu trả lời là "Bạn đang sử dụng công cụ sai - thisthay vào đó hãy làm ." - điều này đánh tôi là một trong những thời điểm đó.
voretaq7

2
sftp là protol, và khác với chỉ đường ống qua ssh, vậy thôi! Đề xuất của bạn sẽ không hoạt động nếu phần từ xa sẽ chỉ là SFTP.
jirib

1
Tôi không được phép đăng nhập với tư cách là người dùng ssh
JMW

1
@JMW trong trường hợp đó theo như tôi biết là bạn khá say sưa ở đây - Tôi chưa bao giờ thấy một phiên bản sftp nào hỗ trợ đường ống đến một lệnh trên hệ thống từ xa (có lẽ vì nó sẽ đánh bại Sbit ecure bằng cách cho ai đó vào tình huống của bạn là người không có chương trình chạy shell nào). Mặc dù vậy, tôi có thể sai - Tôi hầu như quen thuộc với chức năng SFTP trong OpenSSH và máy chủ SSH độc quyền mà Sun sử dụng để vận chuyển ...
voretaq7

1

voretaq7 chỉ ra rằng máy khách sftp không hỗ trợ truyền dữ liệu theo đường ống cho người dùng, chỉ được phép sử dụng sftp để kết nối với máy chủ.

may mắn thay, có libssh2, hỗ trợ sftp. vì vậy chúng tôi chỉ cần 2 khách hàng khác sử dụng libssh2 mà tôi đã gọi:

  • sftp_stdin_upload (để tải lên máy chủ sftp)
  • sftp_stdout_d Download (để tải xuống từ máy chủ sftp)

mã nguồn có thể được tìm thấy theo URL sau: http://www.qxs.ch/2012/07/05/sftp-upload-tool/


vì tôi không có kinh nghiệm về lập trình libssh2, tôi rất vui khi nhận được bất kỳ phản hồi nào về mã nguồn.


Không hoạt động đối với tôi :-( / usr / bin / ld: libssh2-1.4.2 / src / .libs / libssh2.a (knownhost.o): tham chiếu không xác định đến ký hiệu 'EVP_sha1' / usr / lib / libcrypto. so.1.0.0: lỗi thêm ký hiệu: DSO bị thiếu trong dòng lệnh coll2: error: ld trả về 1 trạng thái thoát
tobixen

Mã này chỉ có trạng thái POC. Hãy tự mình sửa nó. :-)
JMW
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.