zoukankan      html  css  js  c++  java
  • 在GNU/Linux下使用命令行自动挂载与卸载USB磁盘

    在命令行环境下如果每次都是靠手动敲入mount与umount命令来挂载与卸载USB磁盘是件很麻烦的事情。尤其是mount命令的参数非常多。比如,磁盘的分区类型(vfat、ntfs等),挂载的目录节点,以何种用户和组的身份来挂载(uid与gid),挂载后文件与文件夹的权限(umask)等等。于是,自己编写了两个脚本程序来分别实现自动挂载与卸载USB磁盘。现在分别介绍如下。

    首先是加载USB磁盘的 auto_mount.sh 脚本,使用它可以自动提取与设置mount命令所需的参数,执行mount命令,检查是否挂载成功:

    • 使用 whoamiid 命令获取当前登录用户的 uidgid
    user_name=`whoami`
    user_id=`id -u $user_name`
    user_group_id=`id -g $user_name`
    
    • 使用 udisks 命令获得磁盘分区的名称(volume label)与类型,如果指定分区没有volume label,则自动设为 disk
    vol_label=`udisks --show-info "$1" | gawk '/label:.*[[:alnum:]]+/ {print tolower($2); exit}'`
    vol_type=`udisks --show-info "$1" | gawk '/type:.*[[:alnum:]]+/ {print $2; exit}'`
    
    • 调用 mount 命令,将指定的磁盘设备以上述参数挂载到 /media/$vol_label 目录。其中, umask 设为 002 ,即将挂载后的文件与文件夹权限设为 775 。所用的 mount 命令如下,其中参数 $1auto_mount.sh 命令行参数所指定的磁盘设备节点,比如 /dev/sdb1
    sudo mount -t $vol_type "$1" "/media/$vol_label" -o uid=$user_id,gid=$user_group_id,umask=002
    
    • 最后,查看 /etc/mtab 文件中是否已包含目录 /media/$vol_label ,从而验证是否挂载成功。

    auto_mount.sh 源代码如下所示:

    #!/bin/bash
    
    # Automount a usb disk
    
    script_name="auto_mount.sh"
    script_usage=$(cat <<EOF
    auto_mount.sh [OPTIONS] [DEVICE FOR DISK]
    EOF
    )
    script_function=$(cat <<EOF
    Automatically mount a disk to a folder beneath /media whose name is the volume label of the disk.
    EOF
    )
    script_doc=$(cat <<EOF
    -h     Display this help.
    EOF
    )
    script_examples=$(cat <<EOF
    auto_mount.sh /dev/sdd1
    EOF
    )
    state_prefix="==="
    warning_prefix="***"
    error_prefix="!!!"
    
    function display_help() {
        if [ -n "$script_usage" ]; then
            echo -e "Usage: $script_usage"
        fi
    
        if [ -n "$script_function" ]; then
            echo -e "$script_function"
        fi
    
        if [ -n "$script_doc" ] ; then
            echo -e "
    $script_doc"
        fi
    
        if [ -n "$script_examples" ]; then
            echo -e "
    Examples"
            echo -e "$script_examples"
        fi
    }
    
    # Process command options
    while getopts ":h" opt; do
        case $opt in
            h  )  display_help
                exit 0 ;;
            ? )  display_help
                exit 1 ;;
        esac
    done
    shift $(($OPTIND - 1))
    
    if [ $OSTYPE = 'linux-gnu' ]; then
        # Default volume label if the mounted disk does not have one.
        vol_label_default=disk
    
        if [ -n "$1" ]; then
            if [ -e "$1" ]; then
                user_name=`whoami`
                user_id=`id -u $user_name`
                user_group_id=`id -g $user_name`
                vol_label=`udisks --show-info "$1" | gawk '/label:.*[[:alnum:]]+/ {print tolower($2); exit}'`
                vol_type=`udisks --show-info "$1" | gawk '/type:.*[[:alnum:]]+/ {print $2; exit}'`
                # Create a directory in /media and chown it into the current user and group
                if [ -d "/media/$vol_label" ]; then
                    echo "$warning_prefix /media/$vol_label already exists!"
                    if [ -n "`cat /etc/mtab | grep /media/$vol_label`" ]; then
                        echo "$warning_prefix A device has already been mounted to the path /media/$vol_label!"
                        exit 0
                    fi
                else
                    if [ -n "$vol_label" ]; then
                        echo "$state_prefix Create /media/$vol_label..."
                    else
                        echo "$warning_prefix The device $1 has no volume label, a default path /media/$vol_label_default will be used!"
                        vol_label=$vol_label_default
                    fi
                    sudo mkdir "/media/$vol_label"
                fi
    
                # Mount the disk
                sudo mount -t $vol_type "$1" "/media/$vol_label" -o uid=$user_id,gid=$user_group_id,umask=002
                if [ -n "`cat /etc/mtab | grep /media/$vol_label`" ]; then
                    echo "$state_prefix The disk $1 has been successfully mounted to /media/$vol_label!"
                else
                    echo "$error_prefix Failed to mount the disk $1 to /media/$vol_label!"
                fi
            else
                echo "$warning_prefix Please provide a valid device name!"
            fi
        else
            echo "$warning_prefix Please provide a device name!"
        fi
    else
        echo "$warning_prefix Operating system or host name is not supported!"
    fi
    

    然后,按如下方式运行 auto_mount.sh 即可自动挂载USB磁盘:

    auto_mount.sh /dev/sdb1
    

    接下来要介绍的 auto_umount.sh 脚本就很简单了。只要用户指定磁盘所挂载的文件夹,该脚本会检查该文件夹是否存在于 /etc/mtab 文件。若存在,则调用 umount 命令,然后删除上述文件夹。其源码如下:

    #!/bin/bash
    
    # Auto unmount a disk
    
    script_name="auto_umount.sh"
    script_usage=$(cat <<EOF
    auto_umount.sh [OPTIONS] [MOUNTED PATH OF DISK]
    EOF
    )
    script_function=$(cat <<EOF
    Automatically umount a disk which has been mounted on the specified path.
    EOF
    )
    script_doc=$(cat <<EOF
    -h     Display this help.
    EOF
    )
    script_examples=$(cat <<EOF
    auto_umount.sh /media/data
    EOF
    )
    state_prefix="==="
    warning_prefix="***"
    error_prefix="!!!"
    
    function display_help() {
        if [ -n "$script_usage" ]; then
            echo -e "Usage: $script_usage"
        fi
    
        if [ -n "$script_function" ]; then
            echo -e "$script_function"
        fi
    
        if [ -n "$script_doc" ] ; then
            echo -e "
    $script_doc"
        fi
    
        if [ -n "$script_examples" ]; then
            echo -e "
    Examples"
            echo -e "$script_examples"
        fi
    }
    
    # Process command options
    while getopts ":h" opt; do
        case $opt in
            h  )  display_help
                exit 0 ;;
            ? )  display_help
                exit 1 ;;
        esac
    done
    shift $(($OPTIND - 1))
    
    if [ $OSTYPE = 'linux-gnu' ]; then
        if [ -n "$1" ]; then
            if [ -e "$1" ]; then
                if [ -n "`cat /etc/mtab | grep ${1%/}`" ]; then
                    sudo umount "$1"
                    sudo rmdir "$1"
                    if [ -n "`cat /etc/mtab | grep ${1%/}`" ]; then
                        echo "$error_prefix Failed to unmount the device from the path $1!"
                    else
                        echo "$state_prefix Device has been successfully umounted from the path $1!"
                    fi
                else
                    echo "$warning_prefix No device has been mounted to $1!"
                fi
            else
                echo "$warning_prefix Please provide a valid mounted path name!"
            fi
        else
            echo "$warning_prefix Please provide a mounted path name!"
        fi
    else
        echo "$warning_prefix Operating system or host name is not supported!"
    fi
    
  • 相关阅读:
    iOS 键盘回收实现步骤
    Xcode 向6.0以后版本添加iOS开发空白模板
    popViewControllerAnimated 后,对页面内UITableView 内数据刷新
    指针,数组,字符串
    求解 s = (1*1)!+(2*2)! + (3*3)!+...+(n*n)! (C语言)
    sqlserver分页;mysql分页;orcale分页 的sql 查询语句
    实现strlen,strcpy,strcat,strcmp同功能的函数stringLength,stringCopy,stringCatch,stringCompare
    对字符串(英文)从小到大排序
    二维数组名作为实参或者形参
    联合与枚举 、 高级指针 、 C语言标准库(一)
  • 原文地址:https://www.cnblogs.com/quantumman/p/4643998.html
Copyright © 2011-2022 走看看