Вы можете выполнить все обработка текста с помощью одного вызова 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.
В команде нет встроенного -. Вы можете немного схитрить, но результат зависит от ваших настроек. Самое близкое, о чем я могу думать, это:
history | tail -n `history | tail -n 1 | awk "{print \\\$1-$HISTSIZE;}"`
Вы можете использовать псевдоним.
Команда history
перечисляет свои записи. Большую часть времени ваш $HISTFILE
имеет максимальное количество записей($HISTSIZE
значение ). Таким образом, вы обнаружите, что дополнительные команды, пронумерованные выше $HISTSIZE
, представляют собой список команд, введенных в этом самом сеансе ssh.
Он работает, показывая историю с числами, а не получая последнюю строку и первый столбец и вычитая значение $HISTSIZE
, поэтому мы знаем, сколько команд было после входа в систему. Этот параметр отправляется в хвост -n, который показывает только то количество последних записей из истории.
К сожалению, он не работает должным образом, если в истории меньше $HISTSIZE
команд. Чтобы сделать его лучше, вам нужно будет выполнить некоторые дополнительные настройки в вашем файле .bashrc
, поэтому всякий раз, когда вы входите в систему, будет установлена дополнительная переменная, которая запоминает количество записей в истории. Затем используйте эту переменную вместо$HISTSIZE
Интересно. Я полагаю, что нет встроенного -, но вы можете определить новую переменную и увеличивать ее после каждой команды. Например:
$ 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
Если вам нужен только общий подсчет без конкретики, попробуйте echo $LINENO
.
Интерпретатор рассматривает вашу сессию как поток и подсчитывает входящие строки. Это в основном сколько раз вы нажали return.
Если вы вводите многострочные команды, каждая строка будет учитываться отдельно.
Для подсчета -сеансов я бы использовал 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
недоступна извне!