bash_history: прокомментируйте опасные команды: '#'

Для наблюдения, какие потоки работают в mysql из Linux:

root@myserver:~> mysqladmin processlist

Эквивалентный запрос mysql к этому был бы:

root@myserver:~> mysql
mysql> SHOW FULL PROCESSLIST\G

Кроме того, выезд, Исследующий информацию о Потоке для наблюдения то, что означает вывод. Прежде всего:

Команда и состояние указывают на то, что делает поток.

Большинство состояний соответствует очень быстрым операциям. Если поток остается в данном состоянии в течение многих секунд, могла бы быть проблема, которая должна быть исследована.

Основной момент должен посмотреть на mysql список процессов и видеть, выглядит ли что-нибудь подозрительным Вам, учитывая природу Вашей среды, например, продолжительные процессы или большой # процессов.

16
27.11.2016, 16:49
2 ответа

Вы могли сделать что-то как:

fixhist() {
   local cmd histnum
   cmd=$(HISTTIMEFORMAT=/ history 1)
   histnum=$((${cmd%%[*/]*}))
   cmd=${cmd#*/} # remove the histnum
   case $cmd in
     (rm\ *|mv\ *|...)
       history -d "$histnum" # delete
       history -s "#$cmd"    # add back with a #
   esac
}
PROMPT_COMMAND=fixhist

Причем идея состоит в том, что перед каждой подсказкой, мы проверяем последнюю запись истории (history 1) и если это - один из опасных, мы удаляем его (history -d) и добавьте его назад с a # с history -s.

(очевидно, необходимо удалить Ваш HISTIGNORE установка).

Нежелательный побочный эффект что, хотя то, что он изменяет время истории тех rm, mv... команды.

Для фиксации этого альтернатива могла быть:

fixhist() {
   local cmd time histnum
   cmd=$(HISTTIMEFORMAT='<%s>' history 1)
   histnum=$((${cmd%%[<*]*}))
   time=${cmd%%>*}
   time=${time#*<}
   cmd=${cmd#*>}
   case $cmd in
     (rm\ *|mv\ *|...)
       history -d "$histnum" # delete
       HISTFILE=/dev/stdin history -r <<EOF
#$time
#$cmd
EOF
   esac
}
PROMPT_COMMAND=fixhist

На этот раз мы записываем время последней истории, и добавить назад строку истории, мы используем history -r из временного файла (здесь документ), который включает метку времени.

Вы хотели бы fixhist быть выполненным перед Вашим history -a; history -c; history -r. К сожалению, текущая версия bash имеет ошибку в этом history -a не сохраняет ту дополнительную строку, которую мы добавили. Работа вокруг должна записать это вместо этого:

fixhist() {
   local cmd time histnum
   cmd=$(HISTTIMEFORMAT='<%s>' history 1)
   histnum=$((${cmd%%[<*]*}))
   time=${cmd%%>*}
   time=${time#*<}
   cmd=${cmd#*>}
   case $cmd in
     (rm\ *|mv\ *|...)
       history -d "$histnum" # delete
       history -a
       [ -f "$HISTFILE" ] && printf '#%s\n' "$time" "$cmd" >> "$HISTFILE";;
     (*)
       history -a
   esac
   history -c
   history -r
}
PROMPT_COMMAND=fixhist

Это должно добавить прокомментированную команду к HISTFILE самостоятельно вместо разрешения history -a сделайте это.

9
27.01.2020, 19:48
  • 1
    может Вы объяснять что cmd=${cmd#*[0-9] } ? И где точно должен я помещать fixhist в моем PROMPT_COMMAND? В данный момент это уже содержит PROMPT_COMMAND="history -a; history -c; history -r" –  Martin Vegter 19.01.2014, 23:47
  • 2
    , из чего роль HISTTIMEFORMAT=/? Я уже установил export HISTTIMEFORMAT="%b-%d %H:%M ". Между прочим, когда я добавляю Ваш код в мой $HOME/.bashrc, ничего не происходит. –  Martin Vegter 20.01.2014, 00:27
  • 3
    HISTTIMEFORMAT=/ только для того одного вызова history получить вывод как 123 /rm x где легче извлечь cmd. Была проблема с некоторыми версиями bash где $HISTCMD было поддельным в том контексте, попробуйте новую версию. –  Stéphane Chazelas 20.01.2014, 00:38
  • 4
    все еще не работает. Я задаюсь вопросом, сделайте # в коде не действуют как комментарии в .bashrc? –  Martin Vegter 20.01.2014, 13:59
  • 5
    @MartinVegter, да, для измененных записей истории, bash вставляет a * после числа истории, которое не ожидалось. Должен быть зафиксирован теперь. –  Stéphane Chazelas 18.04.2014, 16:41

Я не собираюсь точно отвечать на Ваш вопрос, но возможно давать Вам альтернативное решение Вашей проблемы.

Если я понимаю правильно, что Вы обеспокоены ошибками, Вы могли бы сделать путем ввода, например, !rm если это произошло что предыдущее rm команда в истории удаляет что-то, что требуется сохранить.

В этом случае хорошая опция удара histverify. Если Вы shopt -s histverify, и если Вы повторно вызываете команду с ударом !, это сразу не выполнится, но будет загружено в readline так, чтобы можно было или решить выполнить его или нет, и это также дает Вам возможность отредактировать его.

Попробуйте:

  • Без histverify:

    $ touch some_foo
    $ rm some_foo
    $ touch some_foo
    $ !rm
    rm some_foo
    $ # oooops in fact I'd've like to keep it this time
    
  • С histverify:

    $ shopt -s histverify
    $ touch some_foo
    $ rm some_foo
    $ touch some_foo
    $ !rm
    $ rm some_foo <cursor here>
    

    В этом случае у Вас будет курсор в конце строки, готовой запустить его снова - или не - или отредактировать его.

Если Вы любите эту опцию, вставляете ее Ваш .bashrc:

shopt -s histverify
11
27.01.2020, 19:48

Теги

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