Sshfs'yi önyüklemeye nasıl bağlayabilirim?


12

7/24 dosya sunucusu olarak bir NAS kutusu kullanarak, bir Ubuntu 9.04 masaüstünden bağlanmak için sshfs kullanmak istiyorum. Şu anda, masaüstünün fstab bu satırı var:

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

Mount ile çalıştığını onaylayabilirim /mnt/storage. İhtiyacım olan şey başlangıçta monte etmek için bir yöntem, ancak ağ bağlantısı kurulduktan sonra.


Kimlik doğrulama kurulumunuz nasıl? Manuel olarak bağladığınızda bir şifre girmeniz isteniyor mu?
Zoredache

Anahtar çifti yetkisi. En güvenli değil, ama muhtemelen yeterli.
jldugger

Yanıtlar:


8

Şu anda, Ubuntu'daki Upstart ağ olayları oluşturmuyor. Bunun yerine geleneksel sysvinit diyor. Varsayılan olarak NetworkManager yüklü ve çalışır; ağ olaylarını yeniden başlatmak için yaymak yerine, yalnızca ifupdown'un çalışma parçası dağıtım programına (/etc/network/*.d/) dayanan bir çalışma parçası dağıtım programı (/etc/NetworkManager/dispatcher.d/) içerir. Özellikle /etc/network/if-up.d/ ve /etc/network/if-down.d/

Öncelikle şifrelenmemiş bir ssh anahtar çifti ayarlayın, böylece noktayı bir istem olmadan monte edebilirsiniz. Bir komut dosyası yazın, /etc/network/if-up.d/ içine yerleştirin ve çalıştırılabilir yapın. UbuntuForum'larda aşağıdakiler keşfedildi ve benim için yeterliydi:

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

Kablosuz veya güvenilmez bir bağlantınız varsa, aşağıdakileri /etc/network/if-down.d/ dizinine yerleştirin:

#!/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
Bu benim için harika çalıştı. Çıktı syslog'a gidecek şekilde bunun yerine echostdout'a gönderilen logger -t mountsshfskomutları değiştirdiğimi not edeceğim .
Matthew

3

Upstart , düzenleme /etc/rc.localhala çalışıyor olsa da, şimdi Ubuntu'da başlangıç ​​komut dosyaları veya hizmetleri yayınlamak için tercih edilen bir yöntemdir . Upstart, servisin ne zaman çalıştırıldığını kontrol etmenizi sağlar ve ağ bağlantınızı başlattıktan sonra bunun gerçekleşmesini sağlar.

Ayrıca /etc/rc.Xd içindeki simgeleri doğrudan düzenlemek (kullandığınız çalışma düzeyi için X yerine) ve ağ kurulumundan sonra çalışmasını sağlamak için S99mount gibi bir ad eklemek de mümkündür. Bunun için, istediğiniz sshfs'yi bağlayan bir komut dosyasını göstermeniz gerekir.


3

Bir montaj seçeneği olarak _netdev bunu çözmeli, inanıyorum


biliyorum, ubuntu ve centos aynı değil ... ama centos zaten, bu /etc/init.d/netfs sshfs bağlar işlemek için doğru yoldur. ağ açıldıktan sonra çağrılacaktır.
anonim bir

1

Sadece bir düşünce, ama bunu bir dosya sunucusu olarak kullanıyorsanız, belki NFS veya Samba ssh'den daha iyi bir çözüm olacaktır.


0

Uzak ana makinenizden sertifika almamanız ve bunun yerine bir oturum açma adı / şifre kullanmanız gerektiğinde başka bir çözüm. Bu örnekte karışıklık eklemek için jldugger tarafından kullanılan aynı kullanıcı adı ve dizinleri kullanıyorum.

  1. Giriş dizininizde şifrenizi içeren bir dosya oluşturun ve güvenli hale getirin:

    echo 'YourRemoteUserPassword' > ~jldugger/.credentials
    chmod 600 ~jldugger/.credentials
    
  2. Düzenleyin /etc/rc.localdosya ve altta şu komutla insert, ancak "exit 0" önce:

    sshfs -o password_stdin -o nonempty jldugger@storage:/mnt/HD_a2/ /mnt/storage < ~jldugger/.credentials
    
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.