다른 스크립트가 SFTP를 수행하고 매일 파일을 다운로드하는 서버가 있습니다.
질문:파일이 다운로드되는 시점을 감지하고 완료되면 자동으로 파일을 보관할 수 있습니까?
명확히 하자면, 우리는 파일을 호스팅하고 다른 사람들은 파일을 다운로드합니다.
그들이 사용하는 스크립트는 다음과 같습니다.
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
답변1
나는 당신에게 해결책을 제공하는 3가지 방법을 생각할 수 있습니다.
1. SFTP 하위 시스템 사용자 정의
sftp-server
데몬을 래핑 sshd_config
하고 자신만의 스크립트로 "재정의" 하여 이를 수행할 수 있습니다 . 그런 sftp-server
다음 수행 중인 작업을 가로채고 파일이 다운로드되면 조치를 취할 수 있습니다. 기본값을 재정의하는 것은 sftp-server
쉽습니다 sshd_config
.
Subsystem sftp /usr/local/bin/sftp-server
래퍼 스크립트에서 수행할 작업을 파악하는 것은 어려운 부분입니다 /usr/local/bin/sftp-server
. 존재하다:
#!/bin/sh
# ...do something...
chroot /my/secret/stuff /usr/libexec/openssh/sftp-server
# ...do something...
2. 로그 보기
디버깅을 켜면 sftp-sever
SFTP 서버에서 파일 열기/닫기 및 파일 읽기/쓰기 로그를 표시하도록 할 수 있습니다. 데몬/스크립트를 작성하여 이러한 로그를 모니터링한 다음 필요한 경우 파일을 백업할 수 있습니다. 이를 달성하는 방법에 대한 자세한 내용은 이 U&L Q&A에 대한 답변에 부분적으로 포함되어 있습니다.SFTP의 활동 로깅 수준그리고 이 블로그 게시물의 제목은 다음과 같습니다.SFTP 파일 전송 세션 활동 로깅.
SFTP 로그는 다음과 같이 향상될 수 있습니다.
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]
그런 다음 열기/닫기 이벤트 쌍에 대한 로그를 모니터링하는 데몬/스크립트를 개발해야 합니다. 이는 완료된 파일 전송을 나타냅니다. "CLOSE" 로그 이벤트를 모니터링하고 전송된 파일을 복사하는 데 사용할 수 있는 syslog를 사용할 수도 있습니다.
3. 영국 크로나
당신이 사용할 수있는통지하다파일에 액세스할 때마다 Linux 커널에서 생성되는 이벤트입니다. 이라는 서비스가 있습니다.영국 크로나작동 원리는 Cron과 유사합니다. Cron은 시간을 기반으로 작동하는 반면 Incron은 파일 이벤트를 기반으로 작동합니다. 따라서 Incron 항목을 설정하여 SFTP 업로드 디렉터리를 모니터링하고 이벤트가 감지될 때마다 특정 파일을 복사할 수 있습니다.
보세요inotify 매뉴얼 페이지다양한 이벤트를 설명하는 데 사용됩니다. 나는 당신이 read()
( IN_ACCESS
) 다음에 close()
( ) 를 보고 싶어할 것이라고 믿습니다 IN_CLOSE_WRITE
. 이러한 파일은 SFTP 서버에서 복사된 파일에 적용됩니다.
Incron 규칙은 다음과 같습니다.
<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
이 기사의 제목은 다음과 같습니다.Linux incrond inotify: 디렉터리의 변경 사항을 모니터링하고 조치를 취합니다.이 옵션을 시도하려면 더 많은 필수 세부정보가 표시됩니다.
답변2
활동을 기록하도록 SSH 서버를 구성한 다음 로그를 구문 분석하여 해당 파일이 다운로드되었는지 확인할 수 있습니다.
로깅을 활성화하려면 -l INFO
파일에 sftp 하위 시스템 줄을 추가하세요 /etc/ssh/sshd_config
. 다음과 같아야 합니다(경로는 배포판에 따라 다를 수 있습니다. 저는 SuSE 11을 사용하고 있습니다).
Subsystem sftp /usr/lib64/ssh/sftp-server -l INFO
이제 SFTP 세션이 로그인됩니다 /var/log/messages
.
다음은 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
이제 파일을 구문 분석하여 액세스되었는지 확인할 수 있습니다. 예를 들면 다음과 같습니다.
#!/bin/bash
grep sftp /var/log/messages | grep -q $FILENAME
if [ $? -eq 0 ]
do something
else
do other thing
fi
SFTP 로깅을 활성화하는 방법:https://serverfault.com/questions/73319/sftp-logging-is-there-a-way
답변3
경로와 이름을 알고 있다면 다음을 수행할 수 있습니다.
if [ -f $filename ];
then
archive
else
echo ""
fi
하지만 당신은 그런 정보를 추가하지 않았습니다.