Трек-логин, выполненный с помощью неинтерактивных оболочек

Это относится к этому вопросу.

Я хотел регистрировать каждый раз, когда кто-то вошел в систему через ansible.

Я поместил свой скрипт в файл ~/.bash_profile. Вот сценарий,

#!/bin/bash now=$(date +"%T") echo "$USER logged in at: $now" >> /home/alphauser/ssh-entries.log

Я поместил это в конец ~/.bash_profile,

bash ~/ssh-login-entry.sh

Однако, ansible использует неинтерактивную оболочку, поэтому мой скрипт был не выполняется, когда я вошел в систему через ansible, поскольку ~/.bash_profile выполняется только при запуске новой интерактивной оболочки.

Затем я вставил это в конец файла .bashrc, но все равно это не сработало.

Как я могу регистрировать записи, когда кто-то регистрируется через неинтерактивную оболочку? Я имею в виду, где я должен разместить этот скрипт так, чтобы он выполнялся каждый раз, когда кто-то регистрировался через ansible?

Надеюсь, что вопрос ясен.

3
задан 20 July 2017 в 01:09

4 ответа

Все логины, интерактивные и неинтерактивные, локальные и удаленные, регистрируются в /var/log/auth.log. Я предлагаю вам использовать это вместо того, чтобы возиться с файлами запуска профиля, которые может изменить измененная учетная запись пользователя.

0
ответ дан 18 July 2018 в 10:06

Когда bash запускается как неинтерактивная оболочка, он не считывает файлы запуска. Вместо этого он ищет переменную окружения $BASH_ENV и, если это указывает на файл, читает все, на что указывает. Это объясняется в разделе INVOCATION man bash:

Когда bash запускается неинтерактивно, для запуска сценария оболочки, например, он ищет переменную BASH_ENV в среде, расширяет ее значение, если он появляется там и использует расширенное значение как имя файла для чтения и выполнения. Bash ведет себя так, как если бы выполнялась следующая команда: if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi , но значение переменной PATH не используется для поиска имени файла.

Итак, если вы установите BASH_ENV для указания файла, содержащего вашу команду, он должен работать:

Измените /etc/environment, чтобы установить BASH_ENV для всех пользователей. Откройте файл в своем любимом редакторе и добавьте эту строку: export BASH_ENV="/path/to/your/file" Создайте /path/to/your/file со следующим содержимым: printf '%s logged in at: %s\n' "$USER" "$(date +'%T')" >> /home/alphauser/ssh-entries.log

Теперь попробуйте снова войти в систему через ansible.

Важно: у меня нет опыта в использовании, поэтому я не совсем уверен, как вы его используете. Предполагается, что вы сначала запустите обычную оболочку для входа, а затем запустите команду ansible. Если нет, это, вероятно, потерпит неудачу. Если это не сработает, отредактируйте свой вопрос и дайте больше информации о том, как вы входите в систему через ansible.

1
ответ дан 18 July 2018 в 10:06

Все логины, интерактивные и неинтерактивные, локальные и удаленные, регистрируются в /var/log/auth.log. Я предлагаю вам использовать это вместо того, чтобы возиться с файлами запуска профиля, которые может изменить измененная учетная запись пользователя.

0
ответ дан 24 July 2018 в 19:30
  • 1
    Спасибо, Дэвид. Я знал это, но мне просто нужен отдельный файл для доступных логинов. – luv.preet 19 July 2017 в 22:21
  • 2
    Не можете ли вы фильтровать файл журнала для определенных типов входа? Я сам не использую Ansible. Возможно, вы можете предоставить отрывок из файла журнала после входа в Ansible, и я могу помочь вам отличить его от других записей журнала. – David Foerster 20 July 2017 в 02:17

Когда bash запускается как неинтерактивная оболочка, он не считывает файлы запуска. Вместо этого он ищет переменную окружения $BASH_ENV и, если это указывает на файл, читает все, на что указывает. Это объясняется в разделе INVOCATION man bash:

Когда bash запускается неинтерактивно, для запуска сценария оболочки, например, он ищет переменную BASH_ENV в среде, расширяет ее значение, если он появляется там и использует расширенное значение как имя файла для чтения и выполнения. Bash ведет себя так, как если бы выполнялась следующая команда: if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi , но значение переменной PATH не используется для поиска имени файла.

Итак, если вы установите BASH_ENV для указания файла, содержащего вашу команду, он должен работать:

Измените /etc/environment, чтобы установить BASH_ENV для всех пользователей. Откройте файл в своем любимом редакторе и добавьте эту строку: export BASH_ENV="/path/to/your/file" Создайте /path/to/your/file со следующим содержимым: printf '%s logged in at: %s\n' "$USER" "$(date +'%T')" >> /home/alphauser/ssh-entries.log

Теперь попробуйте снова войти в систему через ansible.

Важно: у меня нет опыта в использовании, поэтому я не совсем уверен, как вы его используете. Предполагается, что вы сначала запустите обычную оболочку для входа, а затем запустите команду ansible. Если нет, это, вероятно, потерпит неудачу. Если это не сработает, отредактируйте свой вопрос и дайте больше информации о том, как вы входите в систему через ansible.

1
ответ дан 24 July 2018 в 19:30
  • 1
    Одно можно сказать наверняка, что он использует неинтерактивную оболочку. Я сделал, как вы сказали. Но это не сработало. Тем не менее, после запуска загружаемой книги, я зашел в систему через ssh, а затем побежал echo $BASH_ENV и ничего не вернулся. – luv.preet 19 July 2017 в 22:39
  • 2
    @ luv.preet no, ssh - еще один частный случай. Что с ней связано? Вы не упомянули об этом в своем вопросе. – terdon♦ 20 July 2017 в 01:00
  • 3
    Ничего общего с ssh. Но при запуске echo $BASH_ENV он должен отображать имя переменной, не так ли? – luv.preet 20 July 2017 в 09:42
  • 4
    @ luv.preet да, но только если вы одинажите его, чтобы защитить от текущей оболочки: ssh user@host echo '$BASH_ENV'. – terdon♦ 20 July 2017 в 11:51

Другие вопросы по тегам:

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