Проверьте, работает ли он из живого сеанса или нет внутри сценария оболочки
У меня есть сценарий оболочки, который может быть запущен только из живого сеанса (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 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
Есть много отличительных особенностей между сеансом в реальном времени и обычным сеансом. С первого взгляда мне приходит в голову, что в прямом эфире нет реального пользователя. Можно использовать это.
Таким образом, не было бы 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