具有以下拓扑:
+----------+ 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
?
我所知道的
当没有涉及 jumphost 时,这会给我我的 bash 定制:
ssh me@unrestricted "echo "$(cat ${HOME}/.bashrc | base64 -w 0)" | base64 --decode > /tmp/${USER}_bashrc; cd /tmp/; bash --rcfile /tmp/${USER}_bashrc"
如果我直接将 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 "'