Проверьте, работает ли он из живого сеанса или нет внутри сценария оболочки

У меня есть сценарий оболочки, который может быть запущен только из живого сеанса (LiveCD или Live USB), потому что он сокращает корневую файловую систему фактической установки, что может быть сделано только тогда, когда файловая система не смонтирована.

Если скрипт запускается из живого сеанса, он должен продолжить его выполнение. Если нет, он должен потерпеть неудачу.

Я не могу найти способ различить сеанс в реальном времени и сеанс "обычного" пользователя, так как сеанс в реальном времени выглядит очень близко к установленным системным сеансам. Единственное, что я могу сказать, это то, что живые сессии всегда ubuntu в качестве имени хоста, но я не могу полагаться на это, так как пользователь может выбрать это при установке Ubuntu.

Есть ли способ определить это в сценарии оболочки / командной строке?

(Я колебался между публикацией в Ask Ubuntu или переполнением стека, я могу удалить публикацию и повторно опубликовать в переполнении стека, если это более уместно)

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 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

Есть много отличительных особенностей между сеансом в реальном времени и обычным сеансом. С первого взгляда мне приходит в голову, что в прямом эфире нет реального пользователя. Можно использовать это.

Таким образом, не было бы 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
Другие вопросы по тегам