Leopard的检疫"quarantine"功能

Created: 2008-10-12
Update;
    2008-12-13: Added shell script part + minor sentences correction.


    以前使用Tiger,使用到10.4.11,换了新机器也就随着换了Leopard. 后来发现Leopard与Tiger的一个改进,就是它可以分别出是Internet/email下载的程序还是光盘或者从它处,比如USB盘或者网络共享等,复制的程序, 而对于从Internet上下载的程序系统会提示用户是否运行该程序,因为绝大多数的下载程序有可能有安全隐患,而杜绝安全隐患的最后的关卡,还是操作者本人,再有也是安全问题的复杂性,至今没有一个程序方法可以断定的,所以也只能把最后一道安全大门交给用户自己来管理了。无论如何,Leopard已经关注了这个问题,Leopard的这个功能官方的叫法是"Tagging Downloaded Applications",而这里给它一个简单的名字叫它"检疫"quarantine功能,下面可以看到这个叫法的原因。

下面这个图就是当你第一次从/Applications目录里面运行一个下载的app文件时,Leopard提示的

绝大多数下载的程序都是存放在dmg格式的打包文件里面,双击这个文件,OS X系统会自动将它绑定到一个卷上,下面这个图就是当你从这个卷运行程序时,leopard提示的

其中有一个选项,可以永久忽略这个提示。这一点和上面的是不一样。
仔细看,里面还提示我是用什么程序下载的; FireFox.

这个功能是如何实现的呢,下面我们就通过几个步骤看看揭开这内部的秘密:

首先呢,我们先看没有运行过的在Applications目录里面的程序
我们可以使用ls命令的选项来看看:
  1. $ ls -ld@ /Applications/Monolingual.app
  2. drwxr-xr-x@ 3 schooladmin  admin  102 Mar 27  2008 /Applications/Monolingual.app
  3.     com.apple.quarantine     46
其中的第三行的"com.apple.quarantine     46"是其它程序没有的。

我们运行该程序后,再来看看
  1. $ ls -ld@ /Applications/Monolingual.app
  2. drwxr-xr-x@ 3 schooladmin  admin  102 Mar 27  2008 /Applications/Monolingual.app
这次之剩下两行了。

而我们用同样的方法再看看绑定的卷中的同样的文件的情况:
  1. $ ls -ld@ /Volumes/Monolingual/Monolingual.app
  2. drwxr-xr-x  3 schooladmin  admin  102 Mar 27  2008 /Volumes/Monolingual/Monolingual.app
大家发现没有里面没有那个"quarantine",怎么还是有那个提示呢?

我们再看看那个绑定卷的情况:
  1. $ ls -ld@ /Volumes/Monolingual/
  2. drwxr-xr-x  13 schooladmin  admin  510 Mar 27  2008 /Volumes/Monolingual/
同样是没有,那么到底存在那里呢了?

我们看看那个dmg文件吧:
  1. $ ls -ld@ /Users/schooladmin/Desktop/Monolingual-1.3.9.dmg
  2. -rw-r--r--@ 1 schooladmin  admin  1477183 Dec 12 22:05 /Users/schooladmin/Desktop/Monolingual-1.3.9.dmg
  3.     com.apple.diskimages.recentcksum         79
  4.     com.apple.quarantine         46
哈哈,有了,只不过是又多了一行, "com.apple.diskimages.recentcksum", 这个明显是存储着下载文件的校验码信息。
运行该程序并选中那个选项, 再来看看:
  1. $ ls -ld@ /Users/schooladmin/Desktop/Monolingual-1.3.9.dmg
  2. -rw-r--r--@ 1 schooladmin  admin  1477183 Dec 12 22:05 /Users/schooladmin/Desktop/Monolingual-1.3.9.dmg
  3.     com.apple.diskimages.recentcksum         79
这回那个"quarantine"没有了。
通过这个我们知道了, 绑定的过程在内存中继承了"quarantine"的属性.

下面介绍一个新命令行CLI的命令:xattr就是用于操作这种extended attribute的
我们用它来察看详细的"quarantine"属性:
  1. $ xattr -l /Users/schooladmin/Desktop/Monolingual-1.3.9.dmg
  2. com.apple.diskimages.recentcksum: i:788837 on 681640C5-B192-3AB1-BB5D-866B73EE3939 @ 1229144748 - CRC32:$9FE72ECF
  3. com.apple.quarantine: 0000;494342a5;Firefox.app;|org.mozilla.firefox
看到了,里面还记载了下载程序的名称呢。

下面这个就是我们要说的最终要的命令行参数了,就是删除它:
  1. $ xattr -d com.apple.quarantine /Users/schooladmin/Desktop/Monolingual-1.3.9.dmg
再看看:
  1. xattr -l /Users/schooladmin/Desktop/Monolingual-1.3.9.dmg
  2. com.apple.diskimages.recentcksum: i:788837 on 681640C5-B192-3AB1-BB5D-866B73EE3939 @ 1229144748 - CRC32:$9FE72ECF
已经被删除了。这样在第一次运行的时候也不会提示了。
这样如果你在内部系统的几十、数百台机器上发布了一个被quarantine的程序,如何解除呢,就用这个命令吧。管理工作不再是恶梦了。

xattr命令的在线解释,它没有man页。
$ xattr -h
usage: xattr [-l] file [file ...]
       xattr -p [-l] attr_name file [file ...]
       xattr -w attr_name attr_value file [file ...]
       xattr -d attr_name file [file ...]

The first form lists the names of all xattrs on the given file(s).
The second form (-p) prints the value of the xattr attr_name.
The third form (-w) sets the value of the xattr attr_name to attr_value.
The fourth form (-d) deletes the xattr attr_name.

options:
  -h: print this help
  -l: print long format (attr_name: attr_value)

这里有一个实现自动将一个目录里面的所有文件目录的"quarantine"属性删除的Applescript大家可以参考:
Applescript文件的实现: http://henrik.nyh.se/2007/10/lift-the-leopard-download-quarantine

忘了说了,本人更喜欢使用shell命令来完成工作,简单明了一些, 下面的命令就可以把指定目录( myfolder)里面的所有文件的quarantine属性都删除:
  1. find myfolder -print0 | xargs -0 xattr -d com.apple.quarantine
还可以通过在.cshrc文件里加入下面的alias就可以变成一个命令行的命令了noquarantine:
  1. alias noquarantine 'find !$ -print0 | xargs -0 sudo xattr -d com.apple.quarantine' 


参考: http://www.macosxhints.com/article.php?story=20071029151619619
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值