LinuxSir.cn,穿越时空的Linuxsir!

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

我写的一个自动mount各类分区的脚本(能为vfat分区加上iocharset参数)

[复制链接]
发表于 2004-8-14 18:22:41 | 显示全部楼层 |阅读模式
尽管这个脚本基本能用,但我还是有点不满意,请对此有兴趣的朋友一起帮我修改一下。
[PHP]#!/bin/bash
DDIR=/dev/discs
TMPFILE=/tmp/.tmpfile
if [ ! -d $DDIR ]; then exit; fi
if [ -f $TMPFILE ]; then rm -f $TMPFILE; fi
if [ -f /etc/profile.d/lang.sh ]; then
. /etc/profile.d/lang.sh
case $LANG in
   zh_CN*)
        MOUNTOPTIONS="iocharset=gb2312,codepage=936"
        ;;
   zh_TW*)
        MOUNTOPTIONS="iocharset=big5,codepage=950"
        ;;
   ja_JP*)
        MOUNTOPTIONS="iocharset=euc-jp,codepage=932"
        ;;
   ko_KR*)
        MOUNTOPTIONS="iocharset=euc-kr,codepage=949"
esac
fi

set `ls -aAbL "$DDIR"`
while [ "$1" ]; do
    fdisk -l `echo /dev/discs/"$1"/disc` >> $TMPFILE
    shift
done
ls -aAb1 $DDIR | while read DISC ; # list all files in directory
do
   ls -aAb1 "$DDIR/$DISC" | grep part | while read PART;
   do
      MYMOUNT="/mnt/$DISC$PART"
      if [ ! -d "$MYMOUNT" ]; then
         mkdir -p "$MYMOUNT"
         cat $TMPFILE | while read LINE ; do
         if echo $LINE | grep -i "FAT" | grep "$DDIR/$DISC/$PART"; then
             mount -t auto -o umask=0,$MOUNTOPTIONS "$DDIR/$DISC/$PART" "$MYMOUNT" >/dev/null 2>/dev/null
         elif echo $LINE | grep "$DDIR/$DISC/$PART"; then
             mount -t auto "$DDIR/$DISC/$PART" "$MYMOUNT" >/dev/null 2>/dev/null
         fi
         done
         if [ "$?" != 0 ]; then rmdir "$MYMOUNT"; fi
      fi
   done
done

if [ "$1" = "daemon" ]; then
   sleep 2
   $0 daemon &
fi
[/PHP]
 楼主| 发表于 2004-8-14 22:20:51 | 显示全部楼层

既然都加精了,让我更多投入一点吧。

第一个脚本的功能即可检测分区的类型。
Usage: fstype partition|disk
  1. #!/bin/bash
  2. if [ -n "$1" ]; then
  3. # Check if partition is already mounted
  4. while read device mountpoint filesystem relax; do
  5.   case "$device" in *$1*) echo "$filesystem"; exit 0;; esac
  6.   done <<EOT
  7. $(cat /proc/mounts)
  8. EOT

  9. # Check if a device/medium is present at all
  10. dd if="$1" count=1 bs=1k >/dev/null 2>&1 || exit 2
  11. FILE="$(LANG=C LC_ALL=C LC_MESSAGES=C file -Lkbs "$1")"
  12. [ "$?" = "0" ] || exit 3
  13. if [ "$FILE" = "data" ]; then
  14. # could still be ReiserFS, since "file" only reads 64k in Debian
  15.    FILE="$(dd if="$1" skip=16397 ibs=4 count=2 2>/dev/null)"
  16. fi
  17. case "$FILE" in
  18.   *[Rr][Ee][Ii][Ss][Ee][Rr]*)  echo "reiserfs";;
  19.   *ISO\ 9660*)                 echo "iso9660";;
  20.   *[Mm][Ii][Nn][Ii][Xx]*)      echo "minix";;
  21.   *[Xx][Ff][Ss]*)              echo "xfs";;
  22.   *[Jj][Ff][Ss]*)              echo "jfs";;
  23.   *[Ee][Xx][Tt]3*)             echo "ext3";;
  24.   *[Ee][Xx][Tt]2*)             echo "ext2";;
  25.   *[Ss][Ww][Aa][Pp]*)          echo "swap";;
  26.   *[Nn][Tt][Ff][Ss]*)          echo "ntfs";;
  27.   *[Ff][Aa][Tt]*)              echo "vfat";;
  28.   *)                           echo "auto";;
  29. esac
  30. else
  31. echo "Usage: $0 partition|disk" >&2
  32. echo "   returns "partition fstype" lines to stdout." >&2
  33. exit 1
  34. fi
  35. exit 0
复制代码


下面的脚 本将调用以上脚本:

  1. #!/bin/bash
  2. DDIR=/dev/discs
  3. if [ ! -d $DDIR ]; then exit; fi
  4. if [ -f /etc/profile.d/lang.sh ]; then
  5. . /etc/profile.d/lang.sh
  6. case $LANG in
  7.    zh_CN*)
  8.         MOUNTOPTIONS="iocharset=gb2312,codepage=936"
  9.         ;;
  10.    zh_TW*)
  11.         MOUNTOPTIONS="iocharset=big5,codepage=950"
  12.         ;;
  13.    ja_JP*)
  14.         MOUNTOPTIONS="iocharset=euc-jp,codepage=932"
  15.         ;;
  16.    ko_KR*)
  17.         MOUNTOPTIONS="iocharset=euc-kr,codepage=949"
  18. esac
  19. fi

  20. ls -aAb1 $DDIR | while read DISC ; # list all files in directory
  21. do
  22.    ls -aAb1 "$DDIR/$DISC" | grep part | while read PART;
  23.    do
  24.       MYMOUNT="/mnt/$DISC$PART"
  25.       if [ ! -d "$MYMOUNT" ]; then
  26.          mkdir -p "$MYMOUNT"
  27.           if echo `/usr/bin/fstype "$DDIR/$DISC/$PART"` | grep -i "vfat" || grep -i "ntfs" >/dev/null 2>/dev/null; then
  28.              mount -t auto -o umask=0,$MOUNTOPTIONS "$DDIR/$DISC/$PART" "$MYMOUNT" >/dev/null 2>/dev/null
  29.           else
  30.              mount -t auto "$DDIR/$DISC/$PART" "$MYMOUNT" >/dev/null 2>/dev/null
  31.           fi
  32.          if [ "$?" != 0 ]; then rmdir "$MYMOUNT"; fi
  33.       fi
  34.    done
  35. done

  36. if [ "$1" = "daemon" ]; then
  37.    sleep 2
  38.    $0 daemon &
  39. fi

复制代码
发表于 2004-8-14 22:28:21 | 显示全部楼层
Very exciting, very practical script ...  Admire
 楼主| 发表于 2004-9-9 20:51:37 | 显示全部楼层
这一行:
if echo `/usr/bin/fstype "$DDIR/$DISC/$PART"` | grep -i "vfat" || grep -i "ntfs" >/dev/null 2>/dev/null; then
应该改为:
if echo `/usr/bin/fstype "$DDIR/$DISC/$PART"` | grep -i "vfat" >/dev/null 2>/dev/null || echo `/usr/bin/fstype "$DDIR/$DISC/$PART"` grep -i "ntfs" >/dev/null 2>/dev/null || echo `/usr/bin/fstype "$DDIR/$DISC/$PART"` | grep -i "cd9660" >/dev/null 2>/dev/null; then
发表于 2004-9-10 14:30:58 | 显示全部楼层
用中文输入的人应该都是中国人,所以
[PHP]if [ $LC_CTYPE == zh_CN ]; then
MOUNTOPTIONS="iocharset=gb2312,codepage=936";
fi[/PHP]
纯个人意见,刚学shell
发表于 2004-9-11 01:04:39 | 显示全部楼层
只用 iocharset=cp936 就行了
发表于 2004-9-11 14:42:26 | 显示全部楼层
gao shou
发表于 2004-9-13 11:52:08 | 显示全部楼层
何必如此麻烦。
现在大多数兄弟都使用内核2.6,mount -o nls=cp936 /dev/hdaX /mnt/tmpdisk即可,文件系统不必加上,一般情况下内核会自动加载模块的(除了squashfs等补丁模块)。
发表于 2004-9-18 21:00:13 | 显示全部楼层
受哈蜜瓜版主的启发,重新做了一个自动加载分区脚本,请大家指正:
1、将下面脚本保存为/usr/sbin/fstype:
--------------------------------------------
#!/bin/sh

#节选自哈蜜瓜写的自动加载分区脚本。

FILE="$(LANG=C LC_ALL=C LC_MESSAGES=C file -Lkbs "$1")"

if [ "$FILE" = "data" ]; then
# could still be ReiserFS, since "file" only reads 64k in Debian
   FILE="$(dd if="$1" skip=16397 ibs=4 count=2 2>/dev/null)"
fi
case "$FILE" in
  *[Rr][Ee][Ii][Ss][Ee][Rr]*)  echo "reiserfs";;
#  *ISO\ 9660*)                 echo "iso9660";;
  *[Mm][Ii][Nn][Ii][Xx]*)      echo "minix";;
  *[Xx][Ff][Ss]*)              echo "xfs";;
  *[Jj][Ff][Ss]*)              echo "jfs";;
  *[Ee][Xx][Tt]3*)             echo "ext3";;
  *[Ee][Xx][Tt]2*)             echo "ext2";;
#  *[Ss][Ww][Aa][Pp]*)          echo "swap";;
  *[Nn][Tt][Ff][Ss]*)          echo "ntfs";;
  *[Ff][Aa][Tt]*)              echo "vfat";;
#  *)                           echo "auto";;
esac
---------------------------------------------------
2、将下面脚本放到/etc/rc.d/rc.local里,以便每次开机自动运行:

---------------------------------------------------
#自动检测加载分区
if [ -f /etc/profile.d/lang.sh ]; then
. /etc/profile.d/lang.sh
case $LANG in
   zh_CN*)
        MOUNTOPTIONS="iocharset=cp936"
        ;;
   zh_TW*)
        MOUNTOPTIONS="iocharset=cp950"
        ;;
   ja_JP*)
        MOUNTOPTIONS="iocharset=cp932"
        ;;
   ko_KR*)
        MOUNTOPTIONS="iocharset=cp949"
esac
fi

if [ ! -f /etc/fstab ];then
        touch /etc/fstab
fi

#for ide devices
for i in $(ls -d /proc/ide/h*);do
        if cat $i/media |grep -i disk >/dev/null;then
                for j in $(/sbin/fdisk -l /dev/$(basename $i)|cut -c1-10|grep  hd);do
                        LABEL=$(e2label $j 2>/dev/null)
                        FSTYPE=$(/usr/sbin/fstype $j)
                        if [ ! -z $FSTYPE ];then
                                if [ -z $LABEL ];then
                                        if ! grep -Rn "$j " /etc/fstab >/dev/null;then
                                                MYMOUNT="/mnt/$(basename $j)"
                                                if [ ! -d "$MYMOUNT" ]; then
                                                        mkdir -p "$MYMOUNT"
                                                fi
                                                if echo $FSTYPE|grep -i vfat >/dev/null|| echo $FSTYPE|grep -i ntfs >/dev/null;then
                                                        echo "$j   $MYMOUNT   $FSTYPE $MOUNTOPTIONS,umask=0,exec 0 0" >>/etc/fstab
                                                        mount -t $FSTYPE -o $MOUNTOPTIONS,umask=0,exec,rw $j $MYMOUNT 2>/dev/null
                                                else
                                                        echo "$j   $MYMOUNT   $FSTYPE   defaults   0 0" >>/etc/fstab
                                                        mount -t $FSTYPE -o defaults $j $MYMOUNT 2>/dev/null
                                                fi
                                        fi
                                else
                                        if ! grep -Rn "$j " /etc/fstab >/dev/null && ! grep -Rn LABEL=$LABEL /etc/fstab >/dev/null;then
                                                MYMOUNT="/mnt/$(basename $j)"
                                                if [ ! -d "$MYMOUNT" ]; then
                                                        mkdir -p "$MYMOUNT"
                                                fi
                                                if echo $FSTYPE|grep -i vfat >/dev/null || echo $FSTYPE|grep -i ntfs >/dev/null;then
                                                        echo "$j   $MYMOUNT   $FSTYPE $MOUNTOPTIONS,umask=0,exec 0 0" >>/etc/fstab
                                                        mount -t $FSTYPE -o $MOUNTOPTIONS,umask=0,exec,rw $j $MYMOUNT 2>/dev/null
                                                else
                                                        echo "$j   $MYMOUNT   $FSTYPE   defaults   0 0" >>/etc/fstab
                                                        mount -t $FSTYPE -o defaults $j $MYMOUNT 2>/dev/null
                                                fi
                                        fi
                                fi
                        fi
                done
        elif cat $i/media |grep -i cdrom >/dev/null;then
                if ! grep -Rn $(basename $i) /etc/fstab >/dev/null;then
                        MYMOUNT="/mnt/cdrom-$(basename $i)"
                        if [ ! -d "$MYMOUNT" ]; then
                                mkdir -p "$MYMOUNT"
                        fi
                        echo "/dev/$(basename $i)   $MYMOUNT   udf,iso9660  $MOUNTOPTIONS,user,noauto  0 0" >>/etc/fstab
                fi
        fi
done

# for scsi devices,now only for sata.
if cat /proc/scsi/scsi |grep Direct >/dev/null;then
        for j in $(/sbin/fdisk -l /dev/sda|cut -c1-10|grep  'sda');do
                LABEL=$(e2label $j 2>/dev/null)
                FSTYPE=$(/usr/sbin/fstype $j)
                if [ ! -z $FSTYPE ];then
                        if [ -z $LABEL ];then
                                if ! grep -Rn "$j " /etc/fstab >/dev/null;then
                                        MYMOUNT="/mnt/$(basename $j)"
                                        if [ ! -d "$MYMOUNT" ]; then
                                                mkdir -p "$MYMOUNT"
                                        fi
                                        if echo $FSTYPE|grep -i vfat >/dev/null || echo $FSTYPE|grep -i ntfs >/dev/null;then
                                                echo "$j   $MYMOUNT   $FSTYPE $MOUNTOPTIONS,umask=0,exec 0 0" >>/etc/fstab
                                                mount -t $FSTYPE -o $MOUNTOPTIONS,umask=0,exec,rw $j $MYMOUNT 2>/dev/null
                                        else
                                                echo "$j   $MYMOUNT   $FSTYPE defaults   0 0" >>/etc/fstab
                                                mount -t $FSTYPE -o defaults $j $MYMOUNT 2>/dev/null
                                        fi
                                fi
                        else
                                if ! grep -Rn "$j " /etc/fstab >/dev/null && ! grep -Rn LABEL=$LABEL /etc/fstab >/dev/null;then
                                        MYMOUNT="/mnt/$(basename $j)"
                                        if [ ! -d "$MYMOUNT" ]; then
                                                mkdir -p "$MYMOUNT"
                                        fi
                                        if echo $FSTYPE|grep -i vfat >/dev/null || echo $FSTYPE|grep -i ntfs >/dev/null;then
                                                echo "$j   $MYMOUNT   $FSTYPE $MOUNTOPTIONS,umask=0,exec 0 0" >>/etc/fstab
                                                mount -t $FSTYPE -o $MOUNTOPTIONS,umask=0,exec,rw $j $MYMOUNT 2>/dev/null
                                        else
                                                echo "$j   $MYMOUNT   $FSTYPE defaults   0 0" >>/etc/fstab
                                                mount -t $FSTYPE -o defaults $j $MYMOUNT 2>/dev/null
                                        fi
                                fi
                        fi
                fi
        done
elif cat /proc/scsi/scsi |grep CD-ROM >/dev/null;then
        if ! grep -Rn sda /etc/fstab >/dev/null;then
        MYMOUNT="/mnt/cdrom-sda"
        if [ ! -d "$MYMOUNT" ]; then
                mkdir -p "$MYMOUNT"
        fi
        echo "/dev/sda   $MYMOUNT   udf,iso9660  $MOUNTOPTIONS,user,noauto  0 0" >>/etc/fstab
        fi
fi
发表于 2004-10-27 08:42:25 | 显示全部楼层
在knoppix , morphix , gnoppix 等live cd 中, 已经有了auto-buildfstab
可以实现类似功能(不会根基$LANG or $LC_CTYPE来处理不同的语言环境)

因为我正在定制morphix(不想定制base-module, auto-buildfstab 在其中)
想在auto-buildfstab生成的fstab基础上,给vfat , ntfs 分区加上iocharset / codepage 选项,
能否帮忙写一个script : fstab-convert.sh
"fstab-convert.sh  fstab.org  fstasb.cn"

请指教!谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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