测试是否在实时会话中操作或不在shell脚本中操作
我有一个只能从实时会话(LiveCD或Live USB)运行的shell脚本,因为它缩小了实际安装的根文件系统,这只能在未安装文件系统时完成。
如果脚本是从实时会话运行的,那么它应该继续执行。 如果没有,它应该失败。
我无法找到区分实时会话和“正常”用户会话的方法,因为实时会话的外观非常接近已安装的系统会话。 到目前为止我唯一可以说的是,实时会话总是以ubuntu
作为主机名,但我不能依赖它,因为用户可以在安装Ubuntu时选择它。
有没有办法在shell脚本/命令行中识别它?
(我在Ask Ubuntu或Stack Overflow上发帖之间犹豫不决,如果更合适,我可以删除post并重新发布Stack Overflow )
不,这个名字是任意的,你不能假设任何基于此的东西。 但是,Live会话确实有一些怪癖,例如:
$df -h | grep -w / /cow 2.0G 42M 1.9G 3% /
如您所见,特殊设备/cow
安装在/
。 我不确定这是多么便携,我怀疑它对于非Ubuntu Linux会是一样的,它也可能在将来的版本中有所改变,但只要它不是/dev
的实际设备,你可以很容易地测试它:
df | grep -w / | grep -q 'cow' && echo "Live session" || echo "Normal install"
说明:
-
df
:打印已安装的文件系统 -
grep -w /
:只打印显示/
上挂载内容的行。-w
选项仅匹配整个单词,以便仅打印/
而不打印/home
例如/home
。 -
grep -q cow
:-q禁止输出,如果找不到cow
,grep
将以状态> 0(错误)退出,如果没有找到则返回0
(正确)。 -
&& echo "Live session" : Print
if the
grep`成功,if the
&& echo "Live session" : Print
实时会话 -
|| echo "Normal install"
|| echo "Normal install"
:否则,打印Normal install
。
由OP编辑
最后,这是我在我的脚本中实现的解决方案,如果它有点用处:
#!/bin/bash if [ ! $(df | grep -w / | grep -q '/cow') ]; then printf "This script must be run from a live session.\n" exit 1 fi
实时会话和正常会话之间有许多区别特征。 在第一次拍摄时,我想到现场会话中没有真正的用户。 人们可以利用它。
因此, /etc/passwd
没有任何gid
大于999对应于除nobody
用户之外的任何真实用户。
$ awk -F: '($3>=1000){print $1}' /etc/passwd nobody
以下脚本应该工作,
#!/bin/bash var=$(awk -F: '($3>=1000){print $1}' /etc/passwd | wc -l) if [[ $var -gt 1 ]]; then echo "normal session" else echo "live session" fi