मैं sshfs पर सुडोल कैसे करूँ?


35

मेरे स्थानीय होस्ट पर मेरे alphaपास एक निर्देशिका है fooजिसे sshfs के माध्यम से होस्ट करने के लिए मैप किया bravoगया है:

$ sshfs charlie@bravo:/home/charlie ~/foo

हालाँकि, होस्ट पर bravoएक अन्य उपयोगकर्ता, डेल्टा है, जिसे मैं चाहता हूं sudo /bin/su, ताकि मैं काम कर सकूं bravo:/home/deltadeltassh के माध्यम से लॉग इन नहीं किया जा सकता है; जिन कारणों से मैं बदल नहीं सकता, आप मशीन पर एक बार डेल्टा के लिए केवल सूडो कर सकते हैं।

आम तौर पर मैं ssh में bravo, फिर डेल्टा के लिए ssh , लेकिन मैं सोच रहा था कि क्या कोई रास्ता है कि मैं ऐसा कर सकता हूं जब मुझे charlie के घर dir ssh के माध्यम से मुहिम शुरू करनी हो।


2
यह फ़ाइल अनुमतियों के साथ सबसे अच्छा हल हो सकता है।
आर्टिफ़ैक्स

जवाबों:


36

यह आपके द्वारा कनेक्ट किए जा रहे सर्वर के OS के आधार पर अलग-अलग होगा। सेंटो 5 के लिए आप sshfs माउंट विकल्पों में शामिल होंगे:

-o sftp_server="/usr/bin/sudo /usr/libexec/openssh/sftp-server"

उबंटू 9.10 के लिए (मुझे लगता है, 9.04 हो सकता है, लेकिन यह शायद दोनों के लिए समान है) या डेबियन आप जोड़ सकते हैं:

-o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server"

ओपनएसएसएच चलाने वाली अन्य प्रणालियों के लिए एक सही रास्ता खोजने के लिए

sudo grep Subsystem /etc/ssh/sshd_config

और sftp- सर्वर बाइनरी के स्थान की तलाश करें।

आपको sudo को NOPASS के साथ सेटअप करने की आवश्यकता हो सकती है: {sftp-server} का रास्ता या इसके साथ प्रचलित होना ssh user@host sudo -vताकि sudoइसके लिए अपडेटेड टाइमस्टैम्प हो notty। मेरे मामले में, मेरी दो आज्ञाएँ थीं:

ssh login_user@host sudo -v
sshfs login_user@host:remote_path local_path -o sftp_server="/usr/bin/sudo -u as_user /usr/lib/ssh/sftp-server"

1
धन्यवाद, यह बहुत साफ-सुथरी 'ट्रिक' है। मैंने अपनी स्थिति के लिए सूडो में "-u <some_other_user>" जोड़ा
jor

1
बहुत अच्छा, निर्दोष रूप से काम किया। मेरा एकमात्र बिंदु यह है कि उदाहरण में दो बार usr / bin / sudo है, जो अनावश्यक लगता है।
xaralis

1
@Craisis पुरानी पोस्ट लाने के लिए क्षमा करें, लेकिन मैं एक मूल उपयोगकर्ता के साथ एक CentOS 6.5 सर्वर में ssh करना चाहता हूं, लेकिन एक फ़ोल्डर माउंट करें जो केवल रूट एक्सेस हो। क्या यह सही होगा sshfs basicuser@remotehost:remote_path local_mount_path -o sftp_server="/usr/bin/sudo -u root /usr/libexec/openssh/sftp-server":?
डॉन रम्मी

1
ssh host sudo -vमेरे सूडो को खुश नहीं करता है - इससे पहले कि वह मुझे सूद देता है, यह एक ट्टी चाहता है। विचार?
w00t

1
@eggo @Sebi @calandoa @xaralis अगर मैं डेबियन 9 में रूट के रूप में सूडो करना चाहता हूं तो क्या यह कमांड काम करता है? क्योंकि अगर मैं उपयोग ssh -t myuser@host sudo -v sshfs myuser@host:remote_path local_path -o sftp_server="/usr/bin/sudo -u root /usr/lib/openssh/sftp-server"करता हूं: यह काम नहीं करता है: \ - यह सिर्फ कहता है "दूरस्थ होस्ट्स ने डिस्कनेक्ट कर दिया है"
user3450548

3

आप अन्य उपयोगकर्ता फ़ाइलों (यहां तक ​​कि रूट) तक पहुंचने के लिए bindfs + sshfs का उपयोग कर सकते हैं।

सबसे पहले आप अपने यूआईडी के साथ अपने 'रूट' या किसी अन्य निर्देशिका को यूपीड के साथ माउंट करते हैं।

ssh -t USER@SERVER "mkdir ~/tmproot; sudo bindfs --map=root/USER / ~/tmproot"

और फिर बस निर्देशिका में sshfs।

sshfs USER@SERVER:tmproot TARGET

लेकिन सुरक्षा के लिए यह बेहतर है /कि आप पूरे रूट का नक्शा न लें, बल्कि केवल उसी हिस्से का उपयोग करें जिसकी आपको जरूरत है। उदाहरण के लिए: आप किसी अन्य उपयोगकर्ता निर्देशिका को माउंट करने के लिए इस विधि का उपयोग कर सकते हैं, उदाहरण के लिए / var / www से ~ / www और अपने उपयोगकर्ता में रूट को रीमैप करें ताकि आपके पास इसकी पूरी पहुंच हो।

यदि आपको uid को संरक्षित करने या कई उपयोगकर्ताओं तक पहुंच की आवश्यकता है, तो मैं उदाहरण के लिए "rootfs" के लिए एक नया उपयोगकर्ता बनाऊंगा uid = 0 और / bin / false के साथ और एक सामान्य sshfs।


0

आप कोशिश कर सकते हैं (लेकिन मुझे नहीं लगता कि यह काम करेगा):

sshfs -o ssh_command='ssh sudo /bin/su bravo' charlie@bravo:/home/charlie ~/foo

मैं बहुत अच्छी तरह से sshfs को नहीं समझता, इसलिए आप काम करने के लिए ऐसा कुछ प्राप्त करने में सक्षम हो सकते हैं, लेकिन मैं यह नहीं कह सकता कि कैसे, और मुझे थोड़ा आश्चर्य होगा।

एक और संभावना ~ / .ssh / आरसी में कमांड 'sudo / bin / su bravo' डालने की है, लेकिन यह आपके सभी fs माउंटिंग (यह काम किया, जो मुझे भी संदेह है) के साथ ही ssh के आपके सामान्य उपयोग को प्रभावित करेगा। ।

एक डेबी डाउनर होने के लिए क्षमा करें।


0

कटौती करके, मुझे लगता है कि एक साधारण आदेश में इसे प्राप्त करना असंभव है।

ऐसा इसलिए है क्योंकि sshfs बिना किसी कमांड को पास किए ssh को कॉल करता है, लेकिन इसके बजाय, SFTP का उपयोग करता है जो SSH का सबसिस्टम है।

से sshfs मैनपेज:

दूरस्थ कंप्यूटर पर SSH के SFTP सबसिस्टम का उपयोग किया जाता है।

साथ ही , वर्तमान उपयोगकर्ता (या 'su' या 'sudo') को बदलना SFTP प्रोटोकॉल का हिस्सा नहीं है, हालांकि यह बहुत बार अनुरोधित सुविधा जैसा लगता है।


यह असंभव नहीं है। क्रैसिस का समाधान काम करता है।
जायें

बेशक, चूंकि वह उस आदेश को ओवरराइड करता है जो सबसिस्टम शुरू करता है और सूडो को जोड़ता है। अच्छी खोज लेकिन आपको पासवर्ड के बिना sudo सेट करना होगा (या टाइमस्टैम्प का उपयोग करना होगा), जिससे सुरक्षा कम हो सकती है। लेकिन मैं बहस नहीं करूंगा क्योंकि ओपी वास्तव में ऐसा करना चाहता था।
Weboide

0

शायद, फ़ाइल अनुमति के माध्यम से सबसे अच्छा तरीका है, जैसा कि @artifex का प्रस्ताव है।

जैसा @ Weboide कहता है, sshfs के माध्यम से यह असंभव है।

लेकिन मैं तुम्हें एक सरल स्क्रिप्ट बना सकते हैं, यह कॉल लगता है sudosshकि आपके ले जाएगा $PWD, यह करने के लिए कनवर्ट /home/delta/और के माध्यम से आदेश चला sshऔर sudoदूरस्थ मशीन पर।

कुछ इस तरह:

#!/usr/bin/env bash

ssh -t charlie@bravo "cd `pwd | sed 's/user\/foo/delta/'`; sudo -u delta $*"

उसके बाद आप sudossh commandरिश्तेदार पथ का उपयोग करने के लिए निष्पादित कर सकते हैं और याद रख सकते हैं।

यदि आप ssh-agent का उपयोग करते हैं, तो आपको अपना sudoपासवर्ड दर्ज करना होगा ।


0

मेरा समाधान गंभीर रूप से बदसूरत है (स्ट्रिंग भागने की कुछ परतों के लिए धन्यवाद), लेकिन यह इसके माध्यम sftp-serverसे से /etc/ssh/sshd_configऔर निष्पादित करने के लिए पथ पढ़ेगा sudo। अब अगर sshd_configस्थित नहीं है तो क्या होगा /etc/ssh? शायद के sshसाथ बाइनरी के अंदर खोज stringsऔर grep?

#!/bin/sh
sshfs -o sftp_server="/bin/sh -c \"sudo \`sed -n '/Subsystem\\\\\\\\s\\\\+sftp\\\\\\\\s\\\\+/{s///;p}' /etc/ssh/sshd_config\`\"" "$@"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.