从客户端 ssh 期间将 jumphost 的 .bashrc 应用到服务器?

从客户端 ssh 期间将 jumphost 的 .bashrc 应用到服务器?

具有以下拓扑:

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

这成功地允许我通过 ssh 进入restrictedhost

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

并产生未定制的 bash shell:

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文件应用到 shell 中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

转义管道、重定向和分号

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 转义,这样您就不必处理换行符(或任何特殊字符)。感谢 base 64!
  • 实际上,这是从 CLIENT 复制 .​​bashrc 文件,而不是从 jumphost 复制(这样更好)。

密码

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 "'

相关内容