Это называетсякосвенным обращениеми имеет следующий синтаксис ${!reference}
для подстановки значения переменной, имя которой находится в переменной reference
. Например:
name='Jane Doe'
reference='name'
$ echo "${!reference}"
Jane Doe
Это действительно вполне достижимо. :Я делал что-то очень похожее в университете, примерно в 1998 году.
По сути, вам нужно настроить процесс getty
RasPi для вызова вашей собственной версии программы login
вместо стандартной /bin/login
. Эта часть проста.
Ваша пользовательская login
замена может быть даже сценарием, если вам не нужно, чтобы он был особенно безопасным, или вы просто создаете прототип. Но для серьезной реализации, на мой взгляд, это должна быть скомпилированная программа, поскольку в целях безопасности :отключение интерпретатора сценариев сводит к минимуму объем кода для запуска и, таким образом, затрудняет настройку условий гонки или других атак против него.
Тем не менее, я вижу возможную проблему взаимодействия с пользователем в вашем дизайне :когда пользователь уже ввел свое имя для входа в систему, он, вероятно, продолжит вводить свой пароль, как только появится запрос пароля, почти как рефлекторное действие особо не думая. Если попытка SSH-подключения не удалась и то же имя для входа автоматически повторно используется для попытки локального входа в систему, пользователь может подумать, что он подключен к серверу, и запутаться, обнаружив, что у него локальный вход.
Возможно, для локального входа лучше потребовать преднамеренное действие, например переключение на вторую виртуальную консоль с неизмененной getty
конфигурацией. Вы можете добавить инструкции по нужному нажатию клавиши в /etc/issue
, чтобы getty
отображал его перед запросом входа в систему. В качестве побочного эффекта ваш настраиваемый login
скрипт или двоичный файл может быть значительно упрощен до простого:
#!/bin/sh
REMOTEUSER="$1"
exec ssh -oEscapeChar=none "$REMOTEUSER"@your.server.example
Опция -oEscapeChar=none
предотвратит использование управляющей клавиши OpenSSH, поэтому пользователи не смогут настраивать переадресацию портов или выполнять другие махинации с клиентом SSH (спасибо Ferrybig за напоминание! ).
Посколькуlogin
(или любая его замена )будет работать от имени пользователя root,было бы лучше переключиться на какого-нибудь пользователя, отличного от -, прежде чем exec()
вводить команду ssh
. Здесь скомпилированная программа будет более гибкой.
Если у вас есть хоть малейший опыт в программировании, я бы порекомендовал вам загрузить пакет исходного кода для /bin/login
выбранного вами дистрибутива Linux и посмотреть, сможете ли вы взломать его, чтобы сделать это.
По сути, вам нужно будет внести два изменения :вместо того, чтобы использовать имя пользователя, присвоенное ему в качестве параметра getty
для выбора имени пользователя для входа в систему, вы заставите свою замену login
использовать жесткий -закодированное имя пользователя, которое вы зарезервируете только для исходящих соединений SSH. И вместо того, чтобы exec()
вызывать оболочку пользователя в конце процесса входа в систему, вы должны exec()
ввести команду SSH, задав ей в качестве параметров имя пользователя, полученное из getty
, и имя вашего сервера.