测试是否从实时会话进行操作或不在 shell 脚本内进行操作

测试是否从实时会话进行操作或不在 shell 脚本内进行操作

我有一个只能从实时会话(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(错误)退出,如果找到,则以状态 (正确) 退出。cow0
  • && echo "Live session" : Print实时会话if thegrep` 成功
  • || 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

相关内容