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

Чтобы облегчить мою жизнь, но не беспокоить других своими настройками, я создал файл .bashrc, который я копирую в /tmp /matthewh всякий раз, когда мне приходится использовать новый хост.

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

# History options
export HISTTIMEFORMAT="%F %T "
export HISTCONTROL=ignorespace 
export HISTSIZE=2000
export HISTFILESIZE=2000
export HISTFILE="/tmp/matthewh/$USER.bash_history"

После копирования файла я соединяюсь с ssh user@host -t "bash --rcfile /tmp/matthewh/.bashrc" .

Это работает отлично. Проблема возникает, когда я переключаюсь на другого пользователя и получаю файл .bashrc.

$ su - apache
$ . /tmp/matthewh/.bashrc

Проблема в том, что первоначальный su - apache загружает историю apache из ~/.bash_history, а затем, когда я получаю исходный код .bashrc, уже слишком поздно. Файл истории изменился правильно, но он уже был загружен. Я могу исправить эту проблему, запустив history -c && history -r , поэтому все, что мне нужно сделать, это поместить это в .bashrc, и все должно быть в порядке, верно?

К сожалению, если я добавлю это в мой файл .bashrc, он ломается, когда я вхожу с ssh и опцией -t "bash --rcfile /tmp/matthewh/.bashrc" . Так как это делает его источником для входа в систему, загрузка истории является частью процесса. Это означает, что history -r в .bashrc загружает историю во второй раз, и моя рабочая история в два раза больше, чем должна быть.

Есть ли способ для .bashrc определить, поступает ли он вручную или из оболочки входа в систему, чтобы он мог только очистить и перезагрузить историю условно?

5 ответов5

1

Вместо очистки и перезагрузки истории в файле rc, отложите ее, пока оболочка не выдаст первое приглашение:

PROMPT_COMMAND='unset PROMPT_COMMAND; test -f $HISTFILE && history -c && history -r $HISTFILE'
1

Один из способов - определить, установлены ли переменные SSH:

SSH_CLIENT='...'
SSH_CONNECTION='...'
SSH_TTY=/dev/pts/1

Когда вы "su -", они не будут установлены в новой среде. Итак, вы можете добавить что-то вроде:

[ -z "$SSH_TTY" ] && history -c && history -r
0

Одним из решений является проверка, является ли файл истории пустым или нет:

# If this was sourced manually history will not be empty
currhistsize="`history | wc -l`"
if [[ "${currhistsize// }" != "0" ]]; then
    # Clear the old history, then reload the correct history
    history -c
    history -r
fi

Необходимо было использовать $ {currhistsize//}, потому что он имел кучу начальных пробелов, которые нужно было удалить.

Это похоже на обходной путь, а не реальное решение, хотя. Я был бы очень заинтересован в правильном способе проверки, был ли файл получен вручную или из инициализации оболочки.

-1

Что-то, о чем я только что подумал. Никогда не пробовал и кто знает, есть ли другие рекурсии.

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

Вы всегда можете создать второго пользователя с таким же uid. Обычно я бы не рекомендовал это, но я никогда не рекомендую 100% против всего, потому что это может быть идеальным решением для вашей ситуации.

Например, если Apache UID: 30, GID: 8

Затем создайте пользователя, возможно, matthewapache с uid: 30, gid: 8

У вас должен быть доступ, идентичный apache (на самом деле, если вы выполните команду "id", она скажет, что вы apache), но ваш домашний каталог, история и т.д. Находятся в /home /matthewapache (или там, где вы устанавливаете свой домашний каталог). )

Попробуйте это. Войдите как apache, запустите "историю". Затем войдите как matthewapache, запустите "историю".

Бен

-1

Хорошо, вот еще одна идея. Каждая сессия bash будет иметь уникальный идентификатор. Просто чтобы быть уверенным, что вы также можете сделать уникальную метку времени. Это не решит вашу проблему напрямую, и я не уверен, что это будет работать так, как я пишу, но любая новая оболочка создаст свой собственный файл истории на основе PID и метки времени

Вы можете положить в .bashrc что-то вроде

mypid=echo $$
mydatestamp=`date +"%Y%m%d_%H%M%S"`
export HISTFILE="/root/historyfiles/$mypid.$mydatestamp.bash_history"

По крайней мере, вы держите все таким образом отдельно.

Не проверено, так что если вы идете с этим типом идеи, вероятно, нужно настроить его, пока он не работает :)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .