Создайте файл после того, как вход в систему ssh перестанет запрашивать
Однострочный вопрос: как мне автоматически получить удаленный файл на удаленном хосте после входа в систему через SSH через хост-бастион?
Мне нужно получить файл, содержащий список псевдонимов + пользовательских функций оболочки на удаленном хосте после ssh-ing в него.
Файл существует при удаленной обработке в папке / tmp, например / tmp / my-rc
Поиск в других сообщениях и в Интернете, которые я нашел
ssh -t [email protected] 'source /tmp/my-rc; bash -l'
Проблема в том, что у меня есть терминал, но ни один из псевдонимов не установлен, так как это новая оболочка bash '
Думая, что источник должен быть создан после присоединения оболочки, попробовал следующее, но это тоже не работает. Ошибки нет, я получаю терминал, но не думаю, что файл был получен (проверено путем вывода фиктивного сообщения из файла / tmp / my-rc)
ssh -t [email protected] 'bash -l; source /tmp/my-rc'
Даже пробовал с "." вместо источника не повезло.
Любая помощь.
Примечание 1: Bash или ZSH подойдет любое решение оболочки.
Примечание 2: Актуальный ssh осуществляется через прокси-команду, то есть переход через хост-бастион (просто упомянув, актуален ли он вообще)
Примечание 3: у меня нет прав доступа к профилю rc или bashrc или даже к домашнему каталогу на удаленном хосте.
Примечание 4: точная команда, которую я использовал для входа на защищенный хост, - через хост-бастион, как показано ниже.
ssh -o ProxyCommand='ssh -W %h:%p ec2-3-218-12-120.compute-1.amazonaws.com' 10.0.31.122
Ответы
С помощью bash
вы можете:
ssh -t user@host '
PROMPT_COMMAND="source /tmp/my-rc
unset PROMPT_COMMAND
" exec bash --norc'
Это приведет /tmp/my-rc
к тому, что будет получен источник до приглашения, и только это приглашение, поскольку мы отключим его PROMPT_COMMAND
после.
Вы захотите удалить unset PROMPT_COMMAND
if, в /tmp/my-rc
конечном итоге определяя его.
Приведенное выше предполагает, что оболочка входа удаленного пользователя похожа на Bourne, но вы должны иметь возможность адаптировать ее к большинству других типов оболочек (csh / rc / fish).
Учитывая, что вы можете писать на удаленный хост /tmp
, вы можете создать на нем /tmp/myhome
каталог, поместить туда профиль вашей оболочки и файлы инициализации, а затем запустить Zsh с ZDOTIDR
установленным значением /tmp/myhome
и Bash с HOME
установленным значением /tmp/myhome
.
По умолчанию Zsh ищет свои файлы инициализации в $ZDOTDIR
, по умолчанию $HOME
if ZDOTDIR
не установлено.
Следовательно, вы можете запустить Zsh на удаленном хосте как:
ssh -t user@host ZDOTDIR=/tmp/myhome zsh
И Баш как:
ssh -t user@host HOME=/tmp/myhome bash
Конечно, вы можете проявить творческий подход к своим файлам профиля / инициализации - например, использовать их для установки HOME
более подходящего пути, исходных других файлов (если у вас уже есть точечные файлы где-то на удаленном хосте) и т.
Минимальное применение этого подхода, объединенное в одну команду, может быть таким:
ssh -t user@host 'mkdir /tmp/myhome
echo ". /tmp/my-rc" >/tmp/myhome/.bashrc
HOME=/tmp/myhome bash'
(Используйте, mkdir -p ...
чтобы предотвратить отображение ошибки, если она /tmp/myhome
уже существует, например, если вы повторно подключаетесь к удаленному хосту и уже знаете, что каталог находится там).
С ProxyCommand
учетом вас это может быть:
ssh -t -o ProxyCommand='ssh -W \
%h:%p ec2-3-218-12-120.compute-1.amazonaws.com' \
10.0.31.122 \
'mkdir /tmp/myhome
echo ". /tmp/my-rc" >/tmp/myhome/.bashrc
HOME=/tmp/myhome bash'
Наконец, о ваших попытках: ssh -t [email protected] 'bash -l; source /tmp/my-rc'
не работает, потому что source
команда выполняется только после выхода из интерактивной оболочки.
Если UsePAM имеет значение yes в файле sshd_config удаленных хостов, то файл конфигурации /etc/pam.d/sshd позволяет автоматизировать выполнение команд при успешном входе в систему, среди других событий в процессе аутентификации. Добавьте эту строку кода
session required pam_exec.so /etc/myscripts/./sourcing-script
прямо над этими линиями
# SELinux needs to intervene at login time to ensure that the process starts
# in the proper default security context. Only sessions which are intended
# to run in the user's context should be run after this.
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open
где / etc / myscripts / sourcing-script - это просто файл на удаленном хосте с командой для выполнения после успешного входа в систему.
#!/bin/bash
source /tmp/my-rc
#echo $(date) >> /etc/myscripts/sourcing-script.log
#cat /tmp/my-rc >> /etc/myscripts/sourcing-script.log
Я использую этот метод, чтобы остановить службу и сообщить об этом в файл журнала до открытия сеанса ssh. Прежде чем выйти из системы, я установил crontab для запуска службы, поэтому она никогда не будет работать параллельно с моим сеансом ssh.
Обычно вы делаете это в $HOME/.profile
вариантах или.
ssh
устанавливает переменные среды, начиная с SSH_
, вы можете использовать их, чтобы определить, вошли ли вы в систему через ssh
или напрямую.