5

(リモート ディレクトリをローカルで同期する) Python アプリケーションを実行すると、アプリを含むディレクトリの名前に 1 つ以上のスペースが含まれていると問題が発生します。-o UserKnownHostsFile=<path>ディレクトリ名は、「 」や「 」などの ssh オプションに表示されます-i <path>。コマンド文字列を生成する関数でパスを二重引用符で囲みますが、何もしません。また、次のようにスペースを置き換えようとしました: path.replace(' ', '\\ ')、しかしうまくいきません。私のコードは、スペースのないディレクトリ名で機能することに注意してください。ssh によって返されるエラーは「行末にゴミがあります」(コード 12) 生成されたコマンド ラインは問題ないようです。

rsync -rztv --delete --stats --progress --timeout=900 --size-only --dry-run \
    -e 'ssh -o BatchMode=yes \
    -o UserKnownHostsFile="/cygdrive/C/Users/my.user/my\ app/.ssh/known_hosts" \
    -i "/cygdrive/C/Users/my.user/my\ app/.ssh/id_rsa"'
    user@host:/home/user/folder/ "/cygdrive/C/Users/my.user/my\ app/folder/"

私は何を間違っていますか?ありがとうございました!

4

3 に答える 3

5

コマンドを引数のリストとして作成しようとしましたか-ssh接続のキーファイルを渡す同様の問題がありました:

command = [
  "rsync",
  "-rztv",
  "--delete",
  "--stats",
  "--progress",
  "--timeout=900",
  "--size-only",
  "--dry-run",
  "-e",
  "ssh -o BatchMode=yes -o UserKnownHostsFile='/cygdrive/C/Users/my.user/my\ app/.ssh/known_hosts' -i '/cygdrive/C/Users/my.user/my\ app/.ssh/id_rsa'",
  "user@host:/home/user/folder/",
  "/cygdrive/C/Users/my.user/my\ app/folder/"
]

sp = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = sp.communicate()[0]
于 2012-09-12T10:46:13.177 に答える
0

エスケープの問題を回避するには、生の文字列を使用します。

raw_string = r'''rsync -rztv --delete --stats --progress --timeout=900 --size-only --dry-run -e 'ssh -o BatchMode=yes -o UserKnownHostsFile="/cygdrive/C/Users/my.user/my app/.ssh/known_hosts" -i "/cygdrive/C/Users/my.user/my app/.ssh/id_rsa"' user@host:/home/user/folder/ "/cygdrive/C/Users/my.user/my app/folder/"'''

sp = subprocess.Popen(raw_string, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = sp.communicate()[0]
于 2012-07-12T08:42:56.863 に答える
0

サブコマンドから返されたデータには、区切り文字としてスペースが含まれています。次のように、Internal Field Separator (IFS) リストを更新してみてください。

# store a copy of the current IFS
SAVEIFS=$IFS;
# set IFS to be newline-only
IFS=$(echo -en "\n\b");

# execute your command(s)
rsync -rztv --delete --stats --progress --timeout=900 --size-only --dry-run -e 'ssh -o BatchMode=yes -o UserKnownHostsFile="/cygdrive/C/Users/my.user/my\ app/.ssh/known_hosts" -i "/cygdrive/C/Users/my.user/my\ app/.ssh/id_rsa"' user@host:/home/user/folder/ "/cygdrive/C/Users/my.user/my\ app/folder/"

# put the original IFS back
IFS=$SAVEIFS;

コマンドを使用してテストしたことはありませんが、過去に試したすべてのケースで機能しました。

于 2012-07-11T15:39:58.557 に答える