Saat menggunakan SSH untuk menghubungkan rsync ke server jauh, bagaimana Anda keluar dari ruang dan semacamnya di jalur jauh? Garis miring terbalik sederhana keluar dari ruang untuk bash prompt lokal, tetapi pada mesin jarak jauh ruang tersebut kemudian dibaca sebagai istirahat di jalan, sehingga menandai ujung jalan itu.
Jadi ketika saya melakukan rsync -avz /path/to/source/some\ dir/ [email protected]:/path/to/dest/some\ dir/
apa yang terjadi adalah bahwa server jauh membaca itu sebagai adil /path/to/dest/some/
dan karena itu tidak dapat menemukan tujuan itu dari jarak jauh, karena tujuan sebenarnya adalah "beberapa dir" daripada hanya "beberapa".
Jika saya mencoba perintah yang sama dan menghindari backslash dan ruang untuk melewati bash prompt lokal dan mempertahankan backslash untuk server jarak jauh (total tiga backslash:) /path/to/dest/some\\\ dir/
, ia memang mengirim backslash ke server jarak jauh, tetapi server jarak jauh kemudian menginterpretasikan path sebagai /path/to/dest/some\/
daripada /path/to/dest/some\ dir/
masih mengupas ruang dan karakter setelahnya.
Jika saya mencoba untuk membungkus jalan dengan tanda kutip, itu berperilaku cukup banyak dengan cara yang sama, secara efektif memotong jalan di luar angkasa. Jadi itu juga hanya berfungsi untuk melewati bash prompt lokal.
Awalnya saya menggunakan jalur yang memiliki segmen "-" (space-hyphen-space) di dalamnya, dan server jarak jauh mengembalikan kesalahan rsync: on remote machine: -: unknown option
yang merupakan apa yang memulai seluruh upaya pelarian-ruang ini sejak awal.
Jadi apa yang harus saya lakukan untuk mendapatkan ini berfungsi dengan baik dengan server jauh, tanpa harus menghapus spasi atau karakter salah lainnya seperti tanda hubung dari jalur jauh?
-s
alamat masalah tanpa perlu untuk menerapkan double-melarikan diri secara manual.Jawaban:
Pada mesin inisiator,
rsync
membangun sebuah baris perintah yang memanggil target rsync pada mesin jarak jauh, kemudian mengirimkan baris perintah itu menggunakan ssh .... sebagai string tunggal . String tunggal itu diteruskan ke shell untuk diuraikan, dibagi menjadi argumen dan dieksekusirsync
. Saya tidak tahu mengapa itu dilakukan, alih-alih mengemas argumen (sudah dibelah, diperluas dan tidak dikutip) dalam beberapa wadah biner-aman ke rsync jarak jauh.Itu berarti bahwa argumen Anda akan diuraikan oleh dua shell yang berbeda, kutip dan kutip kembali sesuai. Biasanya, saya membungkus setiap argumen dengan tanda kutip ganda, dan kemudian seluruh ekspresi pada tanda kutip tunggal. terkadang itu tidak cukup, atau bisa rumit jika Anda ingin ekspresi yang sama digunakan secara lokal dan jarak jauh.
Dalam kasus itu, saya biasanya mengatur beberapa tautan lunak dengan nama ASCII sederhana, tanpa spasi, semua, dan menggunakannya.
sumber
'[email protected]:"/path/to/dest/some\ dir/"'
eval
atau melalui panggilan ke suatu fungsi mungkin?Anda berada di jalur yang benar ketika Anda mengatakan:
Inilah cara yang menurut saya paling mudah untuk dilakukan:
dan cara ini juga berfungsi.
Bisakah Anda memposting output yang tepat dan kesalahan yang Anda lihat?
Bisakah Anda mengganti
rsync
di kedua sisi dengan skrip pembungkus?Kemudian jalankan rsync Anda lagi, dan harus membuktikan bahwa cara melarikan diri ini berfungsi, misalnya
Sisi klien:
Sisi server:
Dalam contoh di atas, fakta bahwa argumen ke-4 di server (
dir with spaces
) semuanya dalam satu baris mengatakan bahwa kutipan bekerja dengan benar.Jika ini tidak membantu, coba jalankan kembali
rsync -v
, ataursync -vv
, ataursync -vvv
. Ini akan memberi Anda informasi debug tambahan.Dua saran konyol lainnya:
-a
atau-r
?sumber
Intinya jawaban:
Gunakan -s (protect args) dan lampirkan path Anda dalam tanda kutip:
rsync -savz user@server:"/my path with spaces/another dir/" "/my destination/"
Bekerja dengan spasi atau garis putus-putus.
sumber
Anda bisa menyertakan path Anda dalam tanda kutip.
sumber