2011-12-14 143 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,這是一個用Perl編寫的SFTP服務器,可以擴展以執行所需的任務。

一些代碼:

#!/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服務器而不是默認的。