LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1399|回复: 7

自动挂载移动设备或未挂载分区的脚本

[复制链接]
发表于 2007-11-18 22:07:24 | 显示全部楼层 |阅读模式
太懒了,每次插入不同的USB设备总是要手动去挂载一下,而且我机子上并不是开机都把所有分区都挂上去的,想要挂载时就觉得麻烦。这个脚本就是从"fdisk -l"的输出判断设备名以及对应的文件系统,然后在从df里查查是否已经挂载了,如果没有挂载就挂载她了。不过还是存在一些问题,在判断文件系统时用的是"fdisk -l"的"id"项,好像reiserfs和ext3都是83,所以如果同时存在reiserfs和ext3分区时可能会出错误(本本上除过swap就都是ext3,所以不敢保证)。另外在网上没有找到关于文件系统id的资料,所以在那个case里只列出了我知道的一些id,谁知道发我一份好么。
不过,自己动手写写脚本才知道看人家写的貌似很容易,自己写原来相当不容易,加起来花了有3个多小时。有些粗糙加罗唆,没办法呀,就这质量了。^_^
  1. #!/bin/bash
  2. # author: adamzyg
  3. # encoding: UTF-8
  4. # date: 2007/11/18
  5. EX_NOPERM=77    # check the file /usr/include/sysexits.h
  6. EX_STATUS=0
  7. TEMPFDISK="/tmp/device.$$"
  8. TEMPDF="/tmp/mounted.$$"
  9. MountOption="umask=0"
  10. MountDir="/media/"
  11. ID=$(id -u)
  12. if [[ $ID -ne 0 ]]
  13. then
  14.     echo "This script should run with "root" accese."
  15.     exit ${EX_NOPERM}
  16. fi
  17. touch ${TEMPFDISK}
  18. /sbin/fdisk -l | grep "^/dev/\w" | sed -e '/Extended/d' -e '/swap/d' > ${TEMPFDISK}
  19. # I think the "Extended" and "swap" partitions should be ignore.
  20. touch ${TEMPDF}
  21. df > ${TEMPDF}
  22. moutdevice()
  23. {
  24.     local filesystem
  25.     local dir
  26.     case $2 in         # here is some error about id
  27.                         # because "id" is the same of reiserfs and ext3 about the result of "fdisk -l"
  28.         6)
  29.         filesystem=vfat
  30.         ;;
  31.         b)
  32.         filesystem=vfat
  33.         ;;
  34.         7)
  35.         filesystem=ntfs
  36.         ;;
  37.         83)
  38.         filesystem=ext3
  39.         ;;
  40.     esac
  41.     dir="${MountDir}`basename $1`"
  42.     if [ ! -d "$dir" ]
  43.     then
  44.         mkdir -p "$dir"
  45.     fi
  46.    
  47.     if /bin/mountpoint -q -d "$dir" > /dev/null    # judge the dir is(not) a mountpoint
  48.     then                                           # $dir has been mounted some device
  49.         dir="${dir}1"                             # I think this dir should not have been mounted.
  50.                                                     # But if unfortunately, it is also a mountpoint. So bad!
  51.         if [ -d "$dir" ]
  52.         then
  53.             mkdir -p "$dir"
  54.         fi
  55.     fi
  56.     /bin/mount -t ${filesystem} -o ${MountOption} $1 $dir
  57.     if [ $? ]
  58.     then
  59.         echo "$1 has been mounted on $dir with option ${MountOption} just now!"
  60.         return 0
  61.     else
  62.         echo "Some error happen between mount with return $?."
  63.         return 1
  64.     fi
  65. }
  66. exec 3<&0           # store the STDIN
  67. while read line
  68. do
  69.     device=$(gawk '{print $1}' <(echo "$line"))        # device name
  70.     if grep -q "\*" <(echo "$line")
  71.     then
  72.         filesystem=$(gawk '{print $6}' <(echo "$line"))   # device filesystem
  73.     else
  74.         filesystem=$(gawk '{print $5}' <(echo "$line"))
  75.     fi
  76.     if ! grep -q $device ${TEMPDF}                 # check the device
  77.     then
  78.         echo "$device not mounted."
  79.         PS3="Choose mount it now: "
  80.         select answer in "Yes" "No"
  81.         do
  82.             if [[ $answer = "Yes" ]]
  83.             then
  84.                 moutdevice $device $filesystem
  85.                 if [ $? -ne 0 ]
  86.                 then
  87.                     echo "Maybe we should stop now."
  88.                     EX_STATUS=1
  89.                     break 2
  90.                 fi
  91.             else
  92.                 echo "$device still not mounted."
  93.             fi
  94.             break
  95.         done <&3  # read answer from STDIN
  96.     fi
  97. done < ${TEMPFDISK}
  98. exec 0<&3
  99. exec 3<&-
  100. rm -f ${TEMPFDISK} ${TEMPDF}
  101. exit $EX_STATUS
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2007-11-18 23:21:50 | 显示全部楼层
hmmm...好困,内容没精力今晚看了...
提醒一下:UTF-8写成是“encoding”比较正规
还有脚本里warning和error信息应送到stderr——好习惯而已...
回复 支持 反对

