Abbiamo un server in cui un altro script sFTP e scarica file ogni giorno.
Domanda: È possibile rilevare che il file è stato scaricato e quindi archiviare automaticamente il file al termine?
Per chiarire:noi ospitiamo i file e qualcun altro viene e lo scarica.
Questo è lo script che usano:
let $command = 'sftp -b /usr/tmp/file.sftp [email protected]'
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
Risposta accettata:
Ci sono 3 strade che posso concepire che potrebbero fornirti una soluzione.
1. Sottosistema sftp personalizzato
Potresti avvolgere il sftp-server
demone tramite sshd_config
e "sovrascrivilo" con il tuo script che potrebbe quindi intercettare ciò che sftp-server
sta facendo, quindi agisci quando vedi che un file è stato scaricato. Sovrascrivere il sftp-server
predefinito in sshd_config
è facile:
Subsystem sftp /usr/local/bin/sftp-server
Capire cosa fare nello script wrapper sarebbe la parte difficile.In /usr/local/bin/sftp-server
:
#!/bin/sh
# ...do something...
chroot /my/secret/stuff /usr/libexec/openssh/sftp-server
# ...do something...
2. Guarda i registri
Se attivi il debug di sftp-sever
puoi farlo mostrare i registri di quando i file vengono aperti/chiusi e letti/scritti nel/dal server SFTP. È possibile scrivere un demone/script che controlli questi registri e quindi esegue il backup del file quando necessario. Ulteriori dettagli su come raggiungere questo obiettivo sono già parzialmente trattati nella mia risposta a queste domande e risposte sugli U&L:livello di registrazione attività in SFTP e qui in questo post del blog intitolato:registrazione attività della sessione di trasferimento file SFTP.
I registri SFTP possono essere migliorati in modo che assomiglino a questo:
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]
Dovresti quindi sviluppare un demone/script che monitori i registri per le coppie di eventi di apertura/chiusura. Questi rappresentano un trasferimento di file completato. Potresti anche utilizzare syslog, che potrebbe monitorare gli eventi del registro "CLOSE" e potrebbe essere utilizzato per eseguire la copia dei file trasferiti.
3. Incrona
È possibile utilizzare gli eventi Inotify che il kernel Linux produce ogni volta che si accede a un file. C'è un servizio chiamato Incron che funziona in modo simile a Cron. Laddove Cron funziona in base al tempo, Incron funziona in base agli eventi dei file. Quindi puoi impostare una voce Incron che monitori le tue directory di caricamento SFTP e ogni volta che viene rilevato un evento di file specifico, copia il file.
Correlati:Sfoglia il file vmdk in Windows?
Dai un'occhiata alla pagina man di inotify per la descrizione dei vari eventi. Credo che vorresti guardare un read()
(IN_ACCESS
) seguito da un close()
(IN_CLOSE_WRITE
). Questi sarebbero per i file che sono stati copiati dal server SFTP.
Le regole di Incron si presentano così:
<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
Questo articolo intitolato:Linux incrond inotify:monitora le directory per le modifiche e agisci mostra molti più dettagli necessari, se vuoi provare a utilizzare questa opzione.