2

ディレクトリを監視し、scpを使用して作成または変更されたファイルをアップロードするPythonスクリプトに取り組んでいます。これを再帰的に実行したい場合を除いて、これで問題ありません。ユーザーが監視ディレクトリにディレクトリを作成し、その新しいディレクトリ内のファイルを変更すると問題が発生します。

ディレクトリの作成とファイルのネストされたファイルの作成/変更を問題なく検出できます。しかし、そのファイルをリモートサーバーにアップロードしようとすると、リモートサイトのディレクトリが存在しないため、機能しません。作成したディレクトリを再帰的にコピーせずにこれを行う簡単な方法はありますか?リモートフォルダが存在する場合は削除したくないので、これを避けたいと思います。

また、提案しないでくださいrsync。sshとscpのみを使用する必要があります。

4

3 に答える 3

2

あなたはsshを持っているので、最初にディレクトリを作成するだけではいけませんか?たとえば、絶対パス/some/path/file.txtのファイルがある場合、mkdir -p /home/pathアップロードする前にaを発行しfile.txtます。

更新:トランザクションの数を減らしたい場合は、ローカルでtarファイルを作成し、それを転送して、解凍することをお勧めします。

于 2010-09-12T04:02:55.050 に答える
1

あなたの特定のアプリケーションには(私のように)独自の癖があると思いますが、これはあなたを正しい道に導くかもしれません。以下は、paramiko上に構築されたFabricを使用してリモートEC2インスタンスにファイルを配置するために使用するスクリプトの短いスニペットです。また、Fabricには独自の「sudo」クラスがあるため、sudoコマンドを配置した場所にも注意してください。これは私が言及していたそれらの癖の1つです。これが誰かを助けることを願っています。


from fabric.api import env, run, put, settings, cd
from fabric.contrib.files import exists

''' sudo apt-get install fabric Initially setup for interaction with an AWS EC2 instance At the terminal prompt run: fab ec2 makeRemoteDirectory changePermissions putScript '''

TARGETPATH = '/your/path/here'

def ec2(): env.hosts = ['your EC2 Instance or remote address'] env.user = 'user_name' env.key_filename = '/path/to/your/private_key.pem'

def makeRemoteDirectory(): if not exists('%s'%TARGETPATH): run('sudo mkdir %s'%TARGETPATH)

def changePermissions(): run('sudo chown -R %(user)s:%(user)s %(path)s'%{'user': env.user, 'path': TARGETPATH})

def putScript(): fileName = '/path/to/local/file' dirName = TARGETPATH put(fileName, dirName)

于 2010-11-27T21:42:06.667 に答える
0

正確にはscpではありませんが、sftpは-bバッチファイルでパラメータを取得できます。mkdirとputを送信できます。

于 2010-09-12T03:58:41.153 に答える