The following perl script is useful in following cases:
1. Mounting/Unmounting(-u flag for unmounting) partitions in external drives.
2. Mounting/Unmounting partitions of internal drives too (-d
3. This script also recognizes single vfat(FAT32) partition(When filesystem was created across the entire device: please refer mkfs.vfat -I) pen-drive too.
4. Others (if you find anything else, please comment :) )
#!/usr/bin/perl -w #=============================================================================== # # FILE: mount_usb_disks.pl # # USAGE: ./mount_usb_disks.pl # # DESCRIPTION: Mount USB disks or pendrive # # OPTIONS: --- # REQUIREMENTS: --- # BUGS: --- # NOTES: --- # AUTHOR: Mitesh Singh Jat (mitesh), <mitesh[at]yahoo-inc[dot]com> # COMPANY: Yahoo Inc, India # VERSION: 1.0 # CREATED: 02/22/2012 05:37:54 PM IST # REVISION: --- #=============================================================================== use strict; use warnings; use Getopt::Std; my $mount_point_base = "/mnt/usb_disks"; my $umount = 0; sub usage() { print STDERR "USAGE: $0 [options] \n"; print STDERR " -d <mount_base_dir> mount point dir: default $mount_point_base\n"; print STDERR " -u unmount \n"; } sub run_cmd() { my $cmd = $_[0]; print "Running: $cmd\n"; system("$cmd"); my $retval = $?; if ($retval < 0) { print STDERR "Error in running: $cmd\n$retval\n"; } return ($retval); } sub run_cmd_get() { my $cmd = $_[0]; print "Running: $cmd\n"; my @outs = `$cmd`; my $retval = $?; if ($retval < 0) { print STDERR "Error in running: $cmd\n$retval\n"; exit($retval); } chomp(@outs); return (@outs); } my %opts; getopt('d:', \%opts); foreach my $opt (sort keys %opts) { if (!defined($opts{$opt})) { print STDERR "$0: Requires value for option '$opt'\n"; &usage(); exit(-1); } } if (defined($opts{"d"})) { $mount_point_base = $opts{"d"}; } if (defined($opts{"u"})) { $umount = 1; } my $retval = 0; my $cmd; $retval = `whoami`; chomp($retval); unless ($retval eq "root") { print STDERR "$0: Please run this script as 'root' user.\n"; &usage(); exit(-1); } unless ($umount) { print "Mounting on $mount_point_base\n"; unless (-d "$mount_point_base") { $retval = &run_cmd("mkdir -p $mount_point_base"); exit($retval) if ($retval < 0); } my @temps = &run_cmd_get("mount | awk '{print \$1}' | grep \"^/dev/\""); my %mounted_devs; foreach my $temp (@temps) { $mounted_devs{$temp} = 1; $temp =~ s/\/sd([a-z]).*/\/sd$1/; $mounted_devs{$temp}++; } ## Take care of swap @temps = &run_cmd_get("cat /proc/swaps | awk '{print \$1}' | grep \"^/dev/\""); foreach my $temp (@temps) { $mounted_devs{$temp} = 1; $temp =~ s/\/sd([a-z]).*/\/sd$1/; $mounted_devs{$temp}++; } my %unmounted_devs; my $total = 0; @temps = &run_cmd_get("ls /dev/sd*"); foreach my $temp (@temps) { next if (defined($mounted_devs{$temp})); ## Take care of logical partition, which cannot be mounted my @outs = &run_cmd_get("fdisk -s $temp"); $retval = $outs[0]; next if ($retval <= 1); $unmounted_devs{$temp} = 1; $temp =~ s/\/sd([a-z]).*/\/sd$1/; if (defined($unmounted_devs{$temp})) { delete($unmounted_devs{$temp}); $total--; } $total++; } if ($total == 0) { print "$0: No partition to mount.\nexiting...\n"; exit(0); } print "\n--------------------------------------------\n"; print "Following partitions are not mounted...\n"; print "--------------------------------------------\n"; foreach my $temp (sort keys %unmounted_devs) { print "$temp\n"; } print "--------------------------------------------\n"; ## Now we can mount these foreach my $temp (sort keys %unmounted_devs) { my $mount_dir = $temp; $mount_dir =~ s/^\/dev\//$mount_point_base\//; print "Mounting $temp -> $mount_dir\n"; unless (-d "$mount_dir") { $retval = &run_cmd("mkdir -p $mount_dir"); exit($retval) if ($retval < 0); } $cmd = "mount $temp $mount_dir"; $retval = &run_cmd("$cmd"); if ($retval < 0) { print STDERR "!!!Cannot mount $temp on $mount_dir\n"; } } } else { unless ($mount_point_base =~ m/^\//) { $retval = `pwd`; chomp($retval); $mount_point_base = "$retval/$mount_point_base"; } print "Unmounting from $mount_point_base\n"; $cmd = "mount | awk -F \" on \" '{print \$2}' | awk -F \" type \" '{print \$1}' | grep \"$mount_point_base\""; my @temps = &run_cmd_get("$cmd"); if (@temps == 0) { print "$0: No partition to unmount.\nexiting...\n"; exit(0); } print "\n--------------------------------------------\n"; print "Following directories are mounted...\n"; print "--------------------------------------------\n"; foreach my $temp (@temps) { print "$temp\n"; } print "--------------------------------------------\n"; foreach my $temp (@temps) { $cmd = "umount $temp"; $retval = &run_cmd("$cmd"); if ($retval < 0) { print STDERR "!!!Cannot umount $temp\n"; } else { &run_cmd("rmdir $temp"); # delete dir if empty } } } exit(0);