Làm thế nào để gắn thư mục cục bộ vào remote như sshfs?


23

Tôi biết sshfs được sử dụng để gắn thư mục từ xa vào cục bộ, nhưng tôi cần gắn thư mục cục bộ vào fs từ xa.

Tôi muốn gắn kết một thư mục cục bộ như:

/home/username/project_directory

vào một máy từ xa mà tôi có quyền truy cập ssh, chẳng hạn như:

/var/www/project_directory

Mục tiêu là các chỉnh sửa được thực hiện cục bộ được phản ánh trên hệ thống tệp từ xa.


@quinn là giải pháp làm việc?
Konga Raju

Có, tôi đang sử dụng nó hiện tại, dường như hoạt động tốt
quinn

Trên thực tế, tôi có một vấn đề: superuser.com/questions/743316/
Kẻ

@quinn bạn nên đăng giải pháp trong blog đó như một câu trả lời ở đây. Nó làm việc cho tôi.
brismuth

Câu trả lời:


19

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

Làm thế nào để làm nó? Bạn thiết lập chuyển tiếp ssh bằng cách sử dụng cổng 10000 trên máy bạn đăng nhập vào cổng 22 trên máy cục bộ của mình và sử dụng sshfs để gắn vào phía bên kia.

F.ex để gắn kết / home / tên người dùng / mywwwdevel ware trên máy cục bộ của bạn tới / var / www ở phía máy chủ:

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
Đáng nói là máy cục bộ phải chạy máy chủ ssh.
Jean Carlo Machado

3

Không.

Để làm được "tất cả" này, bạn cần làm là đảo ngược logic của mình. Ví dụ, bạn có thể thiết lập 1 lớp lót sẽ ssh vào máy từ xa và sau đó sử dụng sshfs để gắn thư mục từ xa vào máy cục bộ trên hộp đó. Tất nhiên điều này có thể đơn giản với NAT, quy tắc tường lửa, v.v., nhưng bạn không mô tả trường hợp sử dụng của mình.

Có các giao thức khác như SMB và, thậm chí tốt hơn, NFS - nhưng chúng sẽ gặp vấn đề tương tự.

Cốt lõi của vấn đề bạn gặp phải là một máy cần phải tin tưởng vào nguồn dữ liệu và nếu bạn có thể gắn kết một hệ thống tệp từ xa sẽ phá vỡ một trong những nguyên lý cốt lõi của bảo mật internet.


1
Tôi không biết bạn đang cố nói gì. Tôi nghĩ với mục đích của câu hỏi, bạn có thể giả định rằng máy chủ / máy khách có thể đăng nhập với nhau thông qua SSH bằng các khóa, tức là tin tưởng lẫn nhau. Cách tôi hiểu câu hỏi (và vấn đề tôi cũng gặp phải) là việc tạo kết nối SSH từ máy khách (IP động, phía sau NAT cũng có IP động hoặc thậm chí có thể là các trường hợp khủng khiếp hơn) đến máy chủ (có thể truy cập vĩnh viễn) dễ dàng hơn nhiều so với cách khác.
Không ai vào

1

Dựa trên kịch bản của @ Nobody, tôi đã khái quát nó bằng một số nhận xét hữu ích. Dưới đây là kịch bản của tôi.

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

Về nguyên tắc, nó giống như câu trả lời của quinn, nhưng là một tập lệnh hoạt động thay vì các lệnh riêng biệt cần điều chỉnh cho mỗi máy / cách sử dụng.

Tôi không biết về chi phí trong việc này, đối với tôi có vẻ như nó mã hóa / giải mã mọi thứ hai lần.

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

Tôi vô hiệu hóa HostAuthenticationForLocalhost vì rõ ràng localhost có thể là bất cứ thứ gì. Điều này là hoàn toàn an toàn với xác thực khóa công khai. Dù sao thì bạn cũng không nên sử dụng mật khẩu, nhưng ngay cả với mật khẩu bạn đang kết nối với máy chủ bạn biết bạn kiểm soát.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.