Создайте файл после того, как вход в систему ssh перестанет запрашивать

Aug 16 2020

Однострочный вопрос: как мне автоматически получить удаленный файл на удаленном хосте после входа в систему через 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  

Ответы

4 StéphaneChazelas Sep 01 2020 at 23:09

С помощью bashвы можете:

ssh -t user@host '
  PROMPT_COMMAND="source /tmp/my-rc
                  unset PROMPT_COMMAND
                 " exec bash --norc'

Это приведет /tmp/my-rcк тому, что будет получен источник до приглашения, и только это приглашение, поскольку мы отключим его PROMPT_COMMANDпосле.

Вы захотите удалить unset PROMPT_COMMANDif, в /tmp/my-rcконечном итоге определяя его.

Приведенное выше предполагает, что оболочка входа удаленного пользователя похожа на Bourne, но вы должны иметь возможность адаптировать ее к большинству других типов оболочек (csh / rc / fish).

2 fra-san Sep 01 2020 at 22:30

Учитывая, что вы можете писать на удаленный хост /tmp, вы можете создать на нем /tmp/myhomeкаталог, поместить туда профиль вашей оболочки и файлы инициализации, а затем запустить Zsh с ZDOTIDRустановленным значением /tmp/myhomeи Bash с HOMEустановленным значением /tmp/myhome.

По умолчанию Zsh ищет свои файлы инициализации в $ZDOTDIR, по умолчанию $HOMEif 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команда выполняется только после выхода из интерактивной оболочки.

1 jakethefinn Sep 04 2020 at 19:40

Если 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.

dirkt Aug 16 2020 at 13:40

Обычно вы делаете это в $HOME/.profileвариантах или.

sshустанавливает переменные среды, начиная с SSH_, вы можете использовать их, чтобы определить, вошли ли вы в систему через sshили напрямую.