2011-12-14 13 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

アプリケーションを作成して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内のどこかに、スクリプト、およびデフォルトの代わりにSFTPサーバーとして使用するには、OpenSSHの設定。

関連する問題