Linux 使用UDEV和脚本确定光学媒体类型(音频CD、DVD、蓝光)
我对linux比较陌生,已经从Windows切换到了无头媒体中心。我在经营科迪班图 我正在尝试实现一个自动翻录系统来备份我的硬拷贝媒体收藏。我喜欢linux的概念,即“如果你能梦想它,你就能实现它” 我的目标是将一张光盘放入驱动器,脚本将内容撕入驱动器 e、 g插入光盘->确定介质类型->运行正确的翻录脚本 我通过谷歌搜索使用了很多有用的网页来创建脚本,这些脚本本身就能完成翻录工作。我读了很多书,有人指出要使用“HAL”……然后我发现他的函数已经被弃用,并被udev取代。我读了很多书,了解了如何使用UDEV,并创建了以下规则,通过直接链接到翻录脚本,我已经证明了这些规则是有效的Linux 使用UDEV和脚本确定光学媒体类型(音频CD、DVD、蓝光),linux,ubuntu,sh,udev,Linux,Ubuntu,Sh,Udev,我对linux比较陌生,已经从Windows切换到了无头媒体中心。我在经营科迪班图 我正在尝试实现一个自动翻录系统来备份我的硬拷贝媒体收藏。我喜欢linux的概念,即“如果你能梦想它,你就能实现它” 我的目标是将一张光盘放入驱动器,脚本将内容撕入驱动器 e、 g插入光盘->确定介质类型->运行正确的翻录脚本 我通过谷歌搜索使用了很多有用的网页来创建脚本,这些脚本本身就能完成翻录工作。我读了很多书,有人指出要使用“HAL”……然后我发现他的函数已经被弃用,并被udev取代。我读了很多书,了解了如何
ACTION=="change", SUBSYSTEMS=="scsi", KERNEL=="s[rg][0-9]*", ATTRS{vendor}=="TSSTcorp", MODE="0660", GROUP="optical", RUN+="/home/jlivin25/myscripts/DiscTypeTest.sh"
我意识到我需要一个中间脚本来完成确定光媒体类型的“工作”。进一步的阅读让我相信我需要使用某种“如果”语句
如果插入光盘
然后
如果音频cd运行rip脚本1
如果DVD运行rip脚本2
如果蓝光运行rip脚本3
否则没有插入cd
我做了更多的谷歌搜索,在不同的地方找到了一些使用环境变量工作的代码。然而,从谷歌的进一步信息来看,这些变量在被UDEV引用之前似乎没有定义
我通常的方法是构造一行代码,在终端中运行,如果我得到了我想要的,那么我把所有的代码都放在一个shell脚本中
下面是我目前正在编写的代码。我认为,从逻辑上讲,如果我能让脚本将它认为在驱动器中的内容输出到一个文件/日志中,就可以赢得一半的战斗,我可以用它来代替执行相应的翻录任务的脚本位置。。。大家有什么想法,为什么这不是我想要的吗
我使用这些页面从以下位置获取信息:
#!/bin/bash
#
set -eu
#
# code below is derived from work by JimVanns, thanks
# https://github.com/jvanns/htpc/blob/master/dsc-trg-q
#
#
###########################################################################
### DEFINE VARIABLES HERE ###
### $HOME DOES NOT NEED DEFINING AS IT SEEMS TO BE BUILT INTO BASH FROM ###
### WHAT POSTS I HAVE READ RELATING TO USING WHAT I THINK ARE UDEV ###
### ENVIRONMENTAL VARIABLES E.G. $ID_CDROM_MEDIA_CD DO NOT APPEAR TO ###
### NEED DEFINING THEMSELVES, ALSO PART OF BASH OR LINUX COMMAND ###
### STRUCTURE CALLED BY BASH? ###
###########################################################################
#
MEDIA=
#
##############################################################################
### LEFT IN SO AS TO ALTER AS LITTLE AS POSSIBLE, I HAVE READ THAT DELAYS ###
### OFTEN IRON OUT KINKS IN CODE, PLUS ALSO FOUND IT USEFULL TO ALLOW A ###
### SMALL DELAY FOR CD-DRIVE TO DO ITS THING AFTER PUTTING DISK IN ###
##############################################################################
#
sleep 2
#
mkdir -p $HOME/myscripts/scriptlogs
#
#
if [ "$ID_CDROM_MEDIA_BD" = "1" ]
then
MEDIA=bluray
(
echo "$MEDIA" >> $HOME/myscripts/scriptlogs/DiscTypeTest.log
) &
if [ "$ID_CDROM_MEDIA_DVD" = "1" ]
then
MEDIA=dvd
(
echo "$MEDIA" >> $HOME/myscripts/scriptlogs/DiscTypeTest.log
) &
elif [ "$ID_CDROM_MEDIA_CD" = "1" ]
then
MEDIA=cdrom
(
echo "$MEDIA" >> $HOME/myscripts/scriptlogs/DiscTypeTest.log
) &
fi
变量不在任何地方设置 通常这是在udev启动规则中设置的(在
/usr/lib/udev/rules.d/
中),看起来有点像
# ID_CDROM_MEDIA_BD = Bluray
# ID_CDROM_MEDIA_DVD = DVD
# ID_CDROM_MEDIA_CD = CD
SUBSYSTEM=="scsi", KERNEL=="sr0", ENV{ID_CDROM_MEDIA_BD}=="1", RUN+="/home/user/ripping_script.sh"
由于udev
事先不知道介质类型,因此手动将其设置为环境变量。但是,由于您希望在某些条件下自动启动不同的脚本,因此这是没有用的
但是,您也可以在翻录脚本中确定和设置mediatype变量:
首先安装cdtool,它可以为您提供有关音频CD的一些信息(使用cdir
)。
sudo-apt-get-install-cdtool
将以下内容添加到脚本的开头:
#!/bin/bash
# ripping_script.sh
CDDVD=`cdir -vd /dev/sr0 2>&1 |grep -q "no_disc" || echo "cd"`
if [ $CDDVD ]; then
ID_CDROM_MEDIA_CD=1
echo "CD detected" >> $HOME/myscripts/scriptlogs/rip.log
else
ID_CDROM_MEDIA_DVD=1
echo "DVD detected" >> $HOME/myscripts/scriptlogs/rip.log
fi
# ... your rippingscript here
/dev/sr0
很可能是您的cd/dvd
这只是audioCD和DVD之间的区别。我没有测试用的蓝光材料 解决了
Udev规则是这样的
# ID_CDROM_MEDIA_BD = Bluray
# ID_CDROM_MEDIA_DVD = DVD
# ID_CDROM_MEDIA_CD = CD
ACTION=="change", SUBSYSTEMS=="scsi", KERNEL=="s[rg][0-9]*", ATTRS{vendor}=="TSSTcorp", ENV{ID_CDROM}=="?*", MODE="0660", GROUP="optical", RUN+="/usr/local/bin/DiscTypeTest3.sh"
触发翻录脚本的脚本如下所示:
#!/bin/bash
# ID_CDROM_MEDIA_BD = Bluray
# ID_CDROM_MEDIA_DVD = DVD
# ID_CDROM_MEDIA_CD = CD
MEDIA=
if [ $ID_CDROM_MEDIA_DVD = "1" ]
then
MEDIA=dvd
(
echo "$MEDIA" >> "/var/log/DiscTypeTest.log"
) &
elif [ $ID_CDROM_MEDIA_CD = "1" ]
then
MEDIA=cdrom
(
echo "$MEDIA" >> "/var/log/DiscTypeTest.log"
) &
fi
(set -o posix ; set) > "/var/log/DiscTypeTestVariables.log"
当插入音频cd后再插入dvd时,这将导致以下输出到日志文件
cdrom
cdrom
dvd
dvd
将回音线替换为翻录脚本的路径应可根据需要自动生成无头系统
Jim Vanns的代码、Keith_Helms和blm_ubunet在ubuntu论坛上的posix代码以及对if语句和Ixer变量指针的更正都值得称赞
希望这有帮助
James链接不起作用。您好,非常感谢您抽出时间回答。我一定会尝试你的建议,看看它是否能给我一个有用的结果,我不会使用这个工具。坚持我的第一篇帖子,你知道为什么环境变量对我不起作用吗?或者甚至如何测试哪些不起作用?环境变量没有设置。我更新了答案,包括它。谢谢,我真的很感谢你的解释…我想我已经开始看到曙光了。是不是我需要稍微调整一下我的思维,这样我就有了三条udev规则。假设80-bluray.rule、81-dvd.rule和82-cd.rule,然后使用您的示例相应地填充udev规则。所以规则80将是
SUBSYSTEM==“scsi”,KERNEL==“sr0”,ENV{ID\u CDROM\u MEDIA\u BD}==“1”,RUN+=“/home/user/BLURip.sh”
规则81将是SUBSYSTEM==“scsi”,KERNEL==“sr0”,ENV{ID\u CDROM MEDIA\u DVD}==“1”,RUN+=“/home/user/DVDRip.sh”
等等,但是没有。如果你这样做,那么每次你把cd放入设备时,所有3条规则都会开始,所以这不是你想要的。(但是,如果您有3个不同的专用驱动器,您可以这样做,但还必须设置sr0、sr1、sr2)。只需将我的代码放在脚本的开头,就可以设置媒体类型的正确变量(ID\u CDROM\u MEDIA\u DVD
或ID\u CDROM\u MEDIA\u CD
).ahhh我想我明白了…所以像往常一样,shebang然后#ID#CDROM#MEDIA#DVD=DVD#ID#CDROM#MEDIA#u CD=CD
,然后是脚本的其余部分以及注释掉的变量,确保它们可供脚本使用。。。今晚我要试试这个。谢谢