Shell 脚本.....如果出错,请改为执行此操作

标签 shell error-handling

在我的家里,我有 2 台 PC、我的主要 Windows 游戏平台和一个 ubuntu 13.04 文件服务器。 (不运行 ubuntu 服务器只是普通的 ubuntu)

我有用 luks 加密的操作系统驱动器(通过安装)

但我有 5 个 Truecrypt 加密硬盘。他们需要保留 truecrypt 以满足我的需求。我有以下 2 个脚本设置来在 PC 启动时安装我的驱动器。

这个简单的打开终端并运行下一个脚本 -

#!/bin/bash
sleep 10

gnome-terminal -e /home/kun7/.TrueCrypt/mount_truecrypt_volumes.sh

然后运行以下代码以获取 truecrypt 密码并将驱动器安装到我的指定点(需要转到我的其他程序/库/快捷方式等的指定点)
#!/bin/bash

echo "Enter password ..."

oldConfig=`stty -g`
stty -echo
read password
stty $oldConfig

echo "Opening Pandora's Box ..."


truecrypt -t /dev/sdb5 /media/P --password="$password"  -k "" --protect-hidden=no
truecrypt -t /dev/sda1 /media/B --password="$password"  -k "" --protect-hidden=no
truecrypt -t /dev/sdd1 /media/M --password="$password"  -k "" --protect-hidden=no
truecrypt -t /dev/sde1 /media/V --password="$password"  -k "" --protect-hidden=no
truecrypt -t /dev/sdf /media/S --password="$password"  -k "" --protect-hidden=no

echo "Drives mounted ... Close when ready"

exit 0

这非常适合我的需要。不定期的。我的问题是我有 2 个驱动器通过 PCI 卡连接。通常,它们被操作系统检测为 sdb5 和 sda1,但有时它们会被识别为 sdc5 和 sdd1。

这导致我的脚本返回...
Enter password ...
Opening Pandora's Box ...
Enter your user password or administrator password: 
Error: No such file or directory:
/dev/sdb5
Incorrect password or not a TrueCrypt volume.

Enter password for /dev/sda1: Error: No such file or directory:
/dev/sdd1
Incorrect password or not a TrueCrypt volume.

Enter password for /dev/sdf: 

我想要做的是在我的脚本末尾添加一个“if error”命令来告诉它。 “如果错误,请改用它”,然后在操作系统更改驱动器点时列出备用安装路径。

我认为这是有道理的。

最佳答案

我建议您改用驱动器 UUID。
您可以通过以下方式获取驱动器 UUID:

 $ sudo /sbin/blkid /dev/sda1
 > /dev/sda1: UUID=<SOME-UUID-STRING> TYPE=<TYPE>

blkid -U <UUID>您查询设备路径。所以在你的脚本中使用这个:
truecrypt -t $(/sbin/blkid -U <SOME-UUID-STRING>) /media/...

如果您真的更喜欢“错误时”方法:
function mount-truecrypt () {
    local dev=$1
    local mnt=$2
    local alternative_dev=$3
    truecrypt -t $dev $mnt --password="$password"  -k "" --protect-hidden=no || \
      truecrypt -t $alternative_dev $mnt --password="$password"  -k "" --protect-hidden=no
}
mount-truecrypt /dev/sdb5 /media/P /dev/sdc5

更新:

好的,UUID 不起作用,因为在使用 truecrypt 解密之前分区表不可用而且这些设备是随机的。

这里有一些关于 udev 规则的提示:Writing udev rules可能会帮助你和这个命令:
sudo udevadm info -a -p $(sudo udevadm info -q path -n /dev/sda)

(来自 udevinfo )为您提供驱动器上的所有 udev 信息。

虽然这可能也不容易,因为分区也不对 udev 可用..
但是您可以通过使用如下规则为驱动器创建符号链接(symbolic link)来确定驱动器的主要 block 设备在哪里:
ATTRS{model}=="<MODEL>", ATTRS{serial}=="<SERIAL>", ACTION=="add", SYMLINK+="<my-symlink>"

然后/dev/用 readlink 指向设备(/dev/sda 左右)你可以点击这样的链接:
readlink -f /dev/<my-symlink>

所以你可以在你的脚本中试试这个:
truecrypt "$(readlink -f /dev/<my-symlink>)1" <args>

在该驱动器上安装分区 1。我不确定它是否有效,但可能会给你一些想法。

关于Shell 脚本.....如果出错,请改为执行此操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17760195/

相关文章:

spring - RestTemple自定义错误处理程序未捕获ResourceAccessException

bash - Shell:如何从另一个 Shell 脚本调用一个 Shell 脚本?

bash - shell 脚本中的 rm -r (我的第一个 *.sh)

linux - bash 中的双引号

linux - UNIX 中的陷阱命令

c# - 如何创建一个Windows App(C#),在其中可以在消息框中显示各种对象中的所有异常

parsing - clojure源代码在宏中的位置

c# - 异常捕获和错误记录

c++ - char类型的参数* lpcwstr类型的参数

linux - 等待第二个脚本触发直到第二个脚本的所有后台并行进程完成?