วิธีเมาท์โลคัลไดเร็กทอรีไปยังรีโมตอย่าง sshfs?


23

ฉันรู้ว่า sshfs ใช้เพื่อเมานต์รีโมตไดเร็กทอรีเป็นโลคัล แต่ฉันต้องเมาต์โลคัลไดเร็กทอรีไปยัง remote fs

ฉันต้องการติดตั้งโฟลเดอร์ในเครื่องเช่น:

/home/username/project_directory

บนเครื่องระยะไกลที่ฉันมีการเข้าถึง ssh เช่น:

/var/www/project_directory

เป้าหมายของการแก้ไขที่ทำขึ้นในเครื่องนั้นมีผลกับระบบไฟล์ระยะไกล


@quinn มันทำงานได้อย่างไร
Konga Raju

ใช่ฉันใช้อยู่ในขณะนี้ดูเหมือนว่าจะทำงานได้ดี
วินน์

อันที่จริงฉันมีหนึ่งปัญหา: superuser.com/questions/743316/…
quinn

@quinn คุณควรโพสต์โซลูชันในบล็อกนั้นเป็นคำตอบที่นี่ มันใช้งานได้สำหรับฉัน
brismuth

คำตอบ:


19

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

ทำอย่างไร? คุณตั้งค่าการส่งต่อ ssh โดยใช้พอร์ต 10000 บนเครื่องที่คุณเข้าสู่พอร์ต 22 บนเครื่องท้องถิ่นของคุณและใช้ sshfs เพื่อติดตั้งในอีกด้านหนึ่ง

F.ex. เพื่อเมาท์ / home / ชื่อผู้ใช้ / mywwwdevelstuff บนเครื่องของคุณไปที่ / var / www ที่ฝั่งเซิร์ฟเวอร์:

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
มันเป็นมูลค่าการกล่าวขวัญว่าเครื่องท้องถิ่นจะต้องใช้เซิร์ฟเวอร์ ssh
Jean Carlo Machado

3

เลขที่

เพื่อที่จะทำสิ่งนี้ "ทั้งหมด" คุณต้องทำคือย้อนกลับตรรกะของคุณ ตัวอย่างเช่นคุณสามารถตั้งค่าสายการบิน 1 ซึ่งจะ ssh ลงในเครื่องระยะไกลและจากนั้นใช้ sshfs เพื่อติดตั้งไดเรกทอรีระยะไกลบนเครื่องท้องถิ่นในกล่องนั้น แน่นอนว่าสิ่งนี้อาจเป็นเรื่องง่ายสำหรับ NAT, กฎไฟร์วอลล์ ฯลฯ แต่คุณไม่ได้อธิบายกรณีการใช้งานของคุณ

มีโปรโตคอลอื่น ๆ เช่น SMB และดียิ่งขึ้น NFS - แต่พวกเขาจะประสบปัญหาที่คล้ายกัน

แกนหลักของปัญหาที่คุณมีคือเครื่องจำเป็นต้องเชื่อถือแหล่งข้อมูลและถ้าคุณสามารถเมานต์ระบบไฟล์จากระยะไกลซึ่งจะทำลายหนึ่งในหลักความปลอดภัยอินเทอร์เน็ต


1
ฉันไม่รู้ว่าคุณกำลังพยายามพูดอะไร ฉันคิดว่าเพื่อจุดประสงค์ของคำถามที่คุณสามารถสันนิษฐานได้อย่างปลอดภัยว่าเซิร์ฟเวอร์ / ลูกค้าสามารถเข้าสู่ระบบซึ่งกันและกันด้วย SSH ด้วยคีย์เช่นเชื่อใจกัน วิธีที่ฉันเข้าใจคำถาม (และปัญหาที่ฉันมี) คือการสร้างการเชื่อมต่อ SSH จากไคลเอนต์ (ไดนามิก IP, หลัง NAT ซึ่งมี IP แบบไดนามิกหรือกรณีที่น่ากลัวยิ่งกว่า) ไปยังเซิร์ฟเวอร์ (เข้าถึงได้ถาวร) ง่ายกว่าวิธีอื่น ๆ ในรอบ
ไม่มีใคร

1

จากสคริปต์ของ @ Nobody ฉันได้สรุปความคิดเห็นที่มีประโยชน์ ด้านล่างเป็นสคริปต์ของฉัน

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

โดยหลักการแล้วมันก็เหมือนกับคำตอบของ quinn แต่เป็นสคริปต์การทำงานแทนที่จะใช้คำสั่งแยกต่างหากซึ่งต้องมีการดัดแปลงสำหรับแต่ละเครื่อง / การใช้งาน

ฉันไม่รู้เกี่ยวกับค่าใช้จ่ายในเรื่องนี้ดูเหมือนว่าฉันชอบมันเข้ารหัส / ถอดรหัสทุกอย่างสองครั้ง

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

ฉันปิดการใช้งาน HostAuthenticationForLocalhost เพราะเห็นได้ชัดว่า localhost สามารถเป็นอะไรก็ได้ นี่คือความปลอดภัยอย่างสมบูรณ์แบบด้วยการตรวจสอบคีย์สาธารณะ คุณไม่ควรใช้รหัสผ่านอยู่ดีแม้ว่าจะใช้รหัสผ่านที่คุณเชื่อมต่อกับโฮสต์ที่คุณรู้จัก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.