3

Pythonでrsyncを使用しようとしています。Popen に引数を渡すための推奨される方法は、配列を使用することです。

私が試したコード:

p = Popen(["rsync",
        "\"{source}\"".format(source=latestPath),
        "\"{user}@{host}:{dir}\"".format(user=user, host=host, dir=dir)],
        stdout=PIPE, stderr=PIPE)

その結果、認証を行うために SSH キーを設定したにもかかわらず、rsync がパスワードを要求します。

これは、新しいプロセスが実行される環境に問題があると思います。次に試したことは次のとおりです。

p = Popen(["rsync", 
   "\"{source}\"".format(source=latestPath),
   "\"{user}@{host}:{dir}\"".format(user=user, host=host, dir=dir)],
   stdout=PIPE, stderr=PIPE, shell=True)

これにより、rsync が「正しい使用法」を出力するため、引数が誤って rsync に渡されます。これが機能するかどうかはわかりません(shell = Trueで配列を渡す)

次のように配列を完全に削除すると:

p = Popen("rsync \"{source}\" \"{user}@{host}:{dir}\"".format(
        source=latestPath, user=user, host=host, dir=dir),
      stdout=PIPE, stderr=PIPE, shell=True)

プログラムは正常に動作します。このスクリプトでは問題ありませんが、何が違うのか知りたいですか? 他の2つ(主に最初のもの)が機能しないのはなぜですか?

シェル環境が必要なだけで、2番目は間違っていますか?

編集:変数の内容

latestPath='/home/tomcat/.jenkins/jobs/MC 4thworld/workspace/target/FourthWorld-0.1-SNAPSHOT.jar'
user='mc'
host='192.168.0.32'
dir='/mc/test/plugins/'
4

3 に答える 3

1

知りたいのですが、違いは何ですか?

の場合shell=True、コマンド全体がシェルに渡されます。シェルがコマンドを再び正しく選択できるように、引用符が存在します。特に、通過

foo "bar baz"

をシェルに渡すと、コマンドを (Python 構文) として解析し、引数を指定し['foo', 'bar baz']てコマンドを実行できるようになります。foobar baz

対照的に、 の場合shell=False、Python はリスト内の引数をすぐにプログラムに渡します。たとえば、次のsubprocessコマンドを試してください。

>>> import subprocess
>>> subprocess.call(["echo", '"Hello!"'])
"Hello!"
0
>>> subprocess.call('echo "Hello!"', shell=True)
Hello!
0

最初の場合、引用符はechoプログラムによってエコー バックされますが、2 番目の場合、シェルは実行前に引用符を取り除きますecho

あなたの特定のケースでrsyncは、引用符を取得しますが、それらをどのように処理するべきかわかりません。結局のところ、それ自体はシェルではありません。

于 2012-09-19T14:50:55.420 に答える
1

cwdまたはenvパラメータと関係がありますか?最初の構文では、SSH キーが見つからない可能性があります...

于 2012-09-19T13:42:13.350 に答える
1

サブプロセスの代わりにshを使用する方が簡単かもしれません。

import sh
sh.rsync(latestPath, user+"@"+host+":"+dir)
于 2012-09-20T08:15:45.010 に答える