एक पंक्ति में सर्वरों के बीच संरक्षित फ़ाइलों की नकल करना?


13

मैं squid.confएक सर्वर से दूसरे में कॉपी करना चाहता हूं ।

  • सर्वर एक दूसरे से बात नहीं करते हैं। मैं अपने वर्कस्टेशन से जाना चाहूंगा।
  • दोनों सर्वरों में फ़ाइल है, इसलिए यह लक्ष्य पर ओवरराइट किया जाएगा।
  • फ़ाइलों की 600अनुमति है और रूट के स्वामित्व में हैं।
  • ssh के माध्यम से रूट लॉगिन अक्षम है ( PermitRootLogin no)।
  • मैं इसे एक पंक्ति में करना चाहूंगा, यदि संभव हो तो, क्योंकि यह एक सेटअप गाइड का एक हिस्सा होगा।

मैं करना जानता हूं

ssh source 'tar czpf - -C /etc/squid/ squid.conf' | \
    ssh target 'tar xzpf - -C /etc/squid/'

सर्वर के बीच फ़ाइलों को कॉपी करने और अनुमतियों को संरक्षित करने के लिए। हालाँकि, इस मामले में मुझे "अनुमति अस्वीकृत" मिल जाएगी।

मुझे यह भी पता है कि मैं यह कर सकता हूं:

ssh -t source 'sudo cat /etc/squid/squid.conf'

इस तरह -tसे फ़ाइल की सामग्री को आउटपुट करने से पहले sudo एडमिन पासवर्ड मांगता है।

समस्या यह है, मुझे नहीं पता कि उन तकनीकों को किस तरह से मिलाया जाए जो प्रत्येक सर्वर पर sudo पासवर्ड के लिए पूछें, और फ़ाइल को उसके गंतव्य पर स्थानांतरित करें। क्या यह संभव है?

अद्यतन : यहाँ सबसे अच्छा मैं के साथ आ सकता है:

ssh -t source 'sudo tar czf /tmp/squid.tgz -C /etc/squid squid.conf' && \
ssh source 'cat /tmp/squid.tgz' | \
    ssh target 'cat >/tmp/squid.tgz' && \
ssh -t source 'sudo rm /tmp/squid.tgz' && \
ssh -t target \
    'sudo tar xzf /tmp/squid.tgz -C /etc/squid && sudo rm /tmp/squid.tgz'

इसे वन-लाइनर कहना एक खिंचाव जैसा लगता है। मुझे लगता है कि मैं सेटअप गाइड में अलग-अलग चरणों में इसे तोड़ दूंगा।


जवाबों:


11

यह ssh के साथ ssh के साथ श्रृंखला ssh को sudo के साथ श्रृंखला ssh में आसान है। तो ssh सर्वर कॉन्फ़िगरेशन बदलना ठीक है, मैं सुझाव देता हूं कि प्रत्येक सर्वर के रूट के लिए ssh को खोला जाए, लेकिन केवल लोकलहोस्ट से। आप इसे एक Matchखंड के साथ कर सकते हैं sshd_config:

PermitRootLogin no
Match Host localhost
    PermitRootLogin yes

फिर आप दूरस्थ उपयोगकर्ता से स्थानीय उपयोगकर्ता और स्थानीय उपयोगकर्ता से रूट तक एक कुंजी-आधारित प्रमाणीकरण श्रृंखला स्थापित कर सकते हैं। आपके पास अभी भी एक प्रमाणीकरण मार्ग है, इसलिए आपके लॉग आपको बताते हैं कि कौन रूट के रूप में लॉग इन किया है, और प्रमाणीकरण चरण उसी तरह हैं जैसे कि sudo शामिल था।

सर्वर को रूट के रूप में कनेक्ट करने के लिए, ~/.ssh/configइस तरह से एक अन्य नाम परिभाषित करें:

Host server-root
HostName server.example.com
User root
ProxyCommand "ssh server.example.com nc %h %p"

यदि आप उपयोग करने पर जोर देते हैं sudo, तो मेरा मानना ​​है कि आपको अलग-अलग कमांडों की आवश्यकता होगी, क्योंकि sudoटर्मिनल से पढ़ने पर जोर देता है (भले ही आपके खाते का टिकट हो) your, और सामान्य फ़ाइल कॉपी करने के तरीकों में से कोई नहीं (scp, sftp, rsync) एक दूरस्थ टर्मिनल के साथ बातचीत का समर्थन।

Ssh और sudo के साथ चिपके हुए, आपके प्रस्तावित आदेशों को सरल बनाया जा सकता है। प्रत्येक तरफ, यदि आपने एक पासवर्ड दोबारा पूछने के लिए नहीं कहा है, तो आप इसे पासवर्ड की आवश्यकता और दूसरी बार फाइल कॉपी करने के लिए एक बार चला सकते हैं। (आप आसानी से फ़ाइल को सीधे कॉपी नहीं कर सकते क्योंकि पासवर्ड प्रॉम्प्ट रास्ते में हो जाता है।)

ssh -t source 'sudo true'
ssh -t target 'sudo true'
ssh -t source 'sudo cat squid.conf' |
ssh -t target 'sudo tee /etc/squid/squid.conf'

¹ जब तक आप है NOPASSWD, लेकिन फिर आप इस पूछ नहीं होगा।


पहला समाधान मेरे लिए अच्छी तरह से काम किया लेकिन दूसरी पंक्ति होनी चाहिए Match host localhost
cduck

4

आप sudoपासवर्ड अगले तरीके से नहीं पूछने के लिए सेट कर सकते हैं:

स्रोत पर:

user    ALL=NOPASSWD:/bin/cat

निशाने पर:

user    ALL=NOPASSWD:/usr/bin/tee

और युर मशीन पर करें:

ssh source 'sudo cat /test' | ssh target 'sudo tee /test'

लेकिन मैं कठपुतली की तरह कुछ का उपयोग करने की सलाह देता हूं । यह बहुत बेहतर और आसान है आपकी समस्या को कॉन्फिगरेशन फाइल डिस्ट्रीब्यूशन के साथ हल करता है।

पुनश्च। वैसे, यदि आप sudoउपयोगकर्ता से पासवर्ड पूछने के लिए सेट करेंगे , तो स्ट्रिंग के साथ [sudo] password for userलक्ष्य फ़ाइल में दिखाई देगा।


कठपुतली का सुझाव देने के लिए +1, लेकिन आपका समाधान असुरक्षित लगता है। मैं रूट के रूप में लॉगिंग की अनुमति दे सकता हूं।
14

2

Ssh का उपयोग करने के बजाय आप सर्वर के बीच फ़ाइल को स्थानांतरित करने के लिए scp का उपयोग कर सकते हैं।

लक्ष्य सर्वर में प्रवेश करें:

जहाँ आप फ़ाइल की प्रतिलिपि बनाना चाहते हैं, उसे लक्ष्य dir में बदलें।

#scp -r -p -P 22 root@source-ipaddress:/source-path-file-to-copy .

आर - पुनरावर्ती पी - मूल फ़ाइल से संशोधन समय, पहुंच समय और मोड को संरक्षित करता है


यह मानता है कि मैं रूट के रूप में लॉगिन कर सकता हूं, जिसे मैं नहीं कर सकता। प्रश्न का अद्यतन करना।
इसकी 13

2

Ssh कॉन्फ़िगरेशन को बदले बिना, आप दो ssh टनल होस्ट कर सकते हैं-> server1 और server2-> होस्ट ssh कनेक्शन के माध्यम से server2। मेजबान मशीन (समान पोर्ट) पर इन दो सुरंगों को कनेक्ट करें। और सर्वर 1 पर कनेक्टेड टनल से डेटा को पुनः प्राप्त करने के लिए और सर्वर 2 पर उन्हें बचाने के लिए सर्वर 2 पर sudo चलाएं।

ssh -L60000:${source}:22 -R60000:localhost:60000 -t ${target} 'sudo bash -c "ssh -p 60000 '$(whoami)'@localhost \"cd /path/to/dir; tar -czf - files\"|tar -C/path/to/target -xzf -"'

विचार यह है: 1- पोर्ट 60000 पर अपनी मशीन से स्रोत मशीन के लिए एक स्थानीय सुरंग बनाने के लिए

ssh -L60000:${source}:22

1 बी- अपनी मशीन तक वापस पहुंचने के लिए एक दूरस्थ सुरंग बनाएं

-R60000:localhost:60000

2- लक्ष्य मशीन से कनेक्ट

-t ${target}

3- लेखन के लिए सभी को लक्ष्य मशीन पर रूट के रूप में चलाएं

'sudo bash -c "..."'

4- सुरंग के माध्यम से स्रोत मशीन से कनेक्ट करें। whoami और localhost पर लोकलहोस्ट का अर्थ $ {लक्ष्य} मशीन पर है।

ssh -p 60000 '$(whoami)'@localhost

5- दूरस्थ फ़ाइल (ओं) को पैकेज करें और इसे stdout में ज़िपित करें

cd /path/to/dir; tar -czf - file

6- स्टडआउट के माध्यम से पैकेज प्राप्त करें और / पाथ / टू / टारगेट डायरेक्टरी के अनुसार फाइल निकालें

|tar -C/path/to/target -xzf -

नोट: आपको 3 sshkey पुष्टिकरण और 3 पासवर्ड अनुरोध प्राप्त हो सकते हैं। लेकिन फाइलों को कॉपी किया जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.