Perl lookbehind делает это немного проще, хотя я бы не стал претендовать на многое:
perl -ple 's:^Node-path: branches/\K([^ /]*) :$1_:' <file
или, возможно, awk, который может обрабатывать более одного пробела в имени ветки, заменив его на gsub:
awk -F/ -vOFS=/ '$1=="Node-path: branches"{sub(/ /,"_",$2)} 1' <file
Обычно это делается в $HOME/.profile
или вариантах.
ssh
устанавливает переменные среды, начинающиеся с SSH_
, вы можете использовать их, чтобы определить, вошли ли вы через ssh
или напрямую.
Если для параметра 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.
Учитывая, что вы можете писать в /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
выполняется только после выхода из интерактивной оболочки.