como montar o diretório local para remoto como sshfs?

19

Eu sei que o sshfs é usado para montar o diretório remoto para o local, mas eu preciso montar o diretório local para o fs remoto.

Eu gostaria de montar uma pasta local como:

/home/username/project_directory

em uma máquina remota à qual tenho acesso ssh, como:

/var/www/project_directory

O objetivo é que as edições feitas localmente sejam refletidas no sistema de arquivos remoto.

Konga Raju
fonte
@quinn é solução de trabalho?
Konga Raju
Sim, estou usando atualmente, parece funcionar bem
quinn
Na verdade, tenho um problema: superuser.com/questions/743316/…
quinn
@quinn você deve postar a solução nesse blog como uma resposta aqui. Funciona para mim.
brismuth

Respostas:

17

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

Como fazer isso? Você configura o encaminhamento ssh usando a porta 10000 na máquina na qual você faz logon na porta 22 em sua máquina local e usa sshfs para montar no outro lado.

F.ex. para montar / home / username / mywwwdevelstuff em sua máquina local para / var / www no lado do 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
fonte
1
Vale a pena mencionar que a máquina local deve estar executando o servidor ssh.
Jean Carlo Machado
3

Não.

Para fazer isso, "tudo" que você precisa fazer é reverter sua lógica. Você poderia, por exemplo, configurar um liner que faria o ssh na máquina remota e então usar o sshfs para montar o diretório remoto na máquina local naquela caixa. Claro que isso pode ser simplista com NAT, regras de firewall, etc, mas você não descreveu seu caso de uso.

Existem outros protocolos, como o SMB e, melhor ainda, o NFS, mas eles sofrerão problemas semelhantes.

O núcleo do problema que você tem é que uma máquina precisa confiar na origem dos dados, e se você pode montar remotamente um sistema de arquivos que quebraria um dos princípios centrais da segurança da Internet.

davidgo
fonte
1
Eu não sei o que você está tentando dizer. Eu acho que para o propósito da questão você pode seguramente assumir que o servidor / cliente pode se conectar uns aos outros via SSH com chaves, ou seja, confiar uns nos outros. A maneira como eu entendi a pergunta (e o problema que eu também tenho) é que criar uma conexão SSH do cliente (IP dinâmico, por trás do NAT que também tem um IP dinâmico, ou possivelmente casos ainda mais horríveis) para o servidor (permanentemente acessível) é muito mais fácil do que o contrário.
Nobody
0

Em princípio, é o mesmo que a resposta de quinn, mas como um script de trabalho em vez de comandos separados que precisam de adaptação para cada máquina / uso.

Eu não sei sobre a sobrecarga neste, parece-me que ele criptografa / descriptografa tudo duas vezes.

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

Eu desabilito HostAuthenticationForLocalhost porque obviamente localhost pode ser qualquer coisa. Isso é perfeitamente seguro com autenticação de chave pública. Você não deve usar senhas de qualquer maneira, mas mesmo com senhas você está se conectando a um host que você sabe controlar.

Nobody
fonte
0

Baseado no roteiro de @ Nobody, generalizei com algum comentário útil. Abaixo está meu 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 
## 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 [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
fonte