jak zamontować lokalny katalog do zdalnego, takiego jak sshfs?

23

Wiem, że sshfs służy do montowania zdalnego katalogu do lokalnego, ale muszę montować lokalny katalog do zdalnego fs.

Chciałbym zamontować folder lokalny, taki jak:

/home/username/project_directory

na zdalnym komputerze, do którego mam dostęp ssh, takim jak:

/var/www/project_directory

Celem jest lokalna edycja zmian w zdalnym systemie plików.

Konga Raju
źródło
@quinn czy to działa rozwiązanie?
Konga Raju
Tak, używam go obecnie, wydaje się działać dobrze
quinn
Właściwie mam jeden problem: superuser.com/questions/743316/…
quinn
@quinn powinieneś opublikować rozwiązanie na tym blogu jako odpowiedź tutaj. Mi to pasuje.
brismuth

Odpowiedzi:

19

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

Jak to zrobić? Konfigurujesz przekazywanie ssh przy użyciu portu 10000 na komputerze, na którym logujesz się do portu 22 na komputerze lokalnym i używasz sshfs do montowania po drugiej stronie.

F.ex. aby zamontować / home / nazwa użytkownika / mywwwdevelstuff na lokalnym komputerze do / var / www po stronie serwera:

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
źródło
3
Warto wspomnieć, że na lokalnej maszynie musi być uruchomiony serwer ssh.
Jean Carlo Machado,
3

Nie.

Aby to zrobić „wszystko”, co musisz zrobić, to odwrócić swoją logikę. Możesz na przykład ustawić 1 linijkę, która ssh do zdalnego komputera, a następnie użyj sshfs do zamontowania zdalnego katalogu na lokalnym komputerze na tym komputerze. Oczywiście może to być uproszczone, co w przypadku NAT, reguł zapory itp., Ale nie opisałeś swojego przypadku użycia.

Istnieją inne protokoły, takie jak SMB i, jeszcze lepiej, NFS - ale będą miały podobne problemy.

Istotą problemu jest to, że maszyna musi ufać źródłu danych, a jeśli możesz zdalnie zamontować system plików, który złamałby jedną z podstawowych zasad bezpieczeństwa w Internecie.

Davidgo
źródło
2
Nie wiem co próbujesz powiedzieć. Myślę, że do celów pytania można bezpiecznie założyć, że serwer / klient może logować się do siebie za pośrednictwem SSH za pomocą kluczy, tj. Ufać sobie nawzajem. Sposób, w jaki rozumiem pytanie (i problem, który mam również), polega na tym, że utworzenie połączenia SSH od klienta (dynamiczny adres IP, za NAT, który ma również dynamiczny adres IP, lub być może nawet bardziej okropne przypadki) do (stale dostępnego) serwera jest znacznie łatwiejsze niż na odwrót.
Nikt
1

Na podstawie skryptu @ Nobody uogólniłem go przydatnym komentarzem. Poniżej znajduje się mój skrypt.

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
źródło
0

Zasadniczo jest to to samo, co odpowiedź Quinna, ale jako działający skrypt zamiast osobnych poleceń, które wymagają dostosowania do każdej maszyny / użycia.

Nie znam w tym narzutu, wydaje mi się, że szyfruje / odszyfrowuje wszystko dwa razy.

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

Wyłączam HostAuthenticationForLocalhost, ponieważ oczywiście localhost może być dowolny. Jest to całkowicie bezpieczne dzięki uwierzytelnianiu za pomocą klucza publicznego. I tak nie powinieneś używać haseł, ale nawet z hasłami łączysz się z hostem, o którym wiesz, że kontrolujesz.

Nikt
źródło