在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 "\n$script_doc"
    fi

    if [ -n "$script_examples" ]; then
        echo -e "\nExamples"
        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 "\n$script_doc"
    fi

    if [ -n "$script_examples" ]; then
        echo -e "\nExamples"
        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
时间: 2024-12-15 01:46:57

在GNU/Linux下使用命令行自动挂载与卸载USB磁盘的相关文章

如何在Linux下使用命令行嗅探HTTP流量

通常我们在调试Web应用.RESTFUL服务或者排错PAC (proxy auto config) 以及检查是否有恶意访问等会去通过错误日志日志或者嗅探数据包的方式去排错:常见的嗅探数据包软件有tcpdump.wireshark;但是针对HTTP需要对数据包进行过滤,显示格式也更不容易读,Httpry工具就能更方便易读的嗅探HTTP流量 安装httpry 基于Debian(Ubuntu or Linux Mint),基础库并没有httpry包,我们用源码来安装 1 2 3 4 5 $ sudo

Linux下使用命令行配置IPMI

ipmitool是什么: 百度百科给的解释已经够用了,简单说就是“IPMI(Intelligent Platform Management Interface)即智能平台管理接口是使硬件管理具备“智能化”的新一代通用接口标准.用户可以利用 IPMI 监视服务器的物理特征,如温度.电压.电扇工作状态.电源供应以及机箱入侵等. IPMI配置管理IP方法有: 1.BIOS配置,这个简单,直接开机进BIOS,在进阶选项里配置IPMI的IP,掩码,网关. 2.开机过程中,按照提示,按ctrl + E 进入

linux下git命令行的颜色配置

在Windows系统中安装了git客户端之后在git bash中用git命令 git status,git diff等时,修改过的文件自动显示为红色.在linux中git安装后颜色是不自动设置的.下面的命令设置git的颜色: git config --global color.status auto git config --global color.diff auto git config --global color.branch auto git config --global color

Linux下用命令行查询memcache的所有keys

1.telnet 10.10.24.106 11211 2.stats items STAT items:23:number 2 STAT items:23:age 934861 STAT items:23:evicted 0 STAT items:23:evicted_nonzero 0 STAT items:23:evicted_time 0 STAT items:23:outofmemory 0 STAT items:23:tailrepairs 0 STAT items:23:recla

linux下插入U盘自动挂载后,用C获取其挂载点(cat /proc/mounts)

现在已经能够通过libudev获取U盘插入时它的节点名(通过函数udev_device_get_devnode()),是/dev/sdb1 我现在的做法是读取/proc/mounts文件,找到有/dev/sdb1的那一行,解析出挂载点/media/11111 /proc/mounts文件内容如下: sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0 proc /proc proc rw,nosuid,nodev,noexec,relatime

Windows命令行(cmd)下快速查找文件(类似Linux下find命令)

for /r 用法简介 用了Linux下的find命令,觉得查找文件很方便,那么在windows下有没有类似的命令可以遍历目录并通过文件名找到文件呢?答案是有: Windows下的 for /r 命令具有与Linux下 find 命令类似的功能,使用语法上类似: find /r 目录名 %变量名 in (匹配模式1,匹配模式2) do 命令 匹配模式可以是通配类似于: *.jpg:所有.jpg后缀的文件 *test*:所有名称中包含test的文件 注意: 1. 匹配模式中至少带上1个*号 2.

linux下常用命令备忘

转自:Linux 命令集锦 linux下查看监听端口对应的进程 # lsof -i:9000 # lsof -Pnl +M -i4 如果退格键变成了:"^h". 终端连接unix删除退格键,按住CTL键同时按delete Linux搜索 # find / -name "xxx.conf" 查看linux是32位还是64位的命令 #file /sbin/init #getconf LONG_BIT #getconf -a 在Linux和Windows下都可以用nslo

Linux下ls命令显示符号链接权限为777的探索

Linux下ls命令显示符号链接权限为777的探索 --深入ls.链接.文件系统与权限 一.摘要 ls是Linux和Unix下最常使用的命令之一,主要用来列举目录下的文件信息,-l参数允许查看当前目录下所有可见文件的详细属性,包括文件属性.所有者.文件大小等信息.但是,当其显示符号链接的属性时,无论其指向文件属性如何,都会显示777,即任何人可读可写可执行.本文从ls命令源码出发,由浅入深地分析该现象的原因,简略探究了Linux 4.10下的符号链接链接.文件系统与权限的源码实现. 关键词:Li

我在GNU/Linux下使用的桌面环境工具组合

为了使GNU/Linux桌面环境下加载的程序较少以节省内存资源和提高启动时间,我目前并不使用重量级的桌面环境KDE和Gnome,甚至连登录窗界面gdm或xdm都不用,而是直接启动到控制台,登录后调用startx进入X视窗环境.所使用的工具组合列举如下: X视窗环境启动:startx 窗口管理器:Sawfish amixer:系统音量设置 键盘与鼠标配置:xmodmap 网络管理器:wicd(需删除NetworkManager) xscreensaver:屏幕保护程序 类似于Windows的底部工