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

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

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

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

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

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

2
задан 18.05.2020, 18:36

2 ответа

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

Так, не было бы никакого 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
0
ответ дан 18.05.2020, 18:37
  • 1
    Это решение работает хорошо, спасибо. Однако, так как мой сценарий имеет дело с разделами и файловыми системами, я выбрал @terdon' s решение быть последовательным. Если сценарий должен измениться когда-нибудь из-за этого теста, то существует хороший шанс, что остальная часть самого сценария должна быть обновлена самого так или иначе. – Estradiaz 18.05.2020, 18:37

Нет, имя произвольно, Вы ничего не можете принять на основе этого. Однако Живая сессия действительно имеет несколько причуд, таких как:

$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 опция распознает целые слова только так, чтобы [только 1 110] и не, например /home были распечатаны.
  • grep -q cow:-q подавляет вывод, grep выйдет с состоянием> 0 (ошибка), если cow не был найден и 0 (корректным), если это было.
  • && echo "Live session" : Print Живая сессия if the grep' был успешен
  • || 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
0
ответ дан 18.05.2020, 18:37
  • 1
    Это решение работает как очарование. Для дальнейших ссылок, хотя я принял этот ответ, обратите внимание на то, что @souravc' s решение работает также, и я выбрал этого только потому, что это более подходило для моих потребностей. Другой нужно рассмотреть также для других целей. – seanomomom 18.05.2020, 18:38
  • 2
    Я добавил отрывок с решением, которое я на самом деле реализовал, Спасибо! – chris.va.rao 18.05.2020, 18:38

Теги

Похожие вопросы