bagaimana cara me-mount direktori lokal ke remote seperti sshfs?

23

Saya tahu sshfs digunakan untuk me-mount direktori remote ke lokal, tapi saya perlu me-mount direktori lokal ke fs jarak jauh.

Saya ingin memasang folder lokal seperti:

/home/username/project_directory

ke mesin jarak jauh yang saya punya akses ssh, seperti:

/var/www/project_directory

Tujuannya agar pengeditan dilakukan secara lokal tercermin pada sistem file jarak jauh.

Konga Raju
sumber
@ Quinn apakah ini solusi yang berfungsi?
Konga Raju
Ya, saya menggunakannya saat ini, sepertinya berfungsi dengan baik
quinn
Sebenarnya, saya punya satu masalah: superuser.com/questions/743316/…
quinn
@quinn Anda harus memposting solusi di blog itu sebagai jawaban di sini. Ini bekerja untuk saya.
brismuth

Jawaban:

19

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

Bagaimana cara melakukannya? Anda mengatur penerusan ssh dengan menggunakan port 10000 pada mesin yang Anda masuki ke port 22 di mesin lokal Anda dan menggunakan sshfs untuk memasang di sisi lain.

F.ex. untuk me-mount / home / username / mywwwdevelstuff pada mesin lokal Anda ke / var / www di sisi server:

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
sumber
3
Perlu disebutkan bahwa mesin lokal harus menjalankan server ssh.
Jean Carlo Machado
3

Tidak.

Untuk melakukan ini "semua" yang perlu Anda lakukan adalah membalikkan logika Anda. Anda dapat, misalnya, mengatur 1 liner yang akan ssh ke mesin jarak jauh dan kemudian menggunakan sshfs untuk memasang direktori jarak jauh pada mesin lokal di kotak itu. Tentu saja ini mungkin menyederhanakan apa dengan NAT, aturan firewall dll, tetapi Anda tidak menggambarkan kasus penggunaan Anda.

Ada protokol lain seperti SMB dan, bahkan lebih baik, NFS - tetapi mereka akan mengalami masalah serupa.

Inti dari masalah yang Anda miliki adalah bahwa mesin perlu memercayai sumber data, dan jika Anda dapat me-mount sistem file dari jarak jauh yang akan memecah salah satu prinsip inti keamanan internet.

davidgo
sumber
1
Saya tidak tahu apa yang ingin Anda katakan. Saya pikir untuk keperluan pertanyaan Anda dapat dengan aman berasumsi bahwa server / klien dapat login satu sama lain melalui SSH dengan kunci, yaitu saling percaya. Cara saya memahami pertanyaan (dan masalah yang saya miliki) adalah menciptakan koneksi SSH dari klien (IP dinamis, di belakang NAT yang juga memiliki IP dinamis, atau bahkan mungkin kasus yang lebih mengerikan) ke server (yang dapat diakses secara permanen) jauh lebih mudah daripada sebaliknya.
Tidak seorang pun
1

Berdasarkan skrip @ Nobody, saya menggeneralisasikannya dengan beberapa komentar yang bermanfaat. Di bawah ini adalah skrip saya.

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

Pada prinsipnya sama dengan jawaban quinn, tetapi sebagai skrip yang berfungsi alih-alih perintah terpisah yang membutuhkan adaptasi untuk setiap mesin / penggunaan.

Saya tidak tahu tentang overhead dalam hal ini, sepertinya saya suka mengenkripsi / mendekripsi semuanya dua kali.

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

Saya menonaktifkan HostAuthenticationForLocalhost karena jelas localhost bisa apa saja. Ini sangat aman dengan otentikasi kunci publik. Anda seharusnya tidak menggunakan kata sandi, tetapi bahkan dengan kata sandi yang Anda hubungkan ke host yang Anda tahu Anda kendalikan.

Tak seorangpun
sumber