¿Cómo montar el directorio local a remoto como sshfs?

23

Sé que sshfs se usa para montar el directorio remoto en local, pero necesito montar el directorio local en fs remoto.

Me gustaría montar una carpeta local como:

/home/username/project_directory

en una máquina remota a la que tengo acceso ssh, como:

/var/www/project_directory

El objetivo es que las ediciones realizadas localmente se reflejen en el sistema de archivos remoto.

Konga Raju
fuente
@quinn ¿es una solución de trabajo?
Konga Raju
Sí, lo estoy usando actualmente, parece funcionar bien
Quinn
En realidad, tengo un problema: superuser.com/questions/743316/…
quinn
@quinn, debe publicar la solución en ese blog como respuesta aquí. Esto funciona para mi.
Brismuth

Respuestas:

19

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

¿Cómo hacerlo? Configura el reenvío ssh utilizando el puerto 10000 en la máquina en la que inicia sesión en el puerto 22 en su máquina local y utiliza sshfs para montar en el otro lado.

F.ex. para montar / home / username / mywwwdevelstuff en su máquina local en / var / www en el lado del servidor:

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
fuente
3
Vale la pena mencionar que la máquina local debe estar ejecutando el servidor ssh.
Jean Carlo Machado
3

No.

Para hacer esto "todo" lo que necesita hacer es invertir su lógica. Podría, por ejemplo, configurar un trazador de líneas 1 que ssh en la máquina remota y luego usar sshfs para montar el directorio remoto en la máquina local en esa caja. Por supuesto, esto podría ser simplista con NAT, reglas de firewall, etc., pero no describió su caso de uso.

Existen otros protocolos como SMB y, mejor aún, NFS, pero sufrirán problemas similares.

El núcleo del problema que tiene es que una máquina necesita confiar en la fuente de los datos, y si puede montar de forma remota un sistema de archivos que rompería uno de los principios básicos de la seguridad de Internet.

davidgo
fuente
2
No sé lo que intentas decir. Creo que a los efectos de la pregunta, puede asumir con seguridad que el servidor / cliente puede iniciar sesión entre sí a través de SSH con claves, es decir, confiar entre sí. La forma en que entiendo la pregunta (y el problema que también tengo) es que crear una conexión SSH desde el cliente (IP dinámica, detrás de NAT que también tiene una IP dinámica, o posiblemente casos aún más horribles) al servidor (permanentemente accesible) es mucho más fácil que al revés.
Nadie el
1

Basado en el script de @ Nobody, lo generalicé con algunos comentarios útiles. Debajo está mi guión.

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
fuente
0

En principio, es lo mismo que la respuesta de Quinn, pero como un script de trabajo en lugar de comandos separados que necesitan adaptación para cada máquina / uso.

No sé sobre la sobrecarga en esto, me parece que encripta / desencripta todo dos veces.

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

Inhabilito HostAuthenticationForLocalhost porque obviamente localhost puede ser cualquier cosa. Esto es perfectamente seguro con la autenticación de clave pública. No debería usar contraseñas de todos modos, pero incluso con las contraseñas se está conectando a un host que sabe que controla.

Nadie
fuente