come montare la directory locale su remoto come sshfs?


23

So che sshfs è usato per montare la directory remota su local, ma ho bisogno di montare la directory locale su fs remoto.

Vorrei montare una cartella locale come:

/home/username/project_directory

su una macchina remota a cui ho accesso ssh, come:

/var/www/project_directory

L'obiettivo è che le modifiche apportate localmente si riflettano sul filesystem remoto.


@quinn è una soluzione funzionante?
Konga Raju,

Sì, lo sto usando attualmente, sembra funzionare bene
Quinn,

In realtà, ho un problema: superuser.com/questions/743316/…
quinn,

@quinn dovresti pubblicare la soluzione in quel blog come risposta qui. Per me funziona.
Brismuth,

Risposte:


19

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

Come farlo? Puoi impostare l'inoltro di ssh usando la porta 10000 sul computer su cui accedi alla porta 22 sul tuo computer locale e usi sshfs per montare sull'altro lato.

F.ex. montare / home / nomeutente / mywwwdevelstuff sul tuo computer locale su / var / www sul lato server:

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

3
Vale la pena ricordare che il computer locale deve eseguire il server SSH.
Jean Carlo Machado,

3

No.

Per fare questo "tutto" è necessario invertire la logica. È possibile, ad esempio, impostare un liner 1 che esegua ssh nel computer remoto e quindi utilizzare sshfs per montare la directory remota sul computer locale su quella casella. Naturalmente questo potrebbe essere semplicistico con NAT, regole del firewall ecc., Ma non hai descritto il tuo caso d'uso.

Esistono altri protocolli come SMB e, ancora meglio, NFS - ma soffriranno problemi simili.

Il nocciolo del problema che hai è che una macchina deve fidarsi dell'origine dei dati e se puoi montare in remoto un file system che spezzerebbe uno dei principi fondamentali della sicurezza di Internet.


2
Non so cosa stai cercando di dire. Penso che, ai fini della domanda, si possa presumere che il server / client possa collegarsi tramite SSH con le chiavi, ovvero affidarsi l'un l'altro. Il modo in cui capisco la domanda (e il problema che ho anche) è che la creazione di una connessione SSH dal client (IP dinamico, dietro NAT che ha anche un IP dinamico, o possibilmente anche casi più orribili) al server (permanentemente accessibile) è molto più semplice del contrario.
Nessuno il

1

Basato sulla sceneggiatura di @ Nobody, l'ho generalizzato con qualche commento utile. Di seguito è la mia sceneggiatura.

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 
## /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 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

In linea di principio è la stessa della risposta di Quinn, ma come uno script funzionante invece di comandi separati che necessitano di adattamento per ogni macchina / utilizzo.

Non so il sovraccarico in questo, mi sembra che crittografa / decodifica tutto due volte.

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

Disattivo HostAuthenticationForLocalhost perché ovviamente localhost può essere qualsiasi cosa. Questo è perfettamente sicuro con l'autenticazione con chiave pubblica. Non dovresti usare le password comunque, ma anche con le password ti connetti a un host che sai di controllare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.