Исходный файл после входа в систему по ssh выдает приглашение

Perl lookbehind делает это немного проще, хотя я бы не стал претендовать на многое:

perl -ple 's:^Node-path: branches/\K([^ /]*) :$1_:' <file

или, возможно, awk, который может обрабатывать более одного пробела в имени ветки, заменив его на gsub:

awk -F/ -vOFS=/ '$1=="Node-path: branches"{sub(/ /,"_",$2)} 1' <file
3
08.09.2020, 17:00
3 ответа

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

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

0
18.03.2021, 23:12

Если для параметра UsePAM установлено значение да в файле конфигурации sshd _удаленного хоста, тогда файл конфигурации /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 -— это просто файл на удаленном хосте с командой, которая будет выполняться после успешного входа в систему.

#!/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.

1
18.03.2021, 23:12

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

По умолчанию Zsh ищет свои файлы инициализации в $ZDOTDIR, по умолчанию в $HOME, если 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 user@domain.com 'bash -l; source /tmp/my-rc'не работает, потому что команда sourceвыполняется только после выхода из интерактивной оболочки.

2
18.03.2021, 23:12

Теги

Похожие вопросы