Есть ли способ узнать, сколько команд я выполнил с тех пор, как я выполнил ssh'd / вошел в систему в bash? [дубликат]

Вы можете выполнить все обработка текста с помощью одного вызова AWK, упрощенная, поскольку вас интересует только пересылка:

#!/bin/sh

awk '/^Host / { host = $2 } host && /(Remote|Local|Dynamic)Forward/ { port=$2; gsub(".*:", "", port); print host, port }' ~/.ssh/config | while read host port; do
    nc -z 127.0.0.1 "${port}" || ssh -fqN "${host}" > /dev/null 2>&1
done

Написанный более разборчиво, сценарий AWK

/^Host / { host = $2 }

host && /(Remote|Local|Dynamic)Forward/ {
    port=$2; gsub(".*:", "", port); print host, port
}

Сохраняет хост каждый раз, когда он видит оператор «Host», а затем в строках, встречающихся во время определен допустимый хост, и соответствие одному из принятых операторов «Forward» извлекает целевой порт, отбрасывает часть перед двоеточием, если таковая имеется, и выводит хост и порт:

localsocksdynamic 8080
localwebserverremote 8080
indirectaccesslocal 2222

Затем это передается в в то время как циклreadдля проверки порта и запуска SSH.

1
27.11.2018, 22:57
4 ответа

В команде нет встроенного -. Вы можете немного схитрить, но результат зависит от ваших настроек. Самое близкое, о чем я могу думать, это:

history | tail -n `history | tail -n 1 | awk "{print \\\$1-$HISTSIZE;}"`

Вы можете использовать псевдоним.

Команда historyперечисляет свои записи. Большую часть времени ваш $HISTFILEимеет максимальное количество записей($HISTSIZEзначение ). Таким образом, вы обнаружите, что дополнительные команды, пронумерованные выше $HISTSIZE, представляют собой список команд, введенных в этом самом сеансе ssh.

Он работает, показывая историю с числами, а не получая последнюю строку и первый столбец и вычитая значение $HISTSIZE, поэтому мы знаем, сколько команд было после входа в систему. Этот параметр отправляется в хвост -n, который показывает только то количество последних записей из истории.

К сожалению, он не работает должным образом, если в истории меньше $HISTSIZEкоманд. Чтобы сделать его лучше, вам нужно будет выполнить некоторые дополнительные настройки в вашем файле .bashrc, поэтому всякий раз, когда вы входите в систему, будет установлена ​​​​дополнительная переменная, которая запоминает количество записей в истории. Затем используйте эту переменную вместо$HISTSIZE

0
27.01.2020, 23:14

Интересно. Я полагаю, что нет встроенного -, но вы можете определить новую переменную и увеличивать ее после каждой команды. Например:

$ count=0
$ PROMPT_COMMAND='count=$((count + 1))'
$ echo $count
1
$ echo command
command
$ echo another command
another command
$ echo $count
4

РЕДАКТИРОВАТЬ:

Или зная, что история хранится в памяти до выхода из оболочки что-то подобное также сработает, если вы не изменить формат истории или использовать PROMPT_COMMANDдля сохранения истории после каждая команда:

diff <(history | sed -E 's,\s+?[0-9]+ ,,') ~/.bash_history
2
27.01.2020, 23:14

Если вам нужен только общий подсчет без конкретики, попробуйте echo $LINENO.

Интерпретатор рассматривает вашу сессию как поток и подсчитывает входящие строки. Это в основном сколько раз вы нажали return.

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

5
27.01.2020, 23:14

Для подсчета -сеансов я бы использовал HISTCMD. Однако он отслеживает всю сохраненную историю bash, поэтому сохраните копию входящего HISTCMD для этого экземпляра оболочки, а затем вычтите из нее.

В~.bashrc:

OHISTCMD=$HISTCMD

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

echo $((HISTCMD - OHISTCMD - 1))

Примечание из руководства:

If HISTCMD is unset, it loses its special properties, even if it is subsequently reset.

, а также то, что вызов команд из истории со стрелкой вверх -не увеличивает HISTCMD.

Очень жаль, что глобальная переменнаяhistory_offsetнедоступна извне!

0
27.01.2020, 23:14

Теги

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