दूरस्थ मशीन पर रूट अनुमति के साथ rsync चलाएँ


32

मैं दूरस्थ मशीन पर फ़ोल्डर के साथ अपनी मशीन से एक फ़ोल्डर सिंक करना चाहता हूं। दूरस्थ फ़ोल्डर केवल द्वारा हेरफेर किया जा सकता है root। मेरे पास रिमोट मशीन पर एक खाता है जो उपयोग कर सकता है sudo। मैं rsync को कैसे चला सकता हूं जैसे कि रिमोट मशीन पर इसकी रूट अनुमतियां हैं?

मैंने निम्नलिखित कोशिश की है:

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

लेकिन (अपना पासवर्ड दर्ज करने के बाद) मुझे निम्न त्रुटि मिलती है:

sudo: no tty present and no askpass program specified

क्या आप दूरस्थ फ़ोल्डर पर अनुमतियाँ नहीं बदल सकते हैं ताकि आपके उपयोगकर्ता ने उस तक पहुंच लिखी हो?
फिल

1
दुर्भाग्य से यह एक विकल्प नहीं है।
पीटर

यूनिक्स एसई unix.stackexchange.com/questions/92123/ ... पर एक ही प्रश्न पर उत्तर की जांच करना बेहतर है ।
ndemou

जवाबों:


12

इस समाधान की कोशिश करो। अपने sudoers फ़ाइल में ( /etc/sudoers) अपने उपयोगकर्ता को इस तरह सेट करें:

username ALL= NOPASSWD:/usr/bin/rsync

NOPASSWD:/usr/bin/rsyncबताता है sudoकि आपके उपयोगकर्ता चलता है जब /usr/bin/rsyncया सिर्फ rsyncयह है कि किसी पासवर्ड की आवश्यकता है।

फिर आपका मूल --rsync-path="sudo rsync"काम करना चाहिए।


मैंने उपयोगकर्ता नाम सब सेट किए बिना sudo rsync विकल्प का उपयोग किया ... rsync किए जाने के बाद। रिमोट पर जब मैं cd या ls की कोशिश करता हूं। मुझे अनुमति से वंचित कर दिया गया। हालांकि मैं जड़ हूं। मुझे ls में sudo करना है लेकिन सीडी के मामले में यह भी संभव नहीं है। मैंने सभी निर्देशिकाओं और फ़ाइलों को चेस करने की कोशिश की। अभी भी काम नहीं किया। किसी को भी इसका कारण पता है और इसे कैसे ठीक किया जाए?
अर्धविराम

2
आपको यह भी कहना चाहिए कि कैसे sudoers फ़ाइल को संपादित करें
जोनाथन

2
कृपया इस फिक्स के सुरक्षा निहितार्थ के लिए unix.stackexchange.com/a/92397/128237 देखें ।
ब्रेनस्टॉर्म

11

यह वह उपाय है जो मैं लेकर आया हूं:

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

एक मिशन के बिट!


12
मुझे उम्मीद है कि आप पहचान लेंगे कि आपका पासवर्ड कमांड लाइन में दिखाई देगा। यह उस समय की लंबाई के लिए दिखाई देना चाहिए जब rsync चल रहा हो।
BillThor

1
पासवर्ड कहाँ दिखाई दे रहा है कमांड लाइन में सिर्फ स्थानीय बॉक्स पर? या क्या यह दृष्टिकोण दूरस्थ कमजोरियों को भी पैदा करता है? मैं ऊपर दिए गए उत्तर और इस समाधान के उपयोग के प्रभाव को समझने की कोशिश कर रहा हूं। मैंने यहां एक सवाल पूछा: superuser.com/questions/398146/…
माउंटेनएक्स

@MountainX यह प्रक्रियाओं की सूची में दिखाई देगा (जैसे ps aux)। टेस्ट: rsync -R -avz -e ssh --rsync-path="find / > /dev/null && rsync" server.example.com:/ /tmp/example, तो रिमोट मशीन और पर खुला टर्मिनल ps aux | grep findfind /केवल इसका उपयोग किया जाता है क्योंकि यह पहली चीज है जो मेरे दिमाग में बड़ी निष्पादन अवधि के साथ आई थी।
इवान वुज़िका

