前言
我工作的环境有很多服务器和开发人员。这些服务器通常都设置为易于使用,因此我们都登录一个公共帐户。这些服务器仅供内部使用,因此安全性不是大问题。大多数开发人员(包括我自己)都会将他们的公钥添加到~/.ssh/authorized_keys
。
我希望登录后能够进行我常用的环境定制。
我目前手动做的事情
studog@doghouse:~# ssh example.local
common@example:~# . ./studog_profile
common@example:~#
我希望这个能够自动发生。
额外加分:我希望始终推动当前的发展.studog_profile
,因此我始终提供当前的定制。
理想情况下:
studog@doghouse:~# ssh example.local
common@example:~#
并且.studog_profile
已经找到来源并且我的定制已经可用。
约束
- 我
.studog_profile
包含环境变量设置,包括 PATH 更改、别名和函数声明。 - 我可以将唯一命名的文件推送到服务器(并修改
.ssh/authorized_keys
),但我无法更改~/.bashrc
或等常见配置/etc/ssh/sshd_config
。 - 我经常从我的狗屋进行 ssh,但经常在服务器之间进行 ssh。解决方案需要在两种情况下都有效。但我并不指望能够在服务器之间推送我的自定义配置文件。
不起作用的东西
ssh -t example.local '. ./.studog_profile; bash -l'
。这确实运行了我的配置文件,但是当登录 shell 运行时,环境更改就会丢失。.bashrc
在服务器上进行更改。请参阅上面有关更改常见配置的限制。尽管如此,我可能还是可以摆脱它,但是,ssh 没有提供查看“ssh 管道的开始”的方法。SSH_CLIENT
并SSH_CONNECTION
包含当前跳转的原始服务器的 IP 地址,但没有包含我正在输入的机器的标识。
我读过但对我没用的问题
- 运行ssh并立即执行命令 - 堆栈内存溢出
如何在 ssh 连接后运行命令? - 超级用户
这些使用bash -l
哪些会丢失变化。 - 我可以在某个地方进行 ssh,运行一些命令,然后给自己留下提示吗? - 堆栈内存溢出
最佳答案显示了如何注入环境变量,但没有注入别名或函数。此外,我的配置文件非常大,这看起来很笨重。 - 如何在通过 SSH 连接后立即运行脚本? - Unix & Linux Stack Exchange
改变常见配置,我可能会逃脱,但这只适用于“从狗窝”而不是“服务器之间”的情况。
我还没尝试过的事情
- SSH,在登录时运行命令,然后保持登录状态? - 代码日志
经常会提到一个 expect 脚本。我相信它会起作用。但它似乎……不靠谱?不够优雅?是错误的解决方案?有些东西让我很不舒服。
期待
ssh 有一些方法可以将登录后命令发送到远程服务器,可能是 中的关键字~/.ssh/config
。我找不到任何东西。我觉得这很奇怪,因为接受键盘输入并将其发送到远程服务器几乎与从配置文件中读取命令并将其发送到远程服务器相同。
我不得不认为这是由于安全漏洞而缺失的,但我不知道这个漏洞是什么。
我希望我可以修改 OpenSSH 源代码并构建我需要的内容,但这很耗时。此外,如果这是一个安全漏洞,我的拉取请求可能会被忽略。
我希望我已经涵盖了所有基础知识。我发帖是希望我遗漏了一些东西。
答案1
经常会提到一个 expect 脚本。我相信它会起作用。但它似乎……不靠谱?不够优雅?是错误的解决方案?有些东西让我很不舒服。
黑客环境需要“黑客”解决方案。如果您已正确配置了个人用户服务器,并共享了主目录,则您能够在一个地方完成配置,并且开箱即用。
如果您拥有一堆服务器,而单个用户又被一堆开发人员使用,而其中一个人无法自行做出更改,那么您就必须在自己的计算机上解决这个问题,在这种情况下,Expect 脚本可能是可行的方法。