18

別のコンピューターにデータをバックアップするために、rsyncのいくつかのインスタンスを順番に実行するPythonスクリプトを書きたいと思っていました。

現時点では、使用するコマンドを含むこのテキストファイルがあり、それらをターミナルにコピーして貼り付けているところですが、ちょっとばかげているようです。

Pythonを使用してこれを実行できるようにしたいと思います。subprocess.popenの使い方は漠然と知っていますが、パスワードを入力する場合のように、Pythonでrsyncと直接対話する方法がわかりません。Pythonはそれを行うことができますか?

何かのようなもの:

if theProccess.proccessResponse == "Password:" :
    theProccess.respond(string)

それとも、私ができる最善のことは、それを持っているか、bashスクリプトでさえ、rsyncを順番に実行し、パスワードを何度も入力する必要があることです。

前もって感謝します。

4

8 に答える 8

21

一般にサブプロセスを操作する場合は、他の場所で説明されているようにpexpectを使用できます。ただし、特定のケースでは、rsyncがssh(デフォルト)で実行されていると仮定すると、2つのホスト間にパスワードなしのssh接続を設定することを検討できます。これにより、パスワードを入力する必要がなくなります。これはキーベースのソリューションであり、パスワードをソースコードに保存するよりもはるかに安全です。

これがあなたの正確な問題について話し合い、パスワードなしのsshを使うことにしたブロガーです。

于 2009-11-01T17:15:00.293 に答える
7

Colin Stewart によって書かれた RSyncBackup と呼ばれる素晴らしい Python モジュールがあります。これはほとんど知られておらず、文書化もされていませんが、非常に便利です。

デフォルトでは、rsync コマンドにパスワードを含める方法が含まれていないため、モジュールを変更して、このブログ投稿で説明しました: http://technofart.blogspot.com/2012/02/rsync-controlled -by-python.html

変更したモジュールへのリンクは、私の投稿のダウンロード セクションにあります。

キーベースのソリューションも素晴らしいアイデアです。また、多くの rsync 実装は、設定可能な RSYNC_PASSWORD 環境変数を探します。環境変数が他のユーザーに表示される場合は注意してください。

于 2010-12-22T23:17:44.743 に答える
6

rsyncを使用して、クライアントのすべてのWebサイトをバックアップしています。スクリプトはcronによってトリガーされ、ニーズが異なるため、クライアントごとにMakefileを使用します。

パスワードを入力するのではなく、ssh-keygenを使用して公開鍵と秘密鍵のペアを作成し、公開鍵をリモートマシンに配置します。これにより、パスワードなしの安全な接続が可能になります。これは、rsyncポートをワールドに公開する必要がないことも意味します。これに関する学習曲線を通過した後(そしてそれはそれほど急ではありません)、sshは間違いなくあなたの友達です。

于 2009-11-01T16:42:13.887 に答える
2

返事が遅くなって申し訳ありませんが、他の方の回答が間違っていたような気がします。彼らはあなたの質問にちょっと答えましたが、彼らができるように直接ではありませんでした.

さらに言えば、インタラクティブにパスワードを取得する方法を尋ねました。そのためには、組み込みの getpass をお勧めします。つまり、rsync と対話していません。rsync を実行する前にユーザー RIGHT からパスワードを取得し、それを rsync に渡します。別のオプションは、ユーザーがオプションとしてそれを渡すことを許可することです。私のコマンドラインスクリプトのほとんどは optparse を使用します

import getpass
password = getpass.getpass('Password for %s: ' % opts.user)
try:
    #code that uses password
except Exception, e:
    # test to see if str(e) is really an invalid password error, if so tell the user and return or loop, up to you
    # else 
    raise Exception(e) # the error that was raised in the first place

続けて、似たようなものを探していたので、あなたの質問に出くわしました。参考までに、私はこれらのスタックオーバーフローリンクのうちの2つを参照することになりました .python subprocess.call から rsyncを呼び出し、スレッドからPython Subprocess.Popenを呼び出します

于 2013-09-20T19:10:00.537 に答える
1

箱から出してrsyncをサポートしているとは思いませんが、paramikoにはリサイクルできるコンポーネントがいくつかある可能性がありますか?

于 2009-11-01T22:00:48.063 に答える
1

サブプロセスをプログラムで制御する必要がある場合は、pexpectの使用を検討する必要があります。

于 2009-11-01T16:47:14.157 に答える
0

パスワードを入力する必要があるだけの場合は、RSYNC_PASSWORD環境変数を入力するか、--password-fileオプションを使用してみてください。

于 2010-06-08T21:39:03.230 に答える
0

rsyncコマンドを並行して実行するparallel_syncというpythonパッケージを作成しました。ファブリックの内外で使用して、複数のホストで同時に操作を実行できます。

オープンソースです。GNU ライセンス。 https://github.com/kouroshparsa/parallel_sync

改善を求めたり、貢献したりしてください。

于 2015-10-25T19:46:43.950 に答える