Wie montiere ich ein lokales Verzeichnis wie sshfs auf einem entfernten Rechner?

23

Ich weiß, dass sshfs zum Mounten des Remote-Verzeichnisses in das lokale Verzeichnis verwendet wird, aber ich muss das lokale Verzeichnis in das fs-Remote-Verzeichnis mounten.

Ich möchte einen lokalen Ordner mounten, wie zum Beispiel:

/home/username/project_directory

auf eine entfernte Maschine, auf die ich ssh-Zugriff habe, wie zum Beispiel:

/var/www/project_directory

Das Ziel ist, dass lokal vorgenommene Änderungen auf dem entfernten Dateisystem wiedergegeben werden.

Konga Raju
quelle
@ Quinn funktioniert es Lösung?
Konga Raju
Ja, ich benutze es derzeit, scheint gut zu funktionieren
Quinn
Eigentlich habe ich ein Problem: superuser.com/questions/743316/…
Quinn
@quinn Du solltest die Lösung in diesem Blog als Antwort hier posten. Für mich geht das.
Brismuth

Antworten:

19

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

Wie es geht? Sie richten die SSH-Weiterleitung über Port 10000 auf dem Computer ein, auf dem Sie sich an Port 22 Ihres lokalen Computers anmelden, und verwenden SSHFS, um sich auf der anderen Seite anzumelden.

ZB So mounten Sie / home / username / mywwwdevelstuff auf Ihrem lokalen Computer nach / var / www auf der Serverseite:

localusername@localmachine: ssh username@server -R 10000:localmachine:22
username@server: cd /var
username@server: sshfs -p 10000 -o idmap=user,nonempty \
                 [email protected]:~/mywwwdevelstuff www
Quinn
quelle
3
Erwähnenswert ist, dass auf dem lokalen Computer der SSH-Server ausgeführt werden muss.
Jean Carlo Machado
3

Nein.

Um dies zu tun, müssen Sie "nur" Ihre Logik umkehren. Sie könnten zum Beispiel einen 1-Liner einrichten, der ssh in den Remote-Computer einfügt, und dann sshfs verwenden, um das Remote-Verzeichnis auf dem lokalen Computer in dieser Box einzuhängen. Das mag natürlich sehr simpel sein, was NAT, Firewall-Regeln usw. betrifft, aber Sie haben Ihren Anwendungsfall nicht beschrieben.

Es gibt andere Protokolle wie SMB und, noch besser, NFS - aber sie werden ähnliche Probleme haben.

Der Kern des Problems besteht darin, dass ein Computer der Quelle der Daten vertrauen muss und wenn Sie ein Dateisystem remote bereitstellen können, das einen der Kernaspekte der Internetsicherheit verletzt.

Davidgo
quelle
1
Ich weiß nicht, was du sagen willst. Ich denke für den Zweck der Frage kann man mit Sicherheit davon ausgehen, dass sich der Server / Client über SSH mit Schlüsseln aneinander anmelden kann, dh sich gegenseitig vertrauen. Ich verstehe die Frage (und das Problem, das ich auch habe) darin, dass eine SSH-Verbindung vom Client (dynamische IP, hinter NAT, die auch eine dynamische IP hat, oder möglicherweise in noch schrecklicheren Fällen) zum (permanent zugänglichen) Server hergestellt wird ist viel einfacher als umgekehrt.
Niemand
1

Basierend auf dem Skript von @ Nobody habe ich es mit einigen nützlichen Kommentaren verallgemeinert. Unten ist mein Skript.

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

#!/bin/bash

##/*
## * @Author: AllenYL 
## * @Date: 2017-11-08 11:37:31 
## * @Last Modified by:   [email protected] 
## * @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 
## /superuser/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 
## /superuser/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 
## /programming/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 [email protected] -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"
Allenyllee
quelle
0

Im Prinzip ist es das Gleiche wie die Antwort von Quinn, aber als funktionierendes Skript anstelle von separaten Befehlen, die für jede Maschine / Nutzung angepasst werden müssen.

Ich weiß nichts über den Overhead, es scheint mir, als würde es alles zweimal verschlüsseln / entschlüsseln.

#!/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" &

Ich deaktiviere HostAuthenticationForLocalhost, weil localhost offensichtlich alles sein kann. Dies ist bei der Authentifizierung mit öffentlichem Schlüssel absolut sicher. Sie sollten ohnehin keine Passwörter verwenden, aber selbst mit Passwörtern stellen Sie eine Verbindung zu einem Host her, von dem Sie wissen, dass Sie ihn steuern.

Niemand
quelle