使用道具 举报

发表于 2007-11-19 01:32:06 | 显示全部楼层
fdisk 里有 fs 的id


  1. 0  Empty           1e  Hidden W95 FAT1 80  Old Minix       be  Solaris boot
  2. 1  FAT12           24  NEC DOS         81  Minix / old Lin bf  Solaris
  3. 2  XENIX root      39  Plan 9          82  Linux swap / So c1  DRDOS/sec (FAT-
  4. 3  XENIX usr       3c  PartitionMagic  83  Linux           c4  DRDOS/sec (FAT-
  5. 4  FAT16 <32M      40  Venix 80286     84  OS/2 hidden C:  c6  DRDOS/sec (FAT-
  6. 5  Extended        41  PPC PReP Boot   85  Linux extended  c7  Syrinx
  7. 6  FAT16           42  SFS             86  NTFS volume set da  Non-FS data
  8. 7  HPFS/NTFS       4d  QNX4.x          87  NTFS volume set db  CP/M / CTOS / .
  9. 8  AIX             4e  QNX4.x 2nd part 88  Linux plaintext de  Dell Utility
  10. 9  AIX bootable    4f  QNX4.x 3rd part 8e  Linux LVM       df  BootIt
  11. a  OS/2 Boot Manag 50  OnTrack DM      93  Amoeba          e1  DOS access
  12. b  W95 FAT32       51  OnTrack DM6 Aux 94  Amoeba BBT      e3  DOS R/O
  13. c  W95 FAT32 (LBA) 52  CP/M            9f  BSD/OS          e4  SpeedStor
  14. e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a0  IBM Thinkpad hi eb  BeOS fs
  15. f  W95 Ext'd (LBA) 54  OnTrackDM6      a5  FreeBSD         ee  EFI GPT
  16. 10  OPUS            55  EZ-Drive        a6  OpenBSD         ef  EFI (FAT-12/16/
  17. 11  Hidden FAT12    56  Golden Bow      a7  NeXTSTEP        f0  Linux/PA-RISC b
  18. 12  Compaq diagnost 5c  Priam Edisk     a8  Darwin UFS      f1  SpeedStor
  19. 14  Hidden FAT16 <3 61  SpeedStor       a9  NetBSD          f4  SpeedStor
  20. 16  Hidden FAT16    63  GNU HURD or Sys ab  Darwin boot     f2  DOS secondary
  21. 17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fd  Linux raid auto
  22. 18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fe  LANstep
  23. 1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid ff  BBT
  24. 1c  Hidden W95 FAT3 75  PC/IX
复制代码


很显然
把83的id当做ext3是不正确的
实际上, 只要是id为83 一般都不需要带参数挂载(除非自己需要)

P.S.
很多发行版上装的是mawk而不是gawk
回复 支持 反对

使用道具 举报

发表于 2007-11-19 08:41:10 | 显示全部楼层
如果使用了udev的话:

/proc/partitions 是每个被内核识别了的分区的列表
/proc/mounts 是内核已经挂载了的文件系统
/proc/swaps 是内核已经挂载了的交换分区(或交换文件)

/lib/udev/vol_id 可以获取某个分区的文件系统类型
比如
fstype=$(/lib/udev/vol_id --type /dev/??? 2>/dev/null)
如果不能够识别,就返回空

grep "/dev/???" /proc/mounts &>/dev/null
[ $? -eq 0 ]  表示已经挂载了
回复 支持 反对

使用道具 举报

发表于 2007-11-19 08:56:36 | 显示全部楼层
[color="Magenta"]我也试着写了一个
  1. #!/bin/bash
  2. iocharset="gb2312"
  3. nls="cp936"
  4. codepage="936"
  5. utf8=0
  6. i=0
  7. while read null null null dev
  8. do
  9.         ((i++))
  10.         [ $i -le 2 ] && continue
  11.         grep "/dev/${dev}" /proc/mounts &>/dev/null
  12.         [ $? -eq 0 ] && continue
  13.         fstype=$(/lib/udev/vol_id --type "/dev/${dev}" 2>/dev/null)
  14.         [ -z "$fstype" ] && continue  #unknown fstype
  15.         case $fstype in
  16.                 swap)
  17.                         grep "/dev/${dev}" /proc/swaps &>/dev/null
  18.                         [ $? -eq 0 ] && continue  #swap always mount
  19.                         echo /sbin/swapon "/dev/${dev}"
  20.                         continue
  21.                         ;;
  22.                 ntfs)
  23.                         mountoption="-o nls=${nls}"
  24.                         [ $utf8 -eq 1 ] && mountoption="-o nls=utf8"
  25.                         ;;
  26.                 vfat)
  27.                         mountoption="-o codepage=${codepage},iocharset=${iocharset}"
  28.                         [ $utf8 -eq 1 ] && mountoption="-o utf8"
  29.                         ;;
  30.                 *)
  31.                         mountoption=""
  32.                         ;;
  33.         esac
  34.         [ ! -d "/mnt/${dev}" ] && mkdir "/mnt/${dev}"  #mount on /mnt/dev
  35.         echo /bin/mount -t ${fstype} $mountoption "/dev/${dev}" "/mnt/${dev}"
  36.        
  37. done </proc/partitions
复制代码

[color="Magenta"]上面的脚本中最后是用echo来显示实际的挂载动作,如果需要做实际的挂载,只要把echo去掉(保留echo后面的部分)就可以了
如果有swap分区的话,也会自动挂载的(只要把echo部分去掉就可以了)
回复 支持 反对

使用道具 举报

发表于 2007-11-20 00:11:32 | 显示全部楼层
vol_id似乎不是在所有的发行版中带有?
回复 支持 反对

使用道具 举报

发表于 2007-11-20 00:17:42 | 显示全部楼层

  1. grep "/dev/${dev}" /proc/mounts &>/dev/null
复制代码

这里可能会有个小问题
sda1和sda11将区分不开来:)
回复 支持 反对

使用道具 举报

发表于 2007-11-21 14:10:22 | 显示全部楼层
Post by huan;1784901

  1. grep "/dev/${dev}" /proc/mounts &>/dev/null
复制代码

这里可能会有个小问题
sda1和sda11将区分不开来:)



真是这样,不过,如果改成
grep "/dev/${dev} " /proc/mounts &>/dev/null
的话,应该没有问题

没有考虑到还有2位数的分区,疏忽了

对于vol_id,是udev的一个部分,如果是使用udev的话,应该没有问题
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表