Làm cách nào để gắn sshfs khi khởi động?


12

Sử dụng hộp NAS làm máy chủ tệp 24/7, tôi muốn sử dụng sshfs để kết nối với nó từ máy tính để bàn Ubuntu 9.04. Hiện tại, tôi có dòng này trong fstab của máy tính để bàn:

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

Tôi có thể xác nhận nó hoạt động với mount /mnt/storage. Những gì tôi cần là một số phương pháp gắn nó khi khởi động, nhưng sau khi kết nối mạng được thiết lập.


Làm thế nào để bạn có thiết lập xác thực? Bạn có được nhắc nhập mật khẩu khi bạn gắn nó bằng tay không?
Zoredache

Keyh auth. Không an toàn nhất, nhưng có khả năng là đủ.
jldugger

Câu trả lời:


8

Hiện tại, Upstart trong Ubuntu không tạo ra các sự kiện mạng. Thay vào đó, nó gọi sysvinit truyền thống. Theo mặc định, Trình quản lý mạng được cài đặt và chạy; thay vì phát ra các sự kiện mạng để khởi động, nó chứa một bộ điều phối phần chạy (/etc/NetworkManager/dispatcher.d/) mà chính nó chỉ đơn giản dựa vào bộ điều phối phần chạy của ifupdown (/etc/network/*.d/). Cụ thể, bạn quan tâm đến /etc/network/if-up.d/ và /etc/network/if-down.d/

Đầu tiên hãy thiết lập một cặp khóa ssh không được mã hóa, để bạn có thể gắn điểm mà không cần dấu nhắc. Viết một kịch bản, đặt nó vào /etc/network/if-up.d/ và thực thi. Những điều sau đây được phát hiện trên UbuntuForums và là đủ cho tôi:

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

Nếu bạn có wifi hoặc kết nối không đáng tin cậy khác, hãy đặt phần sau vào /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
Nó hiệu quả tuyệt vời đối với tôi. Tôi sẽ lưu ý rằng tôi đã thay đổi các echolệnh được xuất thành stdout thành logger -t mountsshfscác lệnh thay vì vậy đầu ra sẽ chuyển sang syslog.
Matthew

3

Upstart là phương pháp ưa thích để phát hành các tập lệnh hoặc dịch vụ khởi động trong Ubuntu, mặc dù chỉnh sửa /etc/rc.localvẫn hoạt động. Upstart cho phép bạn kiểm soát khi dịch vụ được chạy, đảm bảo nó sẽ xảy ra sau khi bắt đầu kết nối mạng của bạn.

Bạn cũng có thể chỉnh sửa trực tiếp các liên kết tượng trưng trong /etc/rc.Xd, (thay thế X cho cấp độ bạn đang sử dụng) và thêm một tên như S99mount để đảm bảo rằng nó chạy sau khi thiết lập mạng. Điều này sẽ cần trỏ đến một tệp script gắn kết các sshfs mà bạn yêu cầu.


3

_netdev là một tùy chọn gắn kết sẽ giải quyết điều này, tôi tin rằng


tôi biết, ubfox và centos không giống nhau ... nhưng dù sao đi nữa, đây là cách chính xác để có /etc/init.d/netfs xử lý các mount sshfs. sẽ được gọi sau khi mạng đã được đưa lên.
nặc danh-một

1

Chỉ là một suy nghĩ, nhưng nếu bạn đang sử dụng điều này như một máy chủ tệp, có thể NFS hoặc Samba sẽ là một giải pháp tốt hơn so với ssh.


0

Đây là một giải pháp khác trong trường hợp bạn không có chứng chỉ từ máy chủ từ xa và phải sử dụng thông tin đăng nhập / mật khẩu thay thế. Tôi đang sử dụng trong ví dụ này cùng tên người dùng và thư mục được sử dụng bởi jldugger để tránh thêm nhầm lẫn.

  1. Tạo một tệp chứa mật khẩu của bạn trong thư mục chính của bạn và bảo mật nó:

    echo 'YourRemoteUserPassword' > ~jldugger/.credentials
    chmod 600 ~jldugger/.credentials
    
  2. Chỉnh sửa /etc/rc.localtệp của bạn và chèn lệnh sau ở dưới cùng, nhưng trước "exit 0":

    sshfs -o password_stdin -o nonempty jldugger@storage:/mnt/HD_a2/ /mnt/storage < ~jldugger/.credentials
    
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.