测试是否在实时会话中操作或不在shell脚本中操作

我有一个只能从实时会话(LiveCD或Live USB)运行的shell脚本,因为它缩小了实际安装的根文件系统,这只能在未安装文件系统时完成。

如果脚本是从实时会话运行的,那么它应该继续执行。 如果没有,它应该失败。

我无法找到区分实时会话和“正常”用户会话的方法,因为实时会话的外观非常接近已安装的系统会话。 到目前为止我唯一可以说的是,实时会话总是以ubuntu作为主机名,但我不能依赖它,因为用户可以在安装Ubuntu时选择它。

有没有办法在shell脚本/命令行中识别它?

(我在Ask UbuntuStack 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禁止输出,如果找不到cowgrep将以状态> 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