Shell脚本.....如果错误这样做

时间:2013-07-20 08:08:41

标签: shell error-handling

在我家,我有2台电脑,我的主要Windows游戏装备和ubuntu 13.04文件服务器。 (不运行ubuntu服务器只是简单的ubuntu)

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

但我有5个Truecrypt ecrypted HDD。他们需要保持真正的满足我的需求。我有以下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卡连接。通常它们被OS检测为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”命令来告诉它。 “如果出现错误,请改为使用”,然后在操作系统更改驱动器点时列出备用安装路径。

我认为这是有道理的。

2 个答案:

答案 0 :(得分:2)

我建议您改用驱动器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也无法使用分区。 但你可以通过这样的规则为驱动器创建一个符号链接来找出你驱动的主要块设备的位置:

ATTRS{model}=="<MODEL>", ATTRS{serial}=="<SERIAL>", ACTION=="add", SYMLINK+="<my-symlink>"

然后/ dev /指向设备(/ dev / sda左右)readlink你可以按照这样的链接:

readlink -f /dev/<my-symlink>

所以你可以在你的剧本中尝试这个:

truecrypt "$(readlink -f /dev/<my-symlink>)1" <args>

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

答案 1 :(得分:1)

问题是通过truecrypt终端/脚本安装驱动器你这样做:

truecrypt -t / dev / sda / media / Stuff

但是如果每次启动时每个物理驱动器的/ dev / sda都会发生变化,那么这会让脚本变得毫无价值。所有链接和库都是从/ media / stuff设置的,而/ media / stuff每次都依赖于/ dev / sda指向同一个驱动器。所以我需要为truecrypt使用一些持久的/ dev / * 点。

提示:使用udev喜欢您用于匹配的信息,并确保您的设置完全随机/自定义/ dev / *

Here is my current process for getting everything to work

1 - PC boots and takes rules from 10-custom-hdd-scsi.rules
2 - Login to Ubuntu where 1 script open terminal and then runs "3"
3 - Truecrypt script prompts for password, and mounts drives to specified mount points allowing for links/libraries to work.

首先运行 - sudo / lib / udev / scsi_id --page = 0x83 --whitelisted --device = / dev / sda并将结果复制下来。为你拥有的每个驱动器做它,你将拥有Drives scsi id

10-custom-hdd-scsi.rules - 此文件已保存在/etc/udev/rules.d

# These are the rules to force all drives into specific /dev/sd** slots for truecrypt mounting
#
#KERNELS - looks upwards in device path to find
#PROGRAM - Runs this. It is a serch for WWID (world wide ID)
#RESULT  - This is the result its looking for. It is the specific Drives ID
#SYMLINK - Create the following link (i.e. personal /dev/***)
#
# "==" means match this
# "+=" means if it exists, do this aswell
#
KERNEL=="sd*", PROGRAM=="/lib/udev/scsi_id --page=0x83 --whitelisted --device=/dev/%k", RESULT=="<DRIVES ID>", SYMLINK+="TC-a%n"

KERNEL=="sd*", PROGRAM=="/lib/udev/scsi_id --page=0x83 --whitelisted --device=/dev/%k", RESULT=="<DRIVES ID>", SYMLINK+="TC-b%n"

KERNEL=="sd*", PROGRAM=="/lib/udev/scsi_id --page=0x83 --whitelisted --device=/dev/%k", RESULT=="<DRIVES ID>", SYMLINK+="TC-c%n"

KERNEL=="sd*", PROGRAM=="/lib/udev/scsi_id --page=0x83 --whitelisted --device=/dev/%k", RESULT=="<DRIVES ID>", SYMLINK+="TC-d%n"

KERNEL=="sd*", PROGRAM=="/lib/udev/scsi_id --page=0x83 --whitelisted --device=/dev/%k", RESULT=="<DRIVES ID>", SYMLINK+="TC-e%n"

BANG - 自定义udev规则为每个驱动器创建链接。所以现在你将拥有每次都改变的标准/ dev / sd **,并且/ dev / TC-a将保持不变。

打开终端的第一个脚本

#!/bin/bash

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/TC-a /media/E --password="$password"  -k "" --protect-hidden=no
truecrypt -t /dev/TC-b /media/D --password="$password"  -k "" --protect-hidden=no
truecrypt -t /dev/TC-c /media/C --password="$password"  -k "" --protect-hidden=no
truecrypt -t /dev/TC-d /media/B --password="$password"  -k "" --protect-hidden=no
truecrypt -t /dev/TC-e /media/A --password="$password"  -k "" --protect-hidden=no

echo "Drives mounted ... Close when ready"

exit 0

- 你将启动电脑,登录,并让终端问你真正的加密密码。 - 输入。

- 然后您将被要求输入您的用户密码。

- 脚本将运行,您的驱动器将被挂载。

- 现在您的驱动器具有连续的持久性挂载点。