1
मुझे पता है कि यह पुराना है, लेकिन, यदि आप कमांड में पासवर्ड से बचना चाहते हैं, तो आप ssh के लिए कुंजी का उपयोग कर सकते हैं और रिमोट मशीन पर NOPASSWD के साथ sudoers फ़ाइल में अपने उपयोगकर्ता को जोड़ सकते हैं: सभी ध्वज। निम्न लिंक पर उच्चतम रैंक उत्तर देखें। नोट: यह स्वीकृत उत्तर नहीं है: askubuntu.com/questions/147241/execute-sudo-without-password
Dave

10

इस ब्लॉग पर समाधान ने मेरे लिए बहुत अच्छा काम किया: http://www.pplux.com/2009/02/07/rsync-root-and-sudo/

मूल रूप से:

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

पहली पंक्ति स्क्रीन पर पासवर्ड दिखाए बिना, इंटरैक्टिव पासवर्ड प्रविष्टि की अनुमति देती है। Ubuntu 9.04 पर मेरे लिए बहुत अच्छा काम करता है।


1
इसके लिए tty_ticket विकल्प को परेशान होना चाहिए !tty_tickets:।
blueyed

2
कैसे ssh -t [other options]खेलने के बजाय के बारे में stty -echo?
इवान वुज़िका

मेरा मामला मैं पहले से ही परेशान है: tty_ticketsवैसे भी ... इसलिए मैं इस दृष्टिकोण की कोशिश कर सकता हूं।
MountainX

1
sudo: no tty present and no askpass program specified
माइकल

कैसे एक tty_ticket को परेशान करता है? किस मशीन पर? इस rsync कमांड के दौरान?
जोनाथन

4

पासवर्ड की आपूर्ति करने के लिए आपको एक विधि की आवश्यकता है sudoaskpassसामान्य तंत्र उपलब्ध नहीं होने पर एक प्रोग्राम को पासवर्ड के लिए पूछने के लिए डिज़ाइन किया गया है। की स्थापना sudoको चलाने के लिए पासवर्ड की आवश्यकता नहीं करने के लिए rsyncअपने उपयोगकर्ता आईडी के रूप में एक विकल्प है।

मैं आम तौर पर इस तरह के मामलों के लिए उचित प्रतिबंधों के साथ कुंजी आधारित लॉगिन को कॉन्फ़िगर करता हूं। यदि आप एक प्रतिबंधित कुंजी को कॉन्फ़िगर करते हैं जो केवल rsyncरूट के रूप में चलती है तो इस तरह की चीज़ को करना आसान हो जाता है। एक अन्य विकल्प rsycndरिमोट अनुरोधों को संभालने के लिए एक प्रक्रिया का उपयोग करना है। कॉन्फ़िगरेशन कई प्रकार के प्रतिबंध प्रदान करता है जिन्हें लागू किया जा सकता है।

संपादित करें: मैंने लिनक्स पर बैकअपपीसी स्थापित करने पर अपनी पोस्ट के क्लाइंट्स सेक्शन में उपयोगकर्ता बनाने की कुंजी आधारित सेटिंग के लिए एक स्क्रिप्ट को शामिल किया । Ssh_config के लिए डॉक्यूमेंटेशन भी देखें, जिसमें कुछ चीजें बताई गई हैं, जिन्हें आप स्क्रिप्ट में दिखाए अनुसार महत्वपूर्ण उपयोग को रोक सकते हैं।


आपकी मदद के लिए धन्यवाद, लेकिन मुझे एक समाधान मिला जो मेरे लिए बेहतर काम करता है।
पीटर

कीबेड लॉगिन के बारे में कोई विवरण?
TheVillageIdiot

3

रिमोट मशीन पर

sudo apt install ssh-askpass
which ssh-askpass

फिर स्थानीय मशीन पर

rsync -av -e 'ssh -X' --rsync-path='SUDO_ASKPASS=/usr/libexec/openssh/ssh-askpass sudo -A rsync' /some/local/path user@remote:/some/remote/path

रिमोट मशीन पर वास्तविक पथ के साथ ssh-askpass करने के लिए पथ

स्रोत: http://unix.bris.ac.uk/2015/08/04/rsync-between-two-hosts-using-sudo-and-a-password-prompt/


2

मैं मौजूदा उत्तरों की जटिलता से चकित हूं। यह अब तक एक पासवर्ड का उपयोग किए बिना आसान और सुविधाजनक आपके सिस्टम (अपने पीसी और दूरस्थ होस्ट) कॉन्फ़िगर करने के लिए इतना है कि आप रिमोट होस्ट को रूट के रूप में जुड़ सकते हैं। और इसके लुक के विपरीत यह सुरक्षित भी है

  1. दूरस्थ होस्ट पर सुनिश्चित करें कि / etc / ssh / sshd_config में यह रेखा "PermitRootLogin without-password" है (कई वितरणों में यह डिफ़ॉल्ट रूप से है)। यह रूट को असुरक्षित पासवर्ड प्रॉम्प्ट को छोड़कर किसी भी प्रमाणीकरण विधि का उपयोग करके ssh शेल प्राप्त करने की अनुमति देता है ।
  2. (यदि आप पहले से ही नहीं जानते हैं) ssh के माध्यम से पासवर्ड रहित लॉगिन प्राप्त करने के बारे में कई ट्यूटोरियल का पालन करें
  3. Rsync का उपयोग करें जैसा कि आप सामान्य रूप से करते हैं और बिना किसी पासवर्ड संकेत के करते हैं।

बस यह मत भूलो कि जब तक रिमोट होस्ट के /root/.ssh/authorized_keys में लाइन है, तब तक मशीन आपके पीसी से रूट कमांड को स्वीकार करती है।


rrsync इस दृष्टिकोण का उपयोग करता है।
CODE-REaD

0

यहाँ मेरे लिए काम किया गया है, यह देखते हुए कि मैं पासवर्ड प्रमाणीकरण रखना चाहता हूं (इसलिए मैं NOPASSWDउबंटू या कुंजियों का उपयोग नहीं करना चाहता ) - Ubuntu 14.04 पर:

  • sudoरिमोट मशीन पर "ओपन अप" tty_ticketsएक अस्थायी फ़ाइल के माध्यम से अक्षम करके /etc/sudoers.d/(जिसे डेबियन पर समर्थित होना चाहिए, देखें /etc/sudoers.d/README), और "उपयोगकर्ता के कैश्ड क्रेडेंशियल्स को अपडेट करें", जो "एक और 15 मिनट के लिए सूडो टाइमआउट को बढ़ाता है"
  • भागो rsyncके साथ sudoके रूप में अन्य उत्तर में दिखाया गया है
  • sudoमें अस्थायी फ़ाइल को हटाकर रिमोट मशीन पर "बंद करें" /etc/sudoers.d/, जो फिर से सक्षम करता हैtty_tickets

... या, कमांड लाइनों के साथ:

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'

स्थानीय मशीन पर इन कमांड को चलाने पर मुझे जो प्रतिक्रियाएं मिलती हैं:

$ 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.

ध्यान दें कि sudo -vहर बार फ़ाइलों के बाद चलना चाहिए /etc/sudoers.d/, इसलिए उसमें परिवर्तन स्वीकार किए जाते हैं।


0

एक अन्य विधि दूरस्थ मशीन पर rsync आरंभ करके अनुमतियों के प्रतिबंध के आसपास है। के बजाय:

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

तुम कर सकते हो:

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

y.y.y.yआपके स्थानीय मशीन का IP पता कहां है। यह केवल तभी काम करता है जब आपकी स्थानीय मशीन SSH सर्वर के रूप में कार्य कर सकती है।


1
हम्म ... क्या आप अपनी पहली कमांड लाइन में रिमोट की लोकल कॉपी नहीं कर रहे हैं - और फिर दूसरी कमांड लाइन में, जो पहले के बराबर होनी चाहिए, रिमोट को लोकल में कॉपी करना (जो पहले के बराबर नहीं है)?
साडाऊ

ओह! ठीक कर दिया।
कीथ

0

मेरा कार्यस्थल जोड़ना है --rsync-path="echo PASSWORD | sudo -Sv && sudo rsync"

उदाहरण:

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"

यह आमतौर पर एक कमांड लाइन वन-लाइनर में पासवर्ड डालने के लिए एक अच्छा विचार नहीं है; उदाहरण के लिए, वे प्रक्रिया पेड़ में दिखाई देते हैं। मैं कभी-कभी इस तरह के बयान में वास्तविक पासवर्ड को $ (बिल्ली my_password.txt) से बदल देता हूं जो थोड़ा बेहतर है

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"


क्या आप थोड़ा संदर्भ और स्पष्टीकरण के साथ इस पर विस्तार कर सकते हैं? "जोड़ें" क्या, कहाँ? यह समस्या का समाधान क्यों करता है? धन्यवाद।
फिक्सर 1234
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.