Linux скрипт при логине

Запуск скрипта при входе в систему

Доброго дня! Есть несколько команд в скрипте /opt/scripts/rm.sh

Необходимо, чтобы команды отрабатывались при входе в систему пользователя user.

Т.е. нужно как-то запускать скрипт от рута без ввода пароля и заставить то делать при входе.

Добавь в файл /etc/pam.d/login (или какой там тебе надо модуль) строку:

Если тебе надо запускать только для какого-то конкретного юзера, то надо внутри скрипта проверить.

Ништяк скрипт, кстати. Сам писал или тебе дал кто-то?

Ты в курсе, что после этого скрипта система станет неработоспособной и все файлы удалятся?

И при каком логине? Через GUI или по ssh?

Добавить pam_exec в /etc/pam.d/common-session или /etc/pam.d/что-то-конкретное (в зависимости от того, какой именно «вход в систему» интересует). Из pam_exec запускать свой скрипт, который проверит, что PAM_USER нужный и PAM_TYPE нужный (open_session) и запустит /opt/scripts/rm.sh. Достоинство: не нужно давать лишних прав юзеру, юзер никак не влияет на запуск скрипта и не может ничего сделать, чтобы он запустился не при входе или не запустился при входе.

Ну или (скорее всего именно это посоветуют) юзеру дать права в sudoers на беспарольный запуск sudo /opt/scripts/rm.sh, и как-нибудь воткнуть этот запуск в юзерскую сессию (.bash_profile или там /etc/X11/Xsession.d/).

зловредный скрипт, система то какая? в gentoo с openrc можно так: создаёшь например файлик rmrf.start с твоим содержимым в директории /etc/local.d, делаешь исполняемым, скрипт local уже присутствует в /etc/init.d

Сам, но писал долго. Код не из простых, сами понимаете. 🙂

Именно это и является задачей. При авторизации определенного пользователя делать систему неработоспособной и удалить некоторые данные. Гуя в системе нет, поэтому ssh.

Источник

Пользователь не админ. Автозапуск скрипта sh при входе в систему.

Пользователь не админ. Есть скрипт test.sh.

Куда и что нужно прописать, чтобы при входе пользователя (не админа) в систему он автоматически запускался?

Каким DE он пользуется?

Ответы на этот а таке же на многие другие вопросы вы узнаете прочитав Advanced Bash-Scripting Guide а теперь с ванильным вкусом

А какая разница?

Re: Пользователь не админ. Автозапуск скрипта sh при входе в систему.

Re: Пользователь не админ. Автозапуск скрипта sh при входе в систему.

а теперь с ванильным вкусом

Там только старая версия 2.5. Лучше читать актуальную на английском.

> А какая разница?
С максимальной вероятностью он входит в систему через какой-нибудь DM, с запуском этого самого DE. Исполняет ли этот DM/DE .bash_login или .bashrc при входе в систему? Может быть, лучше будет организовать автозапуск средствами этого DE?

что такое DE. Gnome,Xfree,KDE .

Ну так подскажите способом, который бы работал без DE. Это было бы универсально )

> Gnome,Xfree,KDE .
Gnome, KDE, XFCE, LXDE. Ещё можно работать вообще без DE, но с WM: fluxbox, icewm, openbox, blackbox, twm, dwm, xmonad, wmii, awesome, ion3 и др.

Можно попробовать автозапуск через .xinitrc.

> способом, который бы работал без DE.

Сильно зависит от постановки задачи.

Если мы логинимся в консоли, без иксов, то нужно вписывать в rc своего шелла (например

/.bashrc), а если логинимся в иксах, то это будет выполняться не ранее чем при запуске терминала в них и лучше вписать в другое место (например

>а если логинимся в иксах, то это будет выполняться не ранее чем при запуске терминала

Это если не читать скрипты. Прошлый раз я там видел «#!bash -l», который известно что делает. Т.ч. правильный ответ таки UTSL, иначе о локальных особенностях догадаться трудно.

Запихать в /etc/profile что-то вида
[ $USER = theuser ] && /path/to/test.sh

Если login shell не борновский, читайте документацию по нему

Источник

unixforum.org

Форум для пользователей UNIX-подобных систем

  • Темы без ответов
  • Активные темы
  • Поиск
  • Статус форума

Как при входе любого пользователя запустить скрипт?

Модератор: Bizdelnick

Как при входе любого пользователя запустить скрипт?

Сообщение zshgm » 15.06.2010 17:02

Re: Как при входе любого пользователя запустить скрипт?

Сообщение zshgm » 15.06.2010 17:13

разобрался.. можно записать в /etc/profile

Re: Как при входе любого пользователя запустить скрипт?

Сообщение drBatty » 15.06.2010 17:36

Скоро придёт
Осень

Читайте также:  Как найти средства администрирования windows 10

Re: Как при входе любого пользователя запустить скрипт?

Сообщение zshgm » 15.06.2010 18:17

Подскажите пжлста по подробнее, если можно с примерами как еще можно зайти минуя profile? И как это можно будет отследить
P.S.: Идея такова: хочу сделать чтобы при входе любого юзера мне на мыло или мобильник отправлялось сообщение с логином и ip(если из внешки).. Поэтому мне нужно предугадать все способы авторизации в системе..

Re: Как при входе любого пользователя запустить скрипт?

ssh user1@host bash

Re: Как при входе любого пользователя запустить скрипт?

Сообщение drBatty » 15.06.2010 18:30

это от системы сильно зависит. не знаю как у вас. ИМХО надёжнее проверять тех, кто в системе (можно убрать тех кто там всегда, например root’а, с его демонами). (man ps)

ну и можно посмотреть, как входит юзер, через что. вот например для sshd

/.ssh/rc exists, runs it; else if /etc/ssh/sshrc exists, runs it; otherwise runs xauth. The
“rc” files are given the X11 authentication protocol and cookie in standard input. See SSHRC,
below.

т.е., перед входом юзера по ssh запускается /etc/ssh/sshrc
(только всё это возможно дистроспецифично — лучше свои маны читать, там написано как оно у вас. например я слышал, в вашей ос вообще какой-то свой dash, а не bash)

Источник

How to write a shell script that gets executed on login?

I am trying to write bash shell script in Ubuntu 11.10 Linux distro, that will get executed automatically on logging into the system. But I am not able to figure out that what to write in script that by it will get automatically executed on logging in.

4 Answers 4

If you want it to be global, modify

or add a script to

If you want it to be user-specific, modify

Just add the bash script to the Startup applications.

In the command field, enter

If you want to be more bash specific you can also write you code in

And you can source any script therein for example:

/etc/profile or $HOME/.profile or $HOME/.bash_profile

I would highly recommend against using /etc/profile.d/yourscript.sh if it produces output. When you use a non-interactive session, you will receive a $TERM is not set message. This is noticeable when using the ssh protocol, like scp. Usually not a big deal, however, Veeam doesn’t like it and will throw a warning. I know Veeam is not the topic here, but it’s worth mentioning that not all applications will gracefully ignore the $TERM is not set warning.

In short, if the script generates output, place it in the locations specified on the first line. However, if you’re modifying the environment and your script doesn’t generate output, then use the latter.

Источник

Titiaiev / bash-guide-1.md

Бесплатная книга-сайт на русском, полный гайд
Advanced Bash-Scripting Guide

BASH — Bourne-Again SHell (что может переводится как «перерожденный шел», или «Снова шел Борна(создатель sh)»), самый популярный командный интерпретатор в юниксоподобных системах, в особенности в GNU/Linux. Ниже приведу ряд встроенных команд, которые мы будем использовать для создания своих скриптов.

break выход из цикла for, while или until
continue выполнение следующей итерации цикла for, while или until
echo вывод аргументов, разделенных пробелами, на стандартное устройство вывода
exit выход из оболочки
export отмечает аргументы как переменные для передачи в дочерние процессы в среде
hash запоминает полные имена путей команд, указанных в качестве аргументов, чтобы не искать их при следующем обращении
kill посылает сигнал завершения процессу
pwd выводит текущий рабочий каталог
read читает строку из ввода оболочки и использует ее для присвоения значений указанным переменным.\
return заставляет функцию оболочки выйти с указанным значением
shift перемещает позиционные параметры налево
test вычисляет условное выражение
times выводит имя пользователя и системное время, использованное оболочкой и ее потомками
trap указывает команды, которые должны выполняться при получении оболочкой сигнала
unset вызывает уничтожение переменных оболочки
wait ждет выхода из дочернего процесса и сообщает выходное состояние.

И конечно же кроме встроенных команд мы будем использовать целую кучу внешних, отдельных команд-программ, с которыми мы познакомимся уже в процессе

Что необходимо знать с самого начала

  1. Любой bash-скрипт должен начинаться со строки:

в этой строке после #! указывается путь к bash-интерпретатору, поэтому если он у вас установлен в другом месте(где, вы можете узнать набрав whereis bash ) поменяйте её на ваш путь.

  1. Коментарии начинаются с символа # (кроме первой строки).
  2. В bash переменные не имеют типа(о них речь пойдет ниже)

Переменные и параметры скрипта

Приведу как пример небольшой пример, который мы разберем:

#!/bin/bash #указываем где у нас хранится bash-интерпретатор
#присваиваем переменной parametr1 значение первого параметра скрипта
parametr1=$1
#присваиваем переменной script_name значение имени скрипта
script_name=$0
# команда echo выводит определенную строку, обращение к переменным осуществляется через $имя_переменной.
echo «Вы запустили скрипт с именем $script_name и параметром $parametr1»
# здесь мы видим другие кавычки, разница в том, что в одинарных кавычках не происходит подстановки переменных.
echo ‘Вы запустили скрипт с именем $script_name и параметром $parametr1’
#Выход с кодом 0 (удачное завершение работы скрипта)
exit 0

Результат выполнения скрипта:

Читайте также:  Количество открытых соединений linux

$ ./test.sh qwerty
Вы запустили скрипт с именем ./test.sh и параметром qwerty
Вы запустили скрипт с именем $script_name и параметром $parametr1

После того как мы познакомились как использовать переменные и передавать скрипту параметры, время познакомиться с зарезервированными переменными:

$DIRSTACK — содержимое вершины стека каталогов
$EDITOR — текстовый редактор по умолчанию
$EUID — Эффективный UID. Если вы использовали программу su для выполнения команд от другого пользователя, то эта переменная содержит UID этого пользователя, в то время как.
$UID — . содержит реальный идентификатор, который устанавливается только при логине.
$FUNCNAME — имя текущей функции в скрипте.
$GROUPS — массив групп к которым принадлежит текущий пользователь
$HOME — домашний каталог пользователя
$HOSTNAME — ваш hostname
$HOSTTYPE — архитектура машины.
$LC_CTYPE — внутренняя переменная, котороя определяет кодировку символов
$OLDPWD — прежний рабочий каталог
$OSTYPE — тип ОС
$PATH — путь поиска программ
$PPID — идентификатор родительского процесса
$SECONDS — время работы скрипта(в сек.)
$# — общее количество параметров переданных скрипту
$* — все аргументы переданыне скрипту(выводятся в строку)
$@ — тоже самое, что и предыдущий, но параметры выводятся в столбик
$! — PID последнего запущенного в фоне процесса
$$ — PID самого скрипта

Условные операторы, думаю, знакомы практически каждому, кто хоть раз пытался на чем-то писать программы. В bash условия пишутся след. образом (как обычно на примере):

#!/bin/bash
#в переменную source засовываем первый параметр скрипта
source=$1
#в переменную dest засовываем второй параметр скрипта
dest=$2

# в ковычках указываем имена переменных для сравнения. -eq — логическое сравнение обозначающие «равны»
if [[ «$source» -eq «$dest» ]]
# если они действительно равны, то
then
#выводим сообщение об ошибке, т.к. $source и $dest у нас равны
echo «Применик $dest и источник $source один и тот же файл!»
# выходим с ошибкой (1 — код ошибки)
exit 1
# если же они не равны
else
# то выполняем команду cp: копируем источник в приемник
cp $source $dest
echo «Удачное копирование!»
fi #обозначаем окончание условия.

Результат выполнения скрипта:

$ ./primer2.sh 1 1
Применик 1 и источник 1 один и тот же файл!

$ ./primer2.sh 1 2
Удачное копирование!

Структура if-then-else используется следующим образом:

В качестве команд возвращающих код возврата могут выступать структуры [[ , [ , test, (( )) или любая другая(или несколько) linux-команда.

test — используется для логического сравнения. после выражения, неоьбходима закрывающая скобка «]»
[ — синоним команды test
[[ — расширенная версия «[» (начиная с версии 2.02)(как в примере), внутри которой могут быть использованы || (или), & (и). Долна иметь закрывающуб скобку «]]»
(( )) — математическое сравнение.

для построения многоярусных условий вида:

для краткости и читаемости кода, можно использовать структуру:

Условия. Множественный выбор

Если необходимо сравнивать какоую-то одну переменную с большим количеством параметров, то целесообразней использовать оператор case.

#!/bin/bash
echo «Выберите редатор для запуска:»
echo «1 Запуск программы nano»
echo «2 Запуск программы vi»
echo «3 Запуск программы emacs»
echo «4 Выход»
#здесь мы читаем в переменную $doing со стандартного ввода
read doing

case $doing in
1)
/usr/bin/nano # если $doing содержит 1, то запустить nano
;;
2)
/usr/bin/vi # если $doing содержит 2, то запустить vi
;;
3)
/usr/bin/emacs # если $doing содержит 3, то запустить emacs
;;
4)
exit 0
;;
*) #если введено с клавиатуры то, что в case не описывается, выполнять следующее:
echo «Введено неправильное действие»

