Со следующей топологией:

    +----------+   ssh -J   +--------+       +--------------+
    |clienthost| =========> |jumphost| ====> |restrictedhost|
    +----------+            +--------+       +--------------+
                            .bashrc  - - - - - > .bashrc

Это успешно позволяет мне ssh в restrictedhost :

ssh -oProxyCommand="ssh -W %h:%p me@jumphost" me@restrictedhost

и приводит к ненастроенной оболочке bash:

Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.13.0-45-generic x86_64)
Last login: Mon Nov 12 16:23:06 2018 from 10.250.20.3
me@restrictedhost:~$ 

То, что я хочу, - это перенести мой точечный файл с jumphost (а не с клиентом, который более сложный) на узел с restrictedhost чтобы, среди прочего, я получил мое персональное приглашение:

bash Mon Nov 12  16:36:21 ~/ me@MacBook-Pro>

Как я могу применить jumphost:/tmp/.bashrc к оболочке с restrictedhost хостом ?

Что я знаю

  1. Когда не задействован Jumphost, это дает мне настройки Bash:

    ssh me@unrestricted  "echo "$(cat ${HOME}/.bashrc | base64 -w 0)" | base64 --decode > /tmp/${USER}_bashrc; cd /tmp/; bash --rcfile /tmp/${USER}_bashrc"
    
  2. Если я непосредственно применяю 1. к переходу, я вообще не получаю командной строки (или других настроек bash):

    ssh -oProxyCommand="sshpass -p Empty$paces ssh -W %h:%p devteam@man1-pqa" devteam@queue1-pqa "bash --rcfile /tmp/_bashrc"
    

1 ответ1

0

Escape-трубы, перенаправления и точки с запятой

ssh -t me@jumphost "ssh -t  me@restrictedhost echo "$(~/.bashrc | base64 -w 0)" \| base64 --decode \> /tmp/my_bashrc \; bash --rcfile /tmp/my_bashrc"

Объяснение:

  • вам нужно экранировать каналы, перенаправления и точки с запятой, чтобы трамплин не интерпретировал их. Вы хотите, чтобы ограниченный хост интерпретировал их. Прыжок должен передать все дословно.
  • вы выводите локальное содержимое .bashrc на узле с ограниченным доступом, экранируя его как base64, чтобы вам не приходилось иметь дело с символами новой строки (или любыми специальными символами). Слава Богу за базу 64!
  • фактически это копирует файл .bashrc с КЛИЕНТА, а не Jumphost (что даже лучше).

sshpass

sshpass -p jumphostpas$word autossh -M0 -t jumphostusername@jumphostname "sshpass -p restrictedhostpas\\\$word autossh -M0 -t  restrictedhostusername@restrictedhostname echo "$(cat ~/.bashrc | base64 -w 0)" \| base64 \\\-\\\-decode \> /tmp/my_bashrc   \; bash \\\-\\\-rcfile /tmp/my_bashrc "

связывание ключей (ZSH)

Если вы хотите сделать привязку ключей ZSH, сделайте следующее:

bindkey -s "^[K" 'sshpass -p passwordjumphost autossh -M0 -t usernamejumphost@jumphostname "sshpass -p pas\\\\\\$wordrestrictedhost autossh -M0 -t  usernamerestrictedhost@restrictedhostname echo "$(cat ~/.bashrc | base64 -w 0)" \\| base64 \\\\\\-\\\\\\-decode \\> /tmp/my_bashrc   \\; bash \\\\\\-\\\\\\-rcfile /tmp/my_bashrc "'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .