Có thể phát hiện khi một tập tin đã được tải xuống?


7

Chúng tôi có một máy chủ nơi một tập lệnh sFTP khác và tải xuống các tệp hàng ngày.

Câu hỏi: Có thể phát hiện ra rằng tệp đã được tải xuống và sau đó để tôi tự động lưu trữ tệp sau khi hoàn tất?

Để làm rõ - Chúng tôi lưu trữ các tệp và người khác đến và tải xuống.

Đây là kịch bản họ sử dụng:

let $command = 'sftp -b /usr/tmp/file.sftp someuser@myserver'
show 'FTP command is ' $command
call system using $command #status

##file.sftp##

# Set local directory on PeopleSoft server
lcd /var/tmp
# Set remote directory on the remote server
cd ar/in
# Transfer all remote files to PeopleSoft
get file.dat
get file2.dat
# quit the session
bye

Các tệp có được tải xuống qua một công việc định kỳ không
eyoung100

3
Có một lý do để không sửa đổi tập lệnh gốc để lưu trữ mọi thứ khi nó được thực hiện?
Thatipi

Câu trả lời:


12

Có 3 con đường mà tôi có thể nghĩ ra có thể cung cấp cho bạn một giải pháp.

1. Hệ thống con sftp tùy chỉnh

Bạn có thể bọc sftp-serverdaemon qua sshd_configvà "ghi đè" nó bằng tập lệnh của riêng bạn, sau đó có thể chặn những gì sftp-serverđang làm và sau đó hành động khi bạn thấy rằng một tệp đã được tải xuống. Trọng mặc định sftp-servertrong sshd_configrất dễ dàng:

Subsystem       sftp    /usr/local/bin/sftp-server

Tìm hiểu những gì cần làm trong tập lệnh bao bọc sẽ là phần khó /usr/local/bin/sftp-server. Trong:

#!/bin/sh

# ...do something...
chroot /my/secret/stuff /usr/libexec/openssh/sftp-server
# ...do something...

2. Xem nhật ký

Nếu bạn bật gỡ lỗi, sftp-severbạn có thể làm cho nó hiển thị nhật ký khi các tệp đang được mở / đóng và đọc / ghi vào / từ máy chủ SFTP. Bạn có thể viết một daemon / script xem các nhật ký này và sau đó sao lưu tệp khi cần. Chi tiết thêm về cách đạt được điều này đã được đề cập một phần trong câu trả lời của tôi cho câu hỏi và trả lời về U & L này: Mức ghi nhật ký hoạt động trong SFTP cũng như ở đây trong bài đăng trên blog này có tiêu đề: Ghi nhật ký hoạt động phiên chuyển tệp SFTP .

Nhật ký SFTP có thể được tăng cường để chúng trông như thế này:

Sep 16 16:07:19 localhost sftpd-wrapper[4471]: user sftp1 session start from 172.16.221.1
Sep 16 16:07:19 localhost sftp-server[4472]: session opened for local user sftp1 from [172.16.221.1]
Sep 16 16:07:40 localhost sftp-server[4472]: opendir "/home/sftp1"
Sep 16 16:07:40 localhost sftp-server[4472]: closedir "/home/sftp1"
Sep 16 16:07:46 localhost sftp-server[4472]: open "/home/sftp1/transactions.xml" flags WRITE,CREATE,TRUNCATE mode 0644
Sep 16 16:07:51 localhost sftp-server[4472]: close "/home/sftp1/transactions.xml" bytes read 0 written 192062308
Sep 16 16:07:54 localhost sftp-server[4472]: session closed for local user sftp1 from [172.16.221.1]

Sau đó, bạn sẽ cần phát triển một daemon / script để theo dõi nhật ký cho các cặp sự kiện mở / đóng. Chúng đại diện cho một chuyển tập tin hoàn thành. Bạn cũng có thể sử dụng syslog, có thể theo dõi các sự kiện nhật ký "ĐÓNG" và nó có thể được sử dụng để thực hiện sao chép các tệp được chuyển.

3. Incron

Bạn có thể sử dụng các sự kiện Inotify mà nhân Linux tạo ra mỗi khi tệp được truy cập. Có một dịch vụ gọi là Incron hoạt động tương tự như Cron. Trường hợp Cron hoạt động dựa trên thời gian, Incron hoạt động dựa trên các sự kiện tệp. Vì vậy, bạn có thể thiết lập mục nhập Incron để theo dõi các thư mục tải lên SFTP của bạn và bất cứ khi nào phát hiện ra một sự kiện tệp cụ thể, hãy sao chép tệp.

Có một cái nhìn vào trang người đàn ông inotify để mô tả về các sự kiện khác nhau. Tôi tin rằng bạn muốn xem một read()( IN_ACCESS) theo sau là close()( IN_CLOSE_WRITE). Chúng sẽ dành cho các tệp được sao chép từ máy chủ SFTP.

Quy tắc Incron trông như thế này:

<directory> <file change mask> <command or action>  options
/var/www/html IN_CREATE /root/scripts/backup.sh
/sales IN_DELETE /root/scripts/sync.sh
/var/named/chroot/var/master IN_CREATE,IN_ATTRIB,IN_MODIFY /sbin/rndc reload

Bài viết này có tiêu đề: Linux bao gồm inotify: Giám sát các thay đổi và hành động cho thấy nhiều chi tiết cần thiết hơn, nếu bạn muốn thử và đi với tùy chọn này.


3

Định cấu hình máy chủ SSH để ghi nhật ký hoạt động, sau đó bạn có thể phân tích nhật ký để biết liệu tệp đó đã được tải xuống chưa.

Để cho phép ghi nhật ký nối -l INFOvào dòng hệ thống con sftp trong /etc/ssh/sshd_configtệp, nó sẽ trông giống như (đường dẫn có thể thay đổi theo bản phân phối, tôi đang sử dụng SuSE 11):

Subsystem    sftp    /usr/lib64/ssh/sftp-server -l INFO

Bây giờ các phiên sftp sẽ được đăng nhập /var/log/messages.

Đây là nhật ký cho tệp được tải xuống bởi sftp:

Dec  3 08:42:02 $HOSTNAME sftp-server[$PID]: session opened for local user user from [192.168.0.10]
Dec  3 08:42:03 $HOSTNAME sftp-server[$PID]: opendir "/home/user"
Dec  3 08:42:03 $HOSTNAME sftp-server[$PID]: closedir "/home/user"
Dec  3 08:42:18 $HOSTNAME sftp-server[$PID]: open "/home/user/file" flags READ mode 0666
Dec  3 08:42:19 $HOSTNAME sftp-server[$PID]: close "/home/user/file" bytes read 48843 written 0

Bây giờ bạn có thể phân tích tệp để biết liệu tệp đã được truy cập với nội dung như:

#!/bin/bash

grep sftp /var/log/messages | grep -q $FILENAME
if [ $? -eq 0 ]
    do something
else
    do other thing
fi

Cách bật ghi nhật ký SFTP: /server/73319/sftp-logging-is-there-a-way


1
Trong khi về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Ngoài ra, tôi nhận ra đó là một trang SE khác và tôi đã viết một trong những Người, nhưng chúng tôi vẫn thích nội dung được tự do, nếu có thể.
slm

-1

Nếu bạn biết đường dẫn và tên thì bạn có thể làm điều này

if [ -f $filename ];
then 
archive
else
echo ""
fi

Tuy nhiên, bạn đã không thêm bất kỳ thông tin như vậy.

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.