comment monter un répertoire local à distance comme sshfs?

23

Je sais que sshfs est utilisé pour monter le répertoire distant sur local, mais j'ai besoin de monter le répertoire local sur fs distant.

Je souhaite monter un dossier local tel que:

/home/username/project_directory

sur une machine distante à laquelle j'ai accès ssh, comme:

/var/www/project_directory

Le but étant que les modifications effectuées localement se reflètent sur le système de fichiers distant.

Konga Raju
la source
@quinn est-ce une solution de travail?
Konga Raju
Oui, je l'utilise actuellement, semble bien fonctionner
quinn
En fait, j'ai un problème: superuser.com/questions/743316/…
quinn
@quinn, vous devriez publier la solution dans ce blog comme réponse ici. Ça marche pour moi.
brismuth

Réponses:

19

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

Comment faire? Vous configurez le transfert ssh en utilisant le port 10000 sur la machine sur laquelle vous vous connectez au port 22 sur votre machine locale et utilisez sshfs pour le monter de l'autre côté.

F.ex. pour monter / home / username / mywwwdevelstuff sur votre machine locale vers / var / www côté serveur:

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
la source
3
Il convient de mentionner que la machine locale doit exécuter le serveur ssh.
Jean Carlo Machado
3

Non.

Pour ce faire, «tout» vous devez inverser votre logique. Vous pouvez, par exemple, configurer une ligne 1 qui ssh dans la machine distante, puis utiliser sshfs pour monter le répertoire distant sur la machine locale sur cette boîte. Bien sûr, cela pourrait être simpliste avec NAT, les règles de pare-feu, etc., mais vous n'avez pas décrit votre cas d'utilisation.

Il existe d'autres protocoles comme SMB et, mieux encore, NFS - mais ils subiront des problèmes similaires.

Le cœur du problème que vous avez est qu'une machine doit faire confiance à la source des données et si vous pouvez monter à distance un système de fichiers qui briserait l'un des principes fondamentaux de la sécurité Internet.

davidgo
la source
2
Je ne sais pas ce que tu essaies de dire. Je pense qu'aux fins de la question, vous pouvez supposer en toute sécurité que le serveur / client peut se connecter les uns aux autres via SSH avec des clés, c'est-à-dire se faire mutuellement confiance. La façon dont je comprends la question (et le problème que j'ai aussi) est que la création d'une connexion SSH à partir du client (IP dynamique, derrière NAT qui a également une IP dynamique, ou peut-être des cas encore plus horribles) vers le serveur (accessible en permanence) est beaucoup plus facile que l'inverse.
Personne
1

Basé sur le script de @ Nobody, je l'ai généralisé avec quelques commentaires utiles. Voici mon script.

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
la source
0

En principe, c'est la même chose que la réponse de quinn, mais en tant que script de travail au lieu de commandes distinctes qui nécessitent une adaptation pour chaque machine / utilisation.

Je ne connais pas les frais généraux dans cela, il me semble qu'il crypte / décrypte tout deux fois.

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

Je désactive HostAuthenticationForLocalhost car, évidemment, localhost peut être n'importe quoi. Ceci est parfaitement sûr avec l'authentification par clé publique. Vous ne devez pas utiliser les mots de passe de toute façon, mais même avec des mots de passe, vous vous connectez à un hôte que vous savez contrôler.

Personne
la source