sudo के साथ रिमोट सर्वर पर scp


65

मेरे पास सर्वर A पर फ़ाइल है (जो NAT के पीछे है इसलिए सीधे संबोधित नहीं की जाती है)। रूट पर प्रतिबंधित डायरेक्टरी में फाइल को सर्वर बी में कॉपी किया जाना चाहिए। मेरा सर्वर B पर sudo विशेषाधिकार के साथ खाता है। Scp कमांड के लिए सिंटैक्स क्या है?



मैंने पुराने प्रश्न को इस के डुप्लिकेट के रूप में बंद कर दिया है, क्योंकि प्रश्न पूछने वाले ने उस प्रश्न के स्वामित्व को पुनः प्राप्त नहीं किया है।
क्वैक क्विक्सोट

मैंने एक और पोस्टिंग पर उत्तर दिया है कि आप कैसे स्कैप को अनुकूलित कर सकते हैं सीधे आपके लिए। यह WinSCP के समान है।
योयो

जवाबों:


58

सबसे पहले, आपको फ़ाइल को उस स्थान पर कॉपी करने की आवश्यकता है जहां आपके पास sudo के बिना लेखन है,

scp yourfile serverb:

फिर sudo का उपयोग करके फ़ाइल को स्थानांतरित करें

ssh serverb sudo mv yourfile /path/to/the/destination

यदि आपके पास एक लिखने योग्य स्थान नहीं है, तो अपने उपयोगकर्ता के लिए लिखित अनुमति के साथ एक अस्थायी डायर बनाएं।

ssh serverb sudo mkdir tempdir && sudo chmod 777 tempdir
scp yourfile serverb:tempdir
ssh serverb mv tempdir/yourfile /path/to/the/destination

7
/ tmp अस्थायी फ़ाइलों को लिखने के लिए एक अच्छी जगह है जो (आमतौर पर) सभी उपयोगकर्ताओं के पास होती है।
डग हैरिस

3
@ डग: ध्यान दें कि / tmp RAM या / बढ़ते बिंदु में हो सकता है, और जरूरी नहीं कि बड़ी फ़ाइलों को होस्ट करने के लिए पर्याप्त हो।
रावचोल

2
जो भी आप पूरा करने की कोशिश कर रहे हैं, chmod 777वह आमतौर पर करने का गलत तरीका है। विचार करें कि क्या हो सकता है अगर कोई अन्य व्यक्ति लॉग इन था और आपको पता था कि आप इस कोड को चलाने वाले हैं।
ट्रिपल

1
ssh sudoमेरे लिए काम नहीं करता है - शिकायत करता है "कोई tty मौजूद है और कोई askpass कार्यक्रम निर्दिष्ट नहीं है"?
रॉस प्रेसर

1
@RossPresser देर से जवाब के लिए खेद है, लेकिन आप या तो पासवर्ड रहित sudo सेटअप करने की जरूरत है serverbया आप ssh serverbअलग करने की जरूरत है , तो sudo ...लॉग इन करने के बाद।
जोहान

49

एससीपी के साथ, आपको दो चरणों में करना होगा, हालांकि, आप इसे निम्नानुसार rsync के साथ कर सकते हैं:

rsync --rsync-path="sudo rsync" <LOCALFILE> USER@SERVER2:/root

नोट: इसके लिए NOPASSWDsudo कॉन्फ़िगरेशन की आवश्यकता है। यदि आपको sudo के लिए पासवर्ड डालना है, तो दो चरण की आवश्यकता है।

निर्देशिका की प्रतिलिपि बनाने के लिए, आपको -rपैरामीटर जोड़ना होगा । और -vवर्बोज़ आउटपुट के लिए।


क्रेडेंशियल्स के साथ उपरोक्त विधि का उपयोग करने के लिए, आपको उन्हें अपनी ~/.ssh/configफ़ाइल में जोड़ना होगा , जैसे

Host SERVER2
  HostName server2.example.colm
  User USER
  #IdentityFile ~/.ssh/custom_key.pem

