rsync bir Bash betiğinde `` eksik takip '' hakkında şikayet ediyor


13

Bir ekran oturumunda dosyaları bir sunucudan diğerine rsync yapmaya çalışıyorum. Uzun komutu her seferinde yazmak yerine bir Bash senaryosu yazmaya karar verdim. Ancak, çalıştırdığımda bir Missing trailing-" in remote-shell command.hata alıyorum.

Senaryoda neyin yanlış gittiğini merak ediyorum.

root@127.0.0.1:~# /raid/data/module/bin/rbk.sh Movies /raid/data/Movies rsync_target/

/raid/data/module/bin/screen -S Movies 

/opt/bin/rsync --rsh="ssh -p 10022 -c des"\
--rsync-path="/opt/bin/rsync" --inplace --progress -a -vv \
/raid/data/Movies sys@192.168.1.15:/raid/data/rsync_target/

Missing trailing-" in remote-shell command.
rsync error: syntax or usage error (code 1) at main.c(361) [sender=3.0.5]

Komut dosyası ilk önce ne yapacağını yansıtır ve sonra komutu yürütür. Aşağıda senaryomun bir dökümü:

#!/bin/bash
SCREEN="/raid/data/module/bin/screen"
SCREENOPT="-S"
SCREEN_TITLE=$1

RSYNC="/opt/bin/rsync"
RSYNCOPT="--rsh=\"ssh -p 10022 -c des\" --rsync-path=\"/opt/bin/rsync\" --inplace --progress -a -vv"

SOURCE=$2

REMOTE_USER="sys@"
REMOTE_HOST="192.168.1.15"
REMOTE_BASE=":/raid/data/"
REMOTE_TARGET=$3

echo ${SCREEN} ${SCREENOPT} ${SCREEN_TITLE}

echo ${RSYNC} ${RSYNCOPT} ${SOURCE} ${REMOTE_USER}${REMOTE_HOST}${REMOTE_BASE}${REMOTE_TARGET}
${RSYNC} ${RSYNCOPT} ${SOURCE} ${REMOTE_USER}${REMOTE_HOST}${REMOTE_BASE}${REMOTE_TARGET}

Yanıtlar:


23

Kısa cevap: BashFAQ # 050'ye bakınız .

Uzun cevap: Yaşadığınız sorun, değişkenleri tırnak içine almanın düşündüğünüz gibi çalışmadığıdır. Özellikle, tırnaklar değişkenler değiştirilmeden önce ayrıştırılır, bu nedenle bir değişkenin değeri tırnaklar içeriyorsa, doğru çalışması için çok geç olur. Komut satırında ayarlayıp RSYNCOPT="--rsh=\"ssh -p 10022 -c des\" ..."kullandığınızda ${RSYNCOPT}, değişken içindeki tırnaklar ayrıştırılmaz, yalnızca normal karakterler olarak kabul edilir. Bu nedenle, rsync komutu tek bir parametre alıcı yerine --rsh=ssh -p 10022 -c des, aldığı 5: --rsh="ssh, -p, 10022, -c, ve des". --Rsh komutu tek bir (eşleşmeyen) alıntı içerdiğinden, bir hata alırsınız.

Neler daha iyi görmek için, ya set -xkabuğu çalıştırmadan önce her komutu yazdırmak için kullanın (böylece gerçekten ne olduğunu görebilirsiniz) ya da echo ${whatever}(son derece yanıltıcı olan) ile değiştirin printf "%q " ${whatever}; echo.

Bunu çözmenin birkaç yolu vardır. Birincisi, RSYNCOPTdeğişkenleri ilk etapta depolamaya çalışmaktan (ve muhtemelen başka şeylerden) kaçınmaktır . Bir diğeri, RSYNCOPTbasit bir dize yerine bir dizi (bu karışıklık olmadan kelime sınırlarını takip edebilen) olarak saklamaktır.

Komutu çalıştırmadan önce yazdırmak için set -xrsync komutundan önce kullanın ve kapatmak için + x ayarını kullanın veya printfyukarıda listelediğim komut gibi bir şey kullanın (komuttan sonra bir boşluk bıraktığına dikkat edin, ancak bu genellikle t önemli).

Dizi + printf yaklaşımı şöyledir:

...
RSYNCOPT=(--rsh="ssh -p 10022 -c des" --rsync-path=\"/opt/bin/rsync\" --inplace --progress -a -vv)
...
printf "%q " ${SCREEN} ${SCREENOPT} ${SCREEN_TITLE}
echo

printf "%q " ${RSYNC} "${RSYNCOPT[@]}" ${SOURCE} ${REMOTE_USER}${REMOTE_HOST}${REMOTE_BASE}${REMOTE_TARGET}
echo
${RSYNC} "${RSYNCOPT[@]}" ${SOURCE} ${REMOTE_USER}${REMOTE_HOST}${REMOTE_BASE}${REMOTE_TARGET}

Beni doğru yöne yönlendirdiğiniz için teşekkürler, yine de sağladığınız bağlantıya hızlı bir bakış beni bir işlevin daha okunabilir olduğuna ikna etti (veya en azından düzgün biçimlendirildiğinde öyle oluyor): run_rsync() { /opt/bin/rsync "--rsh=\"ssh -p 10022 -c des\" --rsync-path=\"/opt/bin/rsync\" --inplace --progress -a -vv" $1 $2 } run_rsync ${SOURCE} ${REMOTE_USER}${REMOTE_HOST}${REMOTE_BASE}${REMOTE_TARGET} (Biliyorum, bu oldukça eski, ama yine de bir tane) "Uzak kabuk komutunda" Eksik iz- "kelimesini ararken ilk bağlantıların listesi)
Francesco Marchetti-Stasi

6

Kaçan ve kaçmayan tırnak işaretlerinin labirenti $RSYNCOPT, benimle olan kafasını karıştırıyor; Rsync ve / veya ssh ve / veya yerel veya uzak kabuğu karıştırdığı için şaşırmadım.

Ters eğik çizgiler ekleyerek veya kaldırarak bunun çalışması için bir yol olabilir, ancak bunun yerine aşağıdaki geçici çözümü öneririm:

Değiştir:

RSYNCOPT="--rsh=\"ssh -p 10022 -c des\" --rsync-path=\"/opt/bin/rsync\" --inplace --progress -a -vv"

tarafından:

export RSYNC_RSH="ssh -p 10022 -c des"
RSYNCOPT="--rsync-path=\"/opt/bin/rsync\" --inplace --progress -a -vv"

Komut dosyasının sistemimde biraz basitleştirilmiş bir sürümünü denedim ve yaptığınız aynı hata mesajını aldım; bu geçici çözüm düzeltildi.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.