我有一个只能从实时会话(LiveCD 或 Live USB)运行的 shell 脚本,因为它会缩小实际安装的根文件系统,而这只能在未挂载文件系统时完成。
如果脚本是从实时会话运行的,则它应该继续执行。如果不是,则应该失败。
我找不到区分实时会话和“普通”用户会话的方法,因为实时会话的外观和感觉与已安装的系统会话非常接近。到目前为止,我唯一能说的是实时会话始终具有ubuntu
主机名,但我不能依赖这一点,因为用户可以在安装 Ubuntu 时选择它。
有没有办法在 shell 脚本/命令行中识别它?
(我犹豫着是否要发帖询问 Ubuntu或者堆栈溢出,我可以删除帖子并重新发布堆栈溢出如果更合适)
答案1
实时会话与普通会话之间有许多区别。我第一印象是实时会话中没有真实用户。可以利用这一点。
因此,除了以下情况外,不会有任何gid
大于 999 的数值/etc/passwd
对应于任何实际用户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
答案2
不,名称是任意的,您不能据此假设任何事情。但是,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
grep -q cow
:-q 抑制输出,如果未找到,grep
将以状态 >0(错误)退出,如果找到,则以状态 (正确) 退出。cow
0
&& echo "Live session" : Print
实时会话if the
grep` 成功|| echo "Normal install"
:否则,打印Normal install
。
原帖编辑
最后,这是我在脚本中实现的解决方案,希望它有用:
#!/bin/bash
if [ ! $(df | grep -w / | grep -q '/cow') ]; then
printf "This script must be run from a live session.\n"
exit 1
fi