esac #окончание оператора case.

$ ./menu2.sh
Выберите редатор для запуска:
1 Запуск программы nano
2 Запуск программы vi
3 Запуск программы emacs
4 Выход

После выбор цифры и нажатия Enter запуститься тот редактор, который вы выбрали(если конечно все пути указаны правильно, и у вас установлены эти редакторы 🙂 )

Прведу список логических операторв, которые используются для конструкции if-then-else-fi:

-z # строка пуста
-n # строка не пуста
=, (==) # строки равны
!= # строки неравны
-eq # равно
-ne # неравно
-lt,( # меньше
-le,( # меньше или равно
-gt,(>) #больше
-ge,(>=) #больше или равно
! #отрицание логического выражения
-a,(&&) #логическое «И»
-o,(||) # логическое «ИЛИ»

С основами языка и условиями мы разобрались, чтобы не перегружать статью, разобью её на несколько частей(допустим на 3). Во второй части разберем операторы цикла и выполнение математических операций.

Циклы. Цикл for-in.

Оператор for-in предназначен для поочередного обращения к значениям перечисленным в списке. Каждое значение поочередно в списке присваивается переменной.
Синтаксис следующий:

Рассмотрим небольшой пример:

После выполнения примера в первых 5 виртуальных консолях(терминалах) появится строка с её номером. В переменную $i поочередно подставляются значения из списка и в цикле идет работа со значением этой переменной

Читайте также:  Windows defender где папка карантина

Циклы. Цикл while.

Цикл while сложнее цикла for-in и используется для повторения команд, пока какое-то выражение истинно( код возврата = 0).
Синтаксис оператора следующий:

Пример работы цикла рассмотрим на следующем примере:

А теперь результат работы скрипта:

Как видим цикл выполняется до тех пор, пока мы не введем что-то отличное от «yes». Между do и done можно описывать любые структуры, операторы и т.п., все они будут выполнятся в цикле.Но следует быть осторожным с этим циклом, если вы запустите на выполнение в нём какую-либо команду, без изменения переменной выражения, вы можете попасть в бесконечный цикл.

Теперь об условии истинности. После while , как и в условном операторе if-then-else можно вставлять любое выражение или команду, которая возвращает код возврата, и цикл будет исполнятся до тех пор, пока код возврата = 0! Оператор [ аналог команды test , которая проверяет истинность условия, которое ей передали.

Рассмотрим еще один пример, я взял его из книги Advanced Bash Scripting. Уж очень он мне понравился :), но я его немного упростил. В этом примере мы познакомимся с еще одним типом циклов UNTIL-DO. Эта практически полный аналог цикла WHILE-DO, только выполняется пока какое-то выражение ложно.
Вот пример:

Результат выполнения скрипта:

Команда let .
Команда let производит арифметические операции над числами и переменными.
Рассмотрим небольшой пример, в котором мы производим некоторые вычисления над введенными числами:

Ну вот, как видите ничего сложного, список математических операций стандартный:

+ — сложение
— — вычитание
* — умножение
/ — деление
** — возведение в степень
% — модуль(деление по модулю), остаток от деления
let позволяет использовать сокращения арифметических команд, тем самым сокращая кол-во используемых переменных. Например: a = a+b эквивалентно a +=b и т.д

Работа с внешними программами при написании shell-скриптов

Для начала немного полезной теории.

В bash (как и многих других оболочках) есть встроенные файловые дескрипторы: 0 (stdin) , 1 (stdout) , 2 (stderr) .
stdout — Стандартный вывод. Сюда попадает все что выводят программы
stdin — Стандартный ввод. Это все что набирает юзер в консоли
stderr — Стандартный вывод ошибок.
Для операций с этими дескрипторами, существуют специальные символы: > (перенаправление вывода), (перенаправление ввода). Оперировать ими не сложно. Например:

Если есть необходимость дописывать в файл(при использовании » > » он заменятеся), необходимо вместо » > » использовать » >> «

после просьбы sudo ввести пароль, он возьмется из файла my_password, как будто вы его ввели с клавиатуры.
Если необходимо записать в файл только ошибки, которые могли возникнуть при работе программы, то можно использовать:

цифра 2 перед » > » означает что нужно перенаправлять все что попадет в дескриптор 2(stderr).
Если необходимо заставить stderr писать в stdout , то это можно след. образом:

символ » & » означает указатель на дескриптор 1(stdout)
(Поумолчанию stderr пишет на ту консоль, в котрой работает пользователь(вренее пишет на дисплей)).

Конвеер — очень мощный инструмент для работы с консолью Bash. Синтаксис простой:
команда1 | команда 2 — означает, что вывод команды 1 передастся на ввод команде 2
Конвееры можно группировать в цепочки и выводить с помощью перенаправления в файл, например:

вывод команды ls -la передается команде grep , которая отбирает все строки, в которых встретится слово hash, и передает команде сортировке sort , которая пишет результат в файл sorting_list. Все довольно понятно и просто.

Чаще всего скрипты на Bash используются в качестве автоматизации каких-то рутинных операций в консоли, отсюда иногда возникает необходимость в обработке stdout одной команды и передача на stdin другой команде, при этом результат выполнения одной команды должен быть неким образом обработан. В этом разделе я постораюсь объяснить основные принципы работы с внешними командами внутри скрипта. Думаю что примеров я привел достаточно и можно теперь писать только основные моменты.

1. Передача вывода в переменную.

Для того чтобы записать в переменную вывод какой-либо команды, достаточно заключить команду в « ковычки, например

Результат работы: qwerty

Однако если вы захотите записать в переменную список директорий, то необходимо, должным образом обработать результат для помещения данных в переменную. Рассмотрим небольшой, пример:

Здесь мы используем цикл for-do-done для архивирование всех директорий в папке /svn/ с помощью команды svnadmin hotcopy (что в нашем случае не имеет никого значения, просто как пример). Наибольшй интерес вызывает строка: LIST= find /svn/ -type d 2>/dev/null| awk ‘ ‘| sort|uniq | tr ‘\n’ ‘ ‘ В ней переменной LIST присваивается выполнение команды find, обработанной командами awk, sort, uniq,tr(все эти команды мы рассматривать не будем, ибо это отдельная статья). В переменной LIST будут имена всех каталогов в папке /svn/ пгомещенных в одну строку(для того чтобы её стравить циклу.

Источник

Оцените статью