Терминалы отправляют символы (или, точнее, байты), а не ключи. Когда нажата клавиша, представляющая печатный символ, терминал отправляет этот символ в приложение. Большинство функциональных клавиш закодированы как escape-последовательности: последовательности символов, которые начинаются с номера символа 27. Некоторые сочетания клавиш в форме Ctrl + символ и несколько функциональных клавиш отправляются как управляющие символы - в наборе символов ASCII , который все современные компьютеры используют в качестве основы (Unicode, ISO Latin- n и т. д. - все надмножества ASCII), 33 символа являются управляющие символы: символы с номерами от 0 до 31 и 127.Управляющие символы не печатаются, но предназначены для использования в приложениях; например, символ 10, который является Control-J (обычно пишется ^ J), является символом новой строки, поэтому, когда терминал отображает этот символ, он перемещает курсор на следующую строку, а не отображает глиф. Сам escape-символ является управляющим символом ^ [(значение 27).
Не хватает управляющих символов, чтобы покрыть все сочетания клавиш Ctrl + символ . Только буквы и символы @ [\] ^ _?
имеют соответствующий управляющий символ. Когда вы нажимаете Ctrl + 4 или Ctrl + $ (как я полагаю, это Ctrl + ) Shift + 4 ), терминал должен выбрать что-то для отправки. В зависимости от терминала и его конфигурации существует несколько общих возможностей:
4
или $
. Многие терминалы отправляют управляющие символы для некоторых клавиш в ряду цифр:
Я не знаю где возникла эта конкретная конвенция.
Ctrl + | отправляет тот же символ, потому что это Ctrl + Shift + \ , а терминал отправляет ^ \ была ли нажата клавиша Shift или нет.
Сам терминал (точнее, общая поддержка терминала в ядре) интерпретирует несколько управляющих символов специально. Эта интерпретация может быть настроена для сопоставления различных символов или отключена приложениями, которые хотят обрабатывать символы самостоятельно. Одна хорошо известная такая интерпретация заключается в том, что ^ M, символ, отправляемый клавишей Return , отправляет текущую строку в приложение, если терминал находится в режиме готовой , в котором приложения получать ввод построчно.
Несколько символов отправляют сигналы приложению на переднем плане. ^ C отправляет сигнал прерывания (SIGINT), который обычно сообщает приложению прекратить то, что оно делает, и прочитать следующую команду пользователя. Неинтерактивные приложения обычно закрываются.^ \ отправляет сигнал выхода (SIGQUIT), который обычно сообщает приложению о том, что нужно как можно скорее выйти, ничего не сохраняя; многие приложения не отменяют поведение по умолчанию, которое заключается в немедленном прекращении работы приложения¹. Поэтому, когда вы нажимаете Ctrl + 4 (или что-нибудь, что отправляет символ ^ \) в cat
или bc
, ни один из них не отменяет поведение по умолчанию, приложение убито.
Терминал сам распечатывает часть сообщения ^ \
: это визуальное изображение набранного вами символа, и терминал находится в готовом режиме и с включенным эхом (символы отображаются терминал, как только вы их наберете, в отличие от не-эхо-режим, в котором символы отправляются только в приложение, которое может или не может выбрать их отображение). Часть Quit
происходит от bash: он замечает, что его дочерний процесс умер из-за сигнала выхода, и это его способ сообщить вам об этом.
Оболочки обрабатывают все общие сигналы, поэтому, если вы наберете ^ \ в оболочке, вы не прервете сеанс, вы просто получите новое приглашение, такое же, как ^ C.
Вы можете поиграть с настройками терминала с помощью команды stty
.
¹ И традиционно генерирует дамп ядра , но многие системы в настоящее время отключают это по умолчанию.
Предполагая, что у вас есть настроенные ключи root ssh и локально сгенерированные шаблоны, stat с этим;
for HOST in $HOSTS ; do
scp wifi-templates/* $HOST:/etc/NetworkManager/system-connections/
ssh $HOST 'U=$(ls -1 /home/ | head -n 1); perl -pi -e "s/(permissions=user:)you(:;)/$1'$U'$2/g" /etc/NetworkManager/system-connections/*'
done
Шаблоны;
while read L ; do
SSID=$(echo $L | cut -d ";" -f 1)
N=$(echo $L | cut -d ";" -f 2)
PASS=$(echo $L | cut -d ";" -f 3)
cp template $N
perl -pe 's/SSID/'$SSID'/g;s/PASS/'$PASS'/g' $N
done < AP.txt
*Этот код предназначен только для демонстрации. (Не тестировался и может потребовать настройки, чтобы он работал. )Пожалуйста, прочтите справочную страницу каждой команды перед использованием;