5
यह अब तक का सबसे सरल तरीका है।
मैट व्हाइट

sudo: sorry, you must have a tty to run sudoद्वारा तय की गई त्रुटि -e "ssh -tt"
mj41

@ mj41 -e "ssh -tt"मेरे साथ protocol version mismatch -- is your shell clean?। कैसे ठीक करने के लिए कोई संकेत?
कुल्हाड़ी।

19

आप इसके आसपास काम करने के लिए ssh और tar का उपयोग कर सकते हैं:

ssh -t host 'sudo -v'
ssh -C host 'cd /; sudo tar cf - path/to/file/or/dir' | tar xpsf - --preserve

यह पहले आपके sudo टाइमस्टैम्प को अपडेट करता है (यदि आवश्यक हो तो पासवर्ड की मांग की जाती है, जिसके लिए tty ( ssh -t) की आवश्यकता होती है ), और फिर सुडो का उपयोग टॉर्टबॉल को दूरस्थ रूप से बनाने और स्थानीय रूप से निकालने के लिए करता है।

RedHat 5 पर "टार" को "xpsf -" कमांड के बाद आने के लिए "--preserve" विकल्पों की आवश्यकता है।


बस एक नोट: यदि आप प्राप्त करते हैं tar: Invalid replacement string, तो -sइसे ठीक करने के लिए प्रतीत होता है में निकालना (यह सुनिश्चित नहीं है कि आपको sवैसे भी क्या चाहिए )। बहुत धन्यवाद; यह कमाल का है।
RecursivelyIronic

इसे tty_ticketsअक्षम करने की आवश्यकता होगी , सही?
जैकब बुडिन

@ जैकोबुडिन हाँ।
ब्लू '

4

उदाहरण के लिए, आप sudo कमांड के साथ sftp का उपयोग कर सकते हैं:

sftp -s 'sudo -u REMOTE_SUDO_USER /usr/libexec/openssh/sftp-server' REMOTE_USER@HOST

यह और rsync विधियाँ संभवतः इसे एक चरण में करने का सबसे प्रत्यक्ष तरीका है। यह दुर्भाग्यपूर्ण है कि चींटी में scp कार्य इसका समर्थन नहीं करता है। आप इसे sftp का उपयोग करने के लिए सेट कर सकते हैं, लेकिन आप दूरस्थ उप-प्रोग्राम को संशोधित नहीं कर सकते। ध्यान दें कि सर्वर के प्रकार (सोलारिस अलग हो सकता है) के आधार पर उप-कार्यक्रम अलग-अलग होगा।
योयो

0

यदि आपको हर बार sudo के लिए पासवर्ड टाइप करना है, तो आप इसे एक फ़ाइल में सहेज सकते हैं:

echo "Enter password: "; read -s password; echo $password > password_file

और फिर इसे स्रोत फ़ाइल के साथ भेजें।

cat password_file source_file | ssh remote_host 'sudo -S sponge target_file'

teeइसके बजाय आप उपयोग कर सकते हैं spongeयदि आपके पास अधिक थरथराहट नहीं है।


0

सबसे पहले, आपको फ़ाइल को उस स्थान पर कॉपी करने की आवश्यकता है जहां आपके पास सुडो के बिना लिखने की पहुंच है, आप निम्न दो चरण कर सकते हैं।

चरण 1: scp filename newserver

चरण 2: ssh newserver sudo mv filename /path/to/the/destination

अधिक जानकारी के लिए scp ट्यूटोरियल पढ़ें


-1
current server $ sudo scp username@server:source/path/filename /tmp/

यह विशिष्ट फ़ाइल को स्रोत से / tmp / करंट सर्वर में कॉपी करेगा


यह सुडो को स्थानीय रूप से निष्पादित करेगा, जिससे आपको दूर से कोई उन्नत विशेषाधिकार प्राप्त नहीं होंगे।
योयो

यह सिर्फ काम नहीं करेगा, जैसा कि @ वायो कहते हैं।
मणि

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