कैसे स्थानीय निर्देशिका माउंट करने के लिए sshfs की तरह?


22

मुझे पता है कि sshfs का उपयोग दूरस्थ निर्देशिका को स्थानीय करने के लिए किया जाता है, लेकिन मुझे स्थानीय निर्देशिका को दूरस्थ fs पर माउंट करने की आवश्यकता है।

मैं एक स्थानीय फ़ोल्डर माउंट करना चाहूंगा जैसे:

/home/username/project_directory

एक दूरस्थ मशीन, जिस पर मेरी पहुंच है, जैसे:

/var/www/project_directory

लक्ष्य यह है कि स्थानीय रूप से किए गए संपादन दूरस्थ फाइल सिस्टम पर परिलक्षित होते हैं।


@ यह काम कर समाधान है?
कोंगा राजू

हाँ, मैं इसे वर्तमान में उपयोग कर रहा हूँ, ठीक काम करने लगता है
quinn

दरअसल, मेरे पास एक मुद्दा है: superuser.com/questions/743316/…
quinn

@ आपको उत्तर के रूप में उस ब्लॉग में समाधान पोस्ट करना चाहिए। इससे मेरा काम बनता है।
ब्रिस्मथ

जवाबों:


18

से: http://mysteriousswede.blogspot.com/2012/01/mount-local-directory-to-server-.html

यह कैसे करना है? आपने अपने स्थानीय मशीन पर पोर्ट 22 पर लॉग ऑन करने वाली मशीन पर पोर्ट 10000 का उपयोग करके ssh अग्रेषण सेट किया और दूसरी तरफ माउंट करने के लिए sshfs का उपयोग करें।

F.ex. माउंट / घर / उपयोगकर्ता नाम / mywwwdevelstuff अपने स्थानीय मशीन पर / var / www सर्वर की ओर करने के लिए:

localusername@localmachine: ssh username@server -R 10000:localmachine:22
username@server: cd /var
username@server: sshfs -p 10000 -o idmap=user,nonempty \
                 localusername@127.0.0.1:~/mywwwdevelstuff www

2
यह उल्लेखनीय है कि स्थानीय मशीन को ssh सर्वर चलाना चाहिए।
जीन कार्लो मचाडो

3

नहीं।

इस "सभी" को करने के लिए आपको अपने तर्क को उलटने की जरूरत है। उदाहरण के लिए, आप 1 लाइनर सेट कर सकते हैं, जो रिमोट मशीन में ssh होगा और फिर sshfs का उपयोग करके उस बॉक्स पर स्थानीय मशीन पर दूरस्थ निर्देशिका को माउंट करेगा। बेशक नैट, फ़ायरवॉल नियमों आदि के साथ यह सरल हो सकता है, लेकिन आपने अपने उपयोग के मामले का वर्णन नहीं किया है।

एसएमबी जैसे और भी प्रोटोकॉल हैं, और भी बेहतर, एनएफएस - लेकिन वे समान मुद्दों को भुगतेंगे।

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


1
मैं नहीं जानता कि आप क्या कहना चाह रहे हैं। मुझे लगता है कि प्रश्न के उद्देश्य के लिए आप सुरक्षित रूप से यह मान सकते हैं कि सर्वर / ग्राहक SSH के माध्यम से एक दूसरे पर कुंजी के साथ लॉग इन कर सकते हैं, अर्थात एक दूसरे पर भरोसा कर सकते हैं। जिस तरह से मैं प्रश्न को समझता हूं (और मुझे भी समस्या है) यह है कि क्लाइंट से एक SSH कनेक्शन (डायनेमिक आईपी, NAT के पीछे जो एक डायनेमिक आईपी है, या संभवतः और भी भयानक मामले हैं) से (स्थायी रूप से सुलभ) सर्वर पर दूसरे रास्ते से बहुत आसान है।
कोई भी

1

@ कोई भी स्क्रिप्ट के आधार पर, मैंने इसे कुछ उपयोगी टिप्पणी के साथ सामान्यीकृत किया। नीचे मेरी स्क्रिप्ट है।

https://gist.github.com/allenyllee/ddf9be045810572cd809ae3587a23658

#!/bin/bash

##/*
## * @Author: AllenYL 
## * @Date: 2017-11-08 11:37:31 
## * @Last Modified by:   allen7575@gmail.com 
## * @Last Modified time: 2017-11-08 11:37:31 
## */

#
# mount local directory to remote through reverse sshfs
# 
# usage:
#       ./reverse_sshfs.sh [remote_addr] [remote_ssh_port] [remote_user] [local_dir]
# 
# [local_dir] is a path relative to this script
# 
# This script will automatcally create a directory named "project_$LOCAL_USER" in remote user's home dir,
# and mount [local_dir] to this point. When exit, will umount "project_$LOCAL_USER" and deleted it.
# 

##
## linux - how to mount local directory to remote like sshfs? - Super User 
## https://superuser.com/questions/616182/how-to-mount-local-directory-to-remote-like-sshfs
##

# source directory of this script
SOURCE_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

LOCAL_USER=$(whoami)
REMOTE_USER="$3"

LOCAL_DIR="$SOURCE_DIR/$4"
REMOTE_DIR="./project_$LOCAL_USER"

LOCAL_ADDR="localhost"
REMOTE_ADDR="$1"

LOCAL_PORT="22"
FORWARD_PORT="10000"
REMOTE_PORT="$2"

LOCAL_SSH="-p $FORWARD_PORT $LOCAL_USER@$LOCAL_ADDR"
REMOTE_SSH="-p $REMOTE_PORT $REMOTE_USER@$REMOTE_ADDR"

SSHFS_OPTION="-o NoHostAuthenticationForLocalhost=yes"

###############
## With ssh, how can you run a command on the remote machine without exiting? - Super User 
## https://superuser.com/questions/261617/with-ssh-how-can-you-run-a-command-on-the-remote-machine-without-exiting
##
## Here I use -t to force the allocation of a pseudo-terminal, which is required for an interactive shell. 
## Then I execute two commands on the server: first the thing I wanted to do prior to opening the interactive shell 
## (in my case, changing directory to a specific folder), and then the interactive shell itself. 
## bash sees that it has a pseudo-terminal and responds interactively.
##
###############
## Why does an SSH remote command get fewer environment variables then when run manually? - Stack Overflow 
## https://stackoverflow.com/questions/216202/why-does-an-ssh-remote-command-get-fewer-environment-variables-then-when-run-man
##
## sourcing the profile before running the command
## ssh user@host "source /etc/profile; /path/script.sh"
##
## usage:
##      ssh -t -p 88 root@10.1.53.168 -R 10000:localhost:22 \
##      "source /etc/profile; sshfs  -p 10000 allenyllee@localhost:/media/allenyllee/Project/Project/server_setup/nvidia_docker/project ./project2;bash"
## options:
##       -v Verbose 
##       -X X11 forwarding
##       -t pseudo-terminal for an interactive shell
##
ssh -X -t $REMOTE_SSH -R $FORWARD_PORT:localhost:$LOCAL_PORT \
"source /etc/profile;mkdir $REMOTE_DIR; \
sshfs $SSHFS_OPTION $LOCAL_SSH:$LOCAL_DIR $REMOTE_DIR; bash; \
umount $REMOTE_DIR; rm -r $REMOTE_DIR"

0

सिद्धांत रूप में यह क्विन के उत्तर के समान है, लेकिन अलग-अलग कमांड के बजाय एक कामकाजी स्क्रिप्ट के रूप में जिसे प्रत्येक मशीन / उपयोग के लिए अनुकूलन की आवश्यकता होती है।

मैं इस बारे में ओवरहेड के बारे में नहीं जानता, यह मुझे ऐसा लगता है जैसे यह सब कुछ दो बार एन्क्रिप्ट / डिक्रिप्ट करता है।

#!/bin/bash
# Reverse sshfs. You need ssh servers on both ends, the script logs first
# onto the remote end and then back into the local one
# Usage: sshfsr dir [user@]host:mountpoint  [options]
# [options] are passed on to the remote sshfs

set -e

LOCALPATH=$1
REMOTE=$(echo $2 | grep -o '^[^:]*')
REMOTEPATH=$(echo $2 | grep -o '[^:]*$')
ARGS=${@:3}

LOCALUSER=$(whoami)
PORT=10000

ssh $REMOTE -R $PORT:localhost:22 "sshfs -o NoHostAuthenticationForLocalhost=yes -p $PORT $ARGS $LOCALUSER@localhost:$LOCALPATH $REMOTEPATH" &

मैं HostAuthenticationForLocalhost को अक्षम करता हूं क्योंकि जाहिर है कि लोकलहोस्ट कुछ भी हो सकता है। यह सार्वजनिक कुंजी प्रमाणीकरण के साथ पूरी तरह से सुरक्षित है। आपको वैसे भी पासवर्ड का उपयोग नहीं करना चाहिए, लेकिन यहां तक ​​कि उन पासवर्डों से भी जिन्हें आप होस्ट करते हैं, जिन्हें आप जानते हैं कि आप नियंत्रण करते हैं।

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