LINUX.ORG.RU

Прикол с «exit 0»

 ,


1

2

Сижу на EndeavourOS (arch based). Захотел вести журнал загрузок своего ПК.

Написал скриптик date2log.sh

#!/bin/bash

date >> /home/user/comp_start.log

exit 0

И просто закинул его в папку /etc/profile.d/

Перезагрузился и… не смог залогиниться в системе. Ни через KDE ни через терминал ))) Оно типа логинится и мгновенно выходит.

Пришлось грузиться с флешки и удалять в скрипте строку ‘exit 0’. Без нее все заработало как надо.



Последнее исправление: InvisibleLight (всего исправлений: 1)

Когда ты логинишься, скрипты из profile.d выполняются в текущем интерпретаторе с помощью команды source. По сути все команды выполняются в текущем интерпретаторе, и exit завершает его выполнение.

vbr ★★★★
()

Патамушта такое надо было не в профиль пихать, а, например, в крон по @reboot. (Дээ маркдаун меня победил, прости, регистрант 😆 @reboot в кроне исполняется при каждом старте системы)

Мамин какир…

Все эти profile.d, образно говоря, склеиваются в один скрипт и если он завершается, то завершается и сессия его инициировавшая. Но это сильно упрощённый рассказ.

aol ★★★★★
()
Последнее исправление: aol (всего исправлений: 1)

Добавлю ещё что строчка #!/bin/bash в начале файла это в большинстве случаев признак нубства. Конкретно тут шебанг вообще не нужен, никакой, а в других файлах, где он таки нужен (это файлы chmod +x которые запускаются как проги) там надо писать #!/bin/sh

firkax ★★★★★
()
Ответ на: комментарий от firkax

Ну тут вопрос неочевидный. sh это sh, а bash это bash. Если тебе не хватает возможностей sh и тебе не нужна переносимость sh, использовать bash вместо него - нормально. Те же массивы сильно упрощают некоторые нюансы. Да что - массивы, i + 1 на sh вычислить - уже задача.

А ещё добавлю, что правильней писать #!/usr/bin/env sh. К примеру в макоси есть /bin/bash древней версии, а когда юзер ставит новую версию через brew, то она ставится куда-то в /opt. Кажется правильней дать пользователю возможность выбирать тот интерпретатор, который будет использоваться для запуска скрипта, а не хардкодить его по определённому пути.

vbr ★★★★
()
Последнее исправление: vbr (всего исправлений: 4)
Ответ на: комментарий от vbr

#!/usr/bin/env sh

Конкретно так смысла не имеет, а вот #!/usr/bin/env bash — вполне правильный шебанг, если у тебя скрипт не полностью POSIX-совместимый, а с башизмами.

CrX ★★★★★
()
Ответ на: комментарий от vbr

Кажется правильней дать пользователю возможность выбирать тот интерпретатор, который будет использоваться для запуска скрипта, а не хардкодить его по определённому пути.
/usr/bin/env

по хорошему и env не надо хардкодить. но, к сожалению, Linux так не умеет.

teod0r ★★★★★
()
Ответ на: комментарий от vbr

Если тебе не хватает возможностей sh и тебе не нужна переносимость sh, использовать bash вместо него - нормально.

Если не хватает sh то надо писать не на шелле. Пхп/питон, ну и Си в итоге.

А ещё добавлю, что правильней писать #!/usr/bin/env sh. К примеру в макоси есть /bin/bash древней версии, а когда юзер ставит новую версию через brew, то она ставится куда-то в /opt.

Причём тут баш и его версия? #!/bin/sh означает что это скрипт для posix-шелла, он должен работать на любом posix-совместимом шелле любой версии. Если ты начинаешь пользоваться какими-то нестандартными фичами - см. выше, надо целиком менять язык а не искать другой шелл.

Кажется правильней дать пользователю возможность выбирать тот интерпретатор, который будет использоваться для запуска скрипта, а не хардкодить его по определённому пути.

Пользователь всегда может написать /opt/local/bin/exotic_sh /path/to/script если ему надо выбрать интерпретатор. А то, что написано для sh, должно быть совместимо с любым posix sh.

правильней писать #!/usr/bin/env sh

А да, ещё оно совершенно без нужды сломается с неподмонтированным /usr. При том что самому sh /usr для работы не нужен и твоему скрипту может быть тоже не нужен.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)

А что ты ожидал? Ну если это прикол, то я должен посмеяться, но мне вот не смешно. Спасибо. Продолжай наблюдения. Используй systemd пользовательские сервисы. Там в скриптах, запускаемых через ExecStart можно использовать exit 0.

rtxtxtrx ★★
()
Последнее исправление: rtxtxtrx (всего исправлений: 1)
Ответ на: комментарий от teod0r

Надо, потому что

echo $PATH
/home/user/.cargo/bin:/home/user/anaconda3/bin:/home/user/anaconda3/condabin:/home/user/.cargo/bin:/home/user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/user/.dotnet/tools
Такие пироги к примеру в убунте да и другие дистрибутивы таким страдают. user тут вместо имени пользователя. А так слишком просто будет. Можно в /home/user/bin или любую другую директорию из списка на выбор куда можно писать от юзера засунуть вредоносную портянку с названием bash или env и получить рута на раз два либо через кривые скрипты админа/юзера, либо через кривые системы входа в систему/автозапуск в некоторых WM и так далее. Да, конечно это не панацея (умные люди поймут что можно попробовать воткнуть портянку с именем source для того же эффекта, но там и возни больше, но как видишь ТС не догадался, а значит каликакеры не страшны, а чем больше такого геморроя обходить надо, тем выше квалификация должна быть у взломщика, значит потенциально взломщиков меньше, безопасность выше, лишний школьник хулиган после уроков не станет ломать компы, а пойдёт на улицу гулять).

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от peregrine

а пойдёт на улицу гулять

Блажен, кто верует. Школьник ни гулят, ни компы ломать не будет, в смартфон залипнет и всё.

Надо

Надо что? Хардкодить /usr/bin/env? Хардкодить /bin/bash? Что вы там не захардкордите, пользователь с консоли введёт sudo или ещё какую команду и всё. Если в его bin-каталог понапихано вредоносных программ, ничего не поможет. Особенно с разрабами дистра, которые пользовательские bin-каталоги в начало PATH ставят, а не в конец.

mky ★★★★★
()
Ответ на: комментарий от firkax

В папке /etc/profile.d/ у меня в моей EndeavourOS (arch based) есть файлы «gradle.sh», «locale.sh» которые начинаются с «#!/bin/sh» Эти файлы не мои, они установлены самой ОС. Тоже нубы их туда пропихнули???

InvisibleLight
() автор топика
Последнее исправление: InvisibleLight (всего исправлений: 3)