2011-12-14 5 views
4

У меня есть Linux (openSUSE 10.X) и на нем есть служба SFTP.Файл, переданный через SFTP

Когда кто-то ставит файл, я должен написать сценарий для перемещения файлов в другой каталог. Я не хочу писать работу cron. Есть ли событие или что-то, что я могу проверить, чтобы проверить, отправили ли они файл?

+2

Возможно, этот вопрос относится к классу superuser.com. – hochl

+4

ответил: http://stackoverflow.com/questions/7566569/how-to-continuosly-monitor-the-directory-using-dnotify-inotify-command – matiu

+1

[incron ] (http://inotify.aiken.cz/?section=incron&page=doc&lang=en) программа похожа на комбинацию 'inotify (7)' и 'crond (8)' - она ​​ждет событий файловой системы, а затем принимает действие. – sarnold

ответ

2

Вы можете написать приложение c и подключить к inotify событиям.

+0

И если вы не хотите писать программу с помощью c, вы можете использовать inotify-tools прямо из командной строки: https://github.com/rvoicilas/inotify-tools/wiki/ –

1

Проверьте также Net::SFTP::Server, SFTP-сервер, написанный на Perl, который может быть расширен, чтобы делать то, что вам нужно.

Некоторый код:

#!/usr/bin/perl 

use strict; 
use warnings; 
use File::Basename(); 

my $server = Server->new(timeout => 15); 
$server->run; 
exit(0); 

package Server; 

use Net::SFTP::Server::Constants qw(SSH_FXF_WRITE); 

use parent 'Net::SFTP::Server::FS'; 

sub handle_command_open_v3 { 
    my ($self, $id, $path, $flags, $attrs) = @_; 
    my $writable = $flags & SSH_FXF_WRITE; 
    my $pflags = $self->sftp_open_flags_to_sysopen($flags); 
    my $perms = $attrs->{mode}; 
    my $old_umask; 
    if (defined $perms) { 
    $old_umask = umask $perms; 
    } 
    else { 
    $perms = 0666; 
    } 
    my $fh; 
    unless (sysopen $fh, $path, $pflags, $perms) { 
    $self->push_status_errno_response($id); 
    umask $old_umask if defined $old_umask; 
    return; 
    } 
    umask $old_umask if defined $old_umask; 
    if ($writable) { 
    Net::SFTP::Server::FS::_set_attrs($path, $attrs) 
     or $self->send_status_errno_response($id); 
    } 
    my $hid = $self->save_file_handler($fh, $flags, $perms, $path); 
    $self->push_handle_response($id, $hid); 
} 

sub handle_command_close_v3 { 
    my $self = shift; 
    my ($id, $hid) = @_; 
    my ($type, $fh, $flags, $perms, $path) = $self->get_handler($hid); 

    $self->SUPER::handle_command_close_v3(@_); 

    if ($type eq 'file' and $flags & SSH_FXF_WRITE) { 
     my $name = File::Basename::basename($path); 
     rename $path, "/tmp/$name"; 
    } 
} 

Сохраните скрипт где-то в вашем сервере, chmod 755 $it и настроить OpenSSH, чтобы использовать его в качестве сервера SFTP вместо установленного по умолчанию.

Смежные вопросы