Jalankan rsync dengan izin root pada mesin jarak jauh


29

Saya ingin menyinkronkan folder dari mesin saya dengan folder di mesin jarak jauh. Folder jarak jauh hanya dapat dimanipulasi oleh root. Saya memiliki akun di mesin jarak jauh yang dapat digunakan sudo. Bagaimana saya bisa menjalankan rsync sehingga memiliki izin root pada mesin remote?

Saya sudah mencoba yang berikut ini:

rsync -avz -e ssh /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder --delete --rsync-path="sudo rsync"

Tapi (setelah memasukkan kata sandi saya) saya mendapatkan kesalahan berikut:

sudo: no tty present and no askpass program specified

Tidak bisakah Anda mengubah izin pada folder jarak jauh sehingga pengguna Anda memiliki akses tulis ke sana?
Phil

1
Sayangnya itu bukan pilihan.
Peter

Jauh lebih baik untuk memeriksa jawaban pada pertanyaan yang sama di Unix SE unix.stackexchange.com/questions/92123/… .
ndemou

Jawaban:


11

Ini adalah solusi yang saya buat:

rsync -R -avz -e ssh --rsync-path="echo mypassword | sudo -S  mkdir -p /remote/lovely/folder && sudo rsync" /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder --delete

Sedikit misi!


9
Saya harap Anda mengenali kata sandi Anda akan terlihat di baris perintah. Itu harus terlihat untuk jangka waktu rsync berjalan.
BillThor

1
di mana kata sandi terlihat? Hanya di kotak lokal di baris perintah? Atau apakah pendekatan ini juga menciptakan kerentanan jarak jauh? Saya mencoba memahami jawaban di atas dan konsekuensi dari menggunakan solusi ini. Saya mengajukan pertanyaan di sini: superuser.com/questions/398146/…
MountainX

@MountainX Ini akan terlihat dalam daftar proses (misalnya ps aux). Uji:, rsync -R -avz -e ssh --rsync-path="find / > /dev/null && rsync" server.example.com:/ /tmp/examplelalu buka terminal pada mesin jarak jauh dan ps aux | grep find. find /digunakan hanya karena itu adalah hal pertama yang terlintas di pikiran saya dengan durasi eksekusi yang besar.
Ivan Vučica

1
Saya tahu ini sudah tua tetapi, Jika Anda ingin menghindari kata sandi dalam perintah, Anda dapat menggunakan kunci untuk ssh dan pada mesin jarak jauh tambahkan pengguna Anda ke file sudoers dengan NOPASSWD: SEMUA bendera. Lihat jawaban peringkat tertinggi di tautan berikut. CATATAN: Ini bukan jawaban yang diterima: askubuntu.com/questions/147241/execute-sudo-without-password
Dave

11

Coba solusi ini. Di file sudoers Anda ( /etc/sudoers) atur pengguna Anda seperti ini:

username ALL= NOPASSWD:/usr/bin/rsync

yang NOPASSWD:/usr/bin/rsyncmengatakan sudobahwa ketika pengguna Anda berjalan /usr/bin/rsyncatau hanya rsyncyang ada password yang dibutuhkan.

Maka aslinya Anda --rsync-path="sudo rsync"harus bekerja.


Saya menggunakan opsi sudo rsync tanpa menetapkan nama pengguna ALL ... setelah rsync selesai. pada remote ketika saya mencoba untuk cd atau ls. Saya mendapat izin ditolak. meskipun saya root. saya harus sudo ke ls. tetapi dalam kasus cd itu bahkan tidak mungkin. Saya mencoba mengenali semua direktori dan file. masih tidak bekerja. Adakah yang tahu alasannya dan bagaimana cara memperbaikinya?
Titik koma yang ditakuti

2
Anda juga harus mengatakan bagaimana cara mengedit file sudoers
Jonathan

1
Silakan lihat unix.stackexchange.com/a/92397/128237 untuk implikasi keamanan dari perbaikan ini.
BrainStorm.exe

10

Solusi di blog ini bekerja sangat baik untuk saya: http://www.pplux.com/2009/02/07/rsync-root-and-sudo/ .

Pada dasarnya:

stty -echo; ssh myUser@REMOTE_SERVER "sudo -v"; stty echo  
rsync -avze ssh --rsync-path='sudo rsync' myUser@REMOTE_SERVER:/REMOTE_PATH/ LOCAL_PATH 

Baris pertama memungkinkan entri kata sandi interaktif, tanpa menunjukkan kata sandi di layar. Bekerja sangat bagus untuk saya di Ubuntu 9.04.


1
Hal ini memerlukan opsi tty_tickets menjadi diset: !tty_tickets.
blueyed

2
Bagaimana kalau ssh -t [other options]bukannya bermain-main stty -echo?
Ivan Vučica

Saya kasus saya, saya sudah tidak diatur: tty_ticketslagi pula ... jadi saya dapat mencoba pendekatan ini.
MountainX

1
sudo: no tty present and no askpass program specified
Michael

Bagaimana cara menghapus tty_tickets? Di mesin mana? Selama perintah rsync ini?
Jonathan

4

Anda memerlukan metode untuk memasok kata sandi sudo. Suatu askpassprogram dirancang untuk meminta kata sandi ketika mekanisme normal tidak tersedia. Menyiapkan sudountuk tidak memerlukan kata sandi untuk dijalankan rsynckarena userid Anda adalah salah satu opsi.

Saya biasanya mengkonfigurasi login berbasis kunci dengan batasan yang tepat untuk kasus-kasus seperti ini. Jika Anda mengonfigurasi kunci terbatas yang hanya dijalankan rsyncsebagai root, hal semacam ini akan lebih mudah dilakukan. Alternatif lain adalah dengan menggunakan rsycndproses untuk menangani permintaan terpencil. Konfigurasi menyediakan berbagai batasan yang dapat diterapkan.

EDIT: Saya menyertakan skrip untuk menyiapkan kunci untuk kehilangan berbasis kunci di bagian Membuat Userids pada Klien dari posting saya tentang Menyiapkan BackupPC di Linux . Lihat juga dokumentasi untuk ssh_config yang merinci beberapa hal yang dapat Anda lakukan dengan membatasi penggunaan kunci seperti yang ditunjukkan dalam skrip.


Terima kasih atas bantuan Anda, tetapi saya menemukan solusi yang berfungsi lebih baik untuk saya.
Peter

ada detail tentang login berbasis key?
TheVillageIdiot


2

Saya kagum dengan kompleksitas jawaban yang ada. Ini jauh lebih mudah dan nyaman untuk mengkonfigurasi sistem Anda (PC Anda dan remote host) sehingga Anda dapat terhubung sebagai root ke host remote tanpa menggunakan password. Dan tidak seperti kelihatannya itu aman juga .

  1. Pada host jarak jauh pastikan / etc / ssh / sshd_config memiliki baris ini "PermitRootLogin tanpa kata sandi" (dalam banyak distribusi itu ada di sana secara default). Ini memungkinkan root untuk mendapatkan shell ssh menggunakan metode otentikasi apa pun kecuali prompt kata sandi yang tidak aman.
  2. (Jika Anda belum tahu caranya) ikuti salah satu dari banyak tutorial tentang cara mendapatkan login tanpa kata sandi melalui ssh
  3. Gunakan rsync seperti yang biasa Anda lakukan dan tanpa diminta kata sandi.

Hanya saja jangan lupa bahwa selama baris di /root/.ssh/authorized_keys dari host jarak jauh ada mesin itu menerima perintah root dari PC Anda.


rrsync menggunakan pendekatan ini.
CODE-REaD

0

Inilah yang berfungsi untuk saya, mengingat saya ingin tetap menggunakan otentikasi kata sandi (jadi saya tidak ingin menggunakan NOPASSWDatau kunci) - di Ubuntu 14.04:

  • "Buka" sudopada mesin jarak jauh dengan menonaktifkan tty_ticketsmelalui file sementara di /etc/sudoers.d/(yang harus didukung di Debian, lihat /etc/sudoers.d/README), dan "Perbarui kredensial cache pengguna", yang "memperpanjang batas waktu sudo selama 15 menit"
  • Jalankan rsyncdengan sudoseperti yang ditunjukkan pada jawaban lain
  • "Tutup" sudopada mesin jarak jauh dengan menghapus file sementara /etc/sudoers.d/, yang mengaktifkan kembalitty_tickets

... atau, dengan baris perintah:

ssh -t $REMOTEPC 'echo "Defaults !tty_tickets" | sudo tee /etc/sudoers.d/temp; sudo -v'
rsync -aP -e 'ssh' '--rsync-path=sudo rsync' /etc/pulse/client.conf $REMOTEPC:/etc/pulse/client-copy.conf
ssh -t $REMOTEPC 'sudo rm -v /etc/sudoers.d/temp; sudo -v'

Ini adalah respons yang saya dapatkan ketika menjalankan perintah ini di komputer lokal:

$ ssh -t $REMOTEPC 'echo "Defaults !tty_tickets" | sudo tee /etc/sudoers.d/temp; sudo -v'
remoteuser@$REMOTEPC's password: 
[sudo] password for remoteuser: 
Defaults !tty_tickets
Connection to $REMOTEPC closed.

$ rsync -aP -e 'ssh' '--rsync-path=sudo rsync' /etc/pulse/client.conf $REMOTEPC:/etc/pulse/client-copy.conf
remoteuser@$REMOTEPC's password: 
sending incremental file list
client.conf
           1269 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=0/1)

$ ssh -t $REMOTEPC 'sudo rm -v /etc/sudoers.d/temp; sudo -v'
remoteuser@$REMOTEPC's password: 
removed ‘/etc/sudoers.d/temp’
[sudo] password for remoteuser: 
Connection to $REMOTEPC closed.

Catatan yang sudo -vharus dijalankan setelah setiap kali file masuk /etc/sudoers.d/, sehingga perubahan di dalamnya diterima.


0

Metode lain adalah untuk mengatasi pembatasan izin dengan memulai rsync pada mesin jarak jauh. Dari pada:

rsync /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder

Anda dapat melakukan:

ssh ubuntu@x.x.x.x 'rsync ubuntu@y.y.y.y:/home/ubuntu/my/lovely/folder /remote/lovely/folder'

Di mana y.y.y.yalamat IP mesin lokal Anda. Ini hanya berfungsi jika mesin lokal Anda dapat bertindak sebagai server SSH.


1
Hm ... bukankah Anda menyalin lokal ke jarak jauh di baris perintah pertama Anda - dan kemudian di baris perintah kedua, yang harus setara dengan yang pertama, menyalin jarak jauh ke lokal (yang tidak setara dengan yang pertama)?
sdaau

Aduh! Memperbaikinya.
Keith

0

Solusi saya adalah menambahkan --rsync-path="echo PASSWORD | sudo -Sv && sudo rsync"

contoh:

rsync -avz -e ssh /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder --delete --rsync-path="echo <PASSWORD> | sudo -Sv && sudo rsync"

Biasanya bukan ide yang baik untuk memasukkan kata sandi ke dalam baris perintah satu baris; mereka menjadi terlihat di pohon proses, misalnya. Terkadang saya mengganti kata sandi yang sebenarnya dalam jenis pernyataan ini dengan $ (cat my_password.txt) yang sedikit lebih baik

rsync -avz -e ssh /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder --delete --rsync-path="cat my_password.txt | sudo -Sv && sudo rsync"


Bisakah Anda memperluas ini dengan sedikit konteks dan penjelasan? "tambahkan" ke apa, di mana? Mengapa ini menyelesaikan masalah? Terima kasih.
fixer1234
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.