Uzak SSH bağlantısı üzerinden rsync kullanırken uzak bir yolda boşluklardan kaçma


10

SSH'yi rsync'i uzak bir sunucuya bağlamak için kullanırken, uzak yoldaki boşluklardan nasıl kaçarsınız? Basit bir ters eğik çizgi, yerel bash istemi için alandan kaçar, ancak uzak makinede alan daha sonra yolda bir mola olarak okunur, böylece bu yolun sonunu işaretler.

Böylece rsync -avz /path/to/source/some\ dir/ user@host.tld:/path/to/dest/some\ dir/ne olur ne zaman uzak sunucu bu gibi okuma /path/to/dest/some/ve o hedefi uzaktan bulamıyor beri, çünkü gerçek hedef sadece "bazı" yerine "bazı dir".

Aynı komutu dener ve yerel bash istemini geçmek ve uzak sunucu için ters eğik çizgiyi (toplam üç ters eğik çizgi:) korumak için ters eğik çizgi ve boşluktan kaçarsam /path/to/dest/some\\\ dir/, gerçekten ters eğik çizgiyi uzak sunucuya gönderir, ancak uzak sunucu daha sonra yolu , boşluk ve ardındaki karakterleri sıyırmak /path/to/dest/some\/yerine yorumlamaktadır /path/to/dest/some\ dir/.

Yolu tırnak işareti ile sarmaya çalışırsam, hemen hemen aynı şekilde davranır ve yolu etkili bir şekilde alandan keser. Yani sadece yerel bash istemini geçmek için çalışır.

Başlangıçta içinde bir "-" (boşluk-tire-boşluk) segmenti olan bir yol kullanıyordum ve uzak sunucu, rsync: on remote machine: -: unknown optionilk etapta tüm bu alandan kaçan çabayı başlatan bir hata döndürüyordu .

Öyleyse, uzak yoldan boşlukları veya kısa çizgiler gibi diğer hatalı karakterleri kaldırmak zorunda kalmadan, uzak sunucu ile düzgün çalışmasını sağlamak için ne yapmalıyım?


1
Hem tek hem de çift tırnakları deneyin.
jftuga

Javier de bundan bahsetti ve işe yaradı, bu yüzden cevabına bir cevap olarak çalışma kodu segmentimi yapıştırdım.
purefusion

@purefusion Grégory'nin yanıtını doğru olarak işaretlemeyi düşünün. -sGerek kalmadan adresleri sorunu elle çift kaçan uygulamak.
m000

Yanıtlar:


9

Başlatıcı makinesinde, rsyncuzak makinede rsync hedefini çağıran bir komut satırı oluşturur, sonra bu komut satırını ssh .... kullanarak tek bir dize olarak gönderir . Bu tek dize ayrıştırmak, bağımsız değişkenlere bölünmek ve yürütmek için kabuğa geçirilir rsync. Uzak rsync için bazı ikili güvenli kapsayıcıda (zaten bölünmüş, genişletilmiş ve sıralanmamış) argümanları paketlemek yerine, bunun yapıldığı hakkında hiçbir fikrim yok.

Bu, argümanlarınızın iki farklı kabuk tarafından ayrıştırılacağı anlamına gelir, buna göre teklif verin ve isteyin . Genellikle, her bir argümanı çift tırnak işareti ve sonra tüm ifadeyi tek tırnak üzerinde sararım. bazen yeterli değildir veya aynı ifadenin yerel ve uzaktan kullanılmasını istiyorsanız karmaşık olabilir.

Bu durumlarda, genellikle basit, boşluk bırakmayan, tüm ASCII adlarıyla bazı yumuşak bağlantılar ayarladım ve bunu kullanıyorum.


8
Ve kazanan ... tek + çift tırnak! Belki bu her sunucuda farklıdır, bu yüzden diğer cevaplar bazı insanlar için işe yaramazsa, belki de bu olacaktır. İşte rsync komutunun uzak tarafında kullandığım başarılı kod:'user@host.tld:"/path/to/dest/some\ dir/"'
purefusion

Şimdi soruyu yalvarıyor, BU neden çalışıyor (sunucumda), ancak diğer seçeneklerden hiçbiri (sadece yolu çift tırnak içine almak veya üçlü ters eğik çizgiler kullanarak) çalışmıyor? Önemliyse CentOS 5 kullanıyorum.
purefusion

Bu gerekli olmamalı. Nasıl koşuyorsun? Eğer kullanarak çalıştırıyor musunuz evalbelki bir işleve veya çağrı yoluyla?
Mikel

Tek artı çift tırnak kullanmıyorsunuz. Tek tırnak artı çift tırnak artı ters eğik çizgi kaçışlarını kullanıyorsunuz. ÜÇ seviye alıntı. Bu gereksiz olmalı. Tekrar soruyorum: Nasıl çalıştırıyorsunuz ?
Mikel

@Javier "Bunun neden yapıldığına dair hiçbir fikrim yok". Muhtemelen tilde genişleme çalışır.
Mikel

2

Söylediğin zaman doğru yoldaydın:

Aynı komutu dener ve yerel bash istemini aşmak ve uzak sunucu için ters eğik çizgiyi korumak için ters eğik çizgi ve boşluktan kaçarsam

İşte bunu yapmanın en kolay yolu:

rsync -av dir\ with\ spaces/ server.tld:"dir\ with\ spaces"

ve bu şekilde de işe yarıyor.

rsync -av dir\ with\ spaces/ server.tld:dir\\\ with\\\ spaces

Kesin çıktıyı ve gördüğünüz hataları gönderebilir misiniz?

rsyncHer iki tarafta bir sarıcı komut dosyası ile değiştirebilir misiniz ?

$ sudo su -
# cd /usr/bin
# mv rsync rsync.real
# cat <<'EOF' >rsync
#!/bin/bash
logfile=/home/yourname/rsync.log
date >> "$logfile"
i=1
for arg in "$@"; do
    echo "arg $i: $arg" >> "$logfile"
    i=$((i+1))
done

rsync.real "$@"
EOF
# chmod +x rsync

Sonra rsync'inizi tekrar çalıştırın ve bu kaçış yolunun işe yaradığını kanıtlamalıdır, örn.

Müşteri tarafı:

Sun Feb 13 13:48:12 EST 2011
1: -av
2: dir with spaces/
3: server:dir\ with\ spaces

Sunucu tarafı:

Sun Feb 13 13:48:13 EST 2011
1: --server
2: -vlogDtpre.iL
3: .
4: dir with spaces

Yukarıdaki örnekte, sunucu ( dir with spaces) üzerindeki 4. bağımsız değişkenin bir satırda olması, teklifin doğru çalıştığını söylüyor.

Bu işe yaramazsa, yeniden çalıştırmayı deneyin rsync -vveya rsync -vv, veya rsync -vvv. Size ekstra hata ayıklama bilgileri verecektir.

Diğer iki aptalca öneri:

  • diğer sunucu bir Linux sunucusu ve varsayılan kabuğunuz nedir?
    • belki dosya adlarını beklediğinizden farklı genişletiyor olabilir
  • -aveya -rseçeneğini eklemeyi unuttunuz mu?
    • Çıktınızı görmeden söyleyemem

Sorunun ayrıntılarında belirtildiği gibi, ilk iki yönteminizi de denedim. Belki de sunucumda çalışmıyorlar. Ben de sarıcı komut dosyaları ile uğraşmak gibi hissetmedim. / Usr / bin / 'i hacklemekten uzak durmaya çalışıyorum ... Her durumda, alıntı yapmanın başka bir yolu gerçekten benim için işe yaradı, bu yüzden belki de bu şekilde hareket eden sadece sunucum. Sonuç olarak, işletim sistemi sorunun bir parçasıysa, önerileriniz kesinlikle diğer sunuculardaki veya CentOS çalıştırmayan kişiler için geçerli olabilir.
purefusion

Peki, çalışmasını sağlamak için nasıl teklif ettin?
Mikel

Bazı hayati ayrıntıları dışarıda bırakıyorsunuz. Lütfen çalıştırdığınız gerçek komutu eksiksiz olarak gönderin.
Mikel

2

Nokta cevap:

-S kullanın (argümanları koruyun) ve yolunuzu tırnak içine alın:

rsync -savz user@server:"/my path with spaces/another dir/" "/my destination/"

Hem boşluk hem de tire ile çalışır.


Teşekkürler! Bu, bir geçici çözüm yerine uygun bir çözümdür.
m000

-2

Yolunuzu tırnak içine alabilirsiniz.


1
Sorunun ayrıntılarında gördüğünüz gibi, gerçekten de bunu denedim. Bununla birlikte, başka bir cevap özel teklif kullanımını önerdi ve bu gerçekten işe yaradı. :)
purefusion

İKİ tırnak ve ters eğik çizgi gerekir.
Sridhar Sarnobat
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.