ฉันจะเมานท์ sshfs ตอนบูตได้อย่างไร


12

การใช้กล่อง NAS เป็นไฟล์เซิร์ฟเวอร์ 24/7 ฉันต้องการใช้ sshfs เพื่อเชื่อมต่อกับมันจากเดสก์ท็อป Ubuntu 9.04 ขณะนี้ฉันมีบรรทัดนี้ใน fstab ของเดสก์ท็อป:

sshfs#jldugger@storage:/mnt/HD_a2/    /mnt/storage    fuse   comment=sshfs,auto,users,exec,uid=1000,gid=1000,allow_other,reconnect,transform_symlinks,BatchMode=yes,fsname=sshfs#jldugger@storage/mnt/HD_a2/ 0 0

ฉันสามารถยืนยันว่าใช้งานได้กับเมา/mnt/storageท์ สิ่งที่ฉันต้องการคือวิธีการติดตั้งเมื่อเริ่มต้น แต่หลังจากการเชื่อมต่อเครือข่ายถูกสร้างขึ้น


คุณมีการตั้งค่าการรับรองความถูกต้องได้อย่างไร? คุณได้รับพร้อมท์ให้ใส่รหัสผ่านเมื่อติดตั้งด้วยตนเองหรือไม่
Zoredache

Keypair รับรองความถูกต้อง ไม่ปลอดภัยที่สุด แต่น่าจะเพียงพอ
jldugger

คำตอบ:


8

ปัจจุบันการพุ่งพรวดใน Ubuntu ไม่ได้สร้างเหตุการณ์เครือข่าย แทนที่จะเรียกว่า sysvinit แบบดั้งเดิม ตามค่าเริ่มต้น NetworkManager จะถูกติดตั้งและใช้งาน แทนที่จะปล่อยเหตุการณ์เครือข่ายพุ่งพรวด แต่ก็มี run-parts dispatcher (/etc/NetworkManager/dispatcher.d/) ซึ่งตัวมันเองนั้นอาศัยเพียงตัวแจกจ่าย run-parts ของ ifupdown (/etc/network/*.d/) โดยเฉพาะอย่างยิ่งคุณสนใจเกี่ยวกับ /etc/network/if-up.d/ และ /etc/network/if-down.d/

ขั้นแรกให้ตั้งค่า ssh keypair ที่ไม่ได้เข้ารหัสดังนั้นคุณสามารถติดตั้งจุดโดยไม่ต้องพรอมต์ เขียนสคริปต์วางไว้ใน /etc/network/if-up.d/ และทำการปฏิบัติการ มีการค้นพบสิ่งต่อไปนี้บน UbuntuForums และเพียงพอสำหรับฉัน:

#!/bin/sh
## http://ubuntuforums.org/showthread.php?t=430312
## The script will attempt to mount any fstab entry with an option
## "...,comment=$SELECTED_STRING,..."
## Use this to select specific sshfs mounts rather than all of them.
SELECTED_STRING="sshfs"

# Not for loopback
[ "$IFACE" != "lo" ] || exit 0

## define a number of useful functions

## returns true if input contains nothing but the digits 0-9, false otherwise
## so realy, more like isa_positive_integer 
isa_number () {
    ! echo $1 | egrep -q '[^0-9]'
    return $?
}

## returns true if the given uid or username is that of the current user
am_i () {
        [ "$1" = "`id -u`" ] || [ "$1" = "`id -un`" ]
}

## takes a username or uid and finds it in /etc/passwd
## echoes the name and returns true on success
## echoes nothing and returns false on failure 
user_from_uid () {
    if isa_number "$1"
    then
                # look for the corresponding name in /etc/passwd
        local IFS=":"
        while read name x uid the_rest
        do
                if [ "$1" = "$uid" ]
                        then 
                                echo "$name"
                                return 0
                        fi
        done </etc/passwd
    else
        # look for the username in /etc/passwd
        if grep -q "^${1}:" /etc/passwd
        then
                echo "$1"
                return 0
        fi
    fi
    # if nothing was found, return false
        return 1
}

## Parses a string of comma-separated fstab options and finds out the 
## username/uid assigned within them. 
## echoes the found username/uid and returns true if found
## echoes "root" and returns false if none found
uid_from_fs_opts () {
        local uid=`echo $1 | egrep -o 'uid=[^,]+'`
        if [ -z "$uid" ]; then
                # no uid was specified, so default is root
                echo "root"
                return 1
        else
                # delete the "uid=" at the beginning
                uid_length=`expr length $uid - 3`
                uid=`expr substr $uid 5 $uid_length`
                echo $uid
                return 0
        fi
}

# unmount all shares first
sh "/etc/network/if-down.d/umountsshfs"

while read fs mp type opts dump pass extra
do
    # check validity of line
    if [ -z "$pass" -o -n "$extra" -o "`expr substr ${fs}x 1 1`" = "#" ]; 
    then
        # line is invalid or a comment, so skip it
        continue

    # check if the line is a selected line
    elif echo $opts | grep -q "comment=$SELECTED_STRING"; then

        # get the uid of the mount
        mp_uid=`uid_from_fs_opts $opts`

        if am_i "$mp_uid"; then
                        # current user owns the mount, so mount it normally
                        { sh -c "mount $mp" && 
                                echo "$mp mounted as current user (`id -un`)" || 
                                echo "$mp failed to mount as current user (`id -un`)"; 
                        } &
                elif am_i root; then
                        # running as root, so sudo mount as user
                        if isa_number "$mp_uid"; then
                                # sudo wants a "#" sign icon front of a numeric uid
                                mp_uid="#$mp_uid"
                        fi 
                        { sudo -u "$mp_uid" sh -c "mount $mp" && 
                                echo "$mp mounted as $mp_uid" || 
                                echo "$mp failed to mount as $mp_uid"; 
                        } &
                else
                        # otherwise, don't try to mount another user's mount point
                        echo "Not attempting to mount $mp as other user $mp_uid"
:
                        echo "Not attempting to mount $mp as other user $mp_uid"
                fi
    fi
    # if not an sshfs line, do nothing
done </etc/fstab

wait

หากคุณมี WiFi หรือการเชื่อมต่อที่ไม่น่าเชื่อถือให้วางสิ่งต่อไปนี้ใน /etc/network/if-down.d/:

#!/bin/bash
# Not for loopback!
[ "$IFACE" != "lo" ] || exit 0

# comment this for testing
exec 1>/dev/null # squelch output for non-interactive

# umount all sshfs mounts
mounted=`grep 'fuse.sshfs\|sshfs#' /etc/mtab | awk '{ print $2 }'`
[ -n "$mounted" ] && { for mount in $mounted; do umount -l $mount; done; }

2
มันใช้งานได้ดีสำหรับฉัน ฉันจะทราบว่าฉันเปลี่ยนechoคำสั่งที่logger -t mountsshfsส่งออกไปยังstdout เป็นคำสั่งแทนดังนั้นผลลัพธ์จะไปที่ syslog
แมทธิว

3

การพุ่งพรวดเป็นวิธีที่ต้องการในการออกสคริปต์เริ่มต้นหรือบริการใน Ubuntu ในขณะนี้แม้ว่าการแก้ไขจะ/etc/rc.localยังคงใช้งานได้ พุ่งพรวดช่วยให้คุณสามารถควบคุมเมื่อมีการเรียกใช้บริการตรวจสอบให้แน่ใจว่ามันเกิดขึ้นหลังจากเริ่มการเชื่อมต่อเครือข่ายของคุณ

นอกจากนี้ยังสามารถแก้ไข symlink ใน /etc/rc.Xd โดยตรง (แทน X สำหรับระดับการรันที่คุณใช้) และเพิ่มชื่อเช่น S99mount เพื่อให้แน่ใจว่ามันจะทำงานหลังจากการตั้งค่าเครือข่าย สิ่งนี้จะต้องชี้ไปที่ไฟล์สคริปต์ที่เมาท์ sshfs ที่คุณร้องขอ


3

_netdev เป็นตัวเลือกเมานต์ควรแก้ปัญหานี้ฉันเชื่อว่า


ฉันรู้ว่า Ubuntu และ Centos ไม่เหมือนกัน ... แต่ใน CentOS anyways นี่เป็นวิธีที่ถูกต้องในการมี /etc/init.d/netfs จัดการ sshfs mounts ซึ่งจะถูกเรียกหลังจากเครือข่ายได้รับการอัพ
ไม่ระบุตัวตน -

1

แค่คิด แต่ถ้าคุณใช้สิ่งนี้เป็นไฟล์เซิร์ฟเวอร์บางที NFS หรือ Samba อาจเป็นทางออกที่ดีกว่า ssh


0

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

  1. สร้างไฟล์ที่มีรหัสผ่านในโฮมไดเร็กตอรี่ของคุณและรักษาความปลอดภัย:

    echo 'YourRemoteUserPassword' > ~jldugger/.credentials
    chmod 600 ~jldugger/.credentials
    
  2. แก้ไข/etc/rc.localไฟล์ของคุณและแทรกคำสั่งต่อไปนี้ที่ด้านล่าง แต่ก่อน "ทางออก 0":

    sshfs -o password_stdin -o nonempty jldugger@storage:/mnt/HD_a2/ /mnt/storage < ~jldugger/.credentials
    
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.