我需要通过 SSH 控制多台机器。包括 Linux、Mac、移动设备、虚拟机。有时我一天需要登录 10 多台机器。
我喜欢我的个人 .bashrc 或 .bash_profile 设置,例如提示符 (PS1)、历史记录控制、别名和其他有用的设置。但在多台机器上保存这些设置非常麻烦。
那么,如果有人知道如何实现自动化呢?最好的办法是从我的“motherworld-PC”中“携带”设置。
答案1
您可以使用以下方法https://serverfault.com/a/400782
您必须使用 PermitLocalCommand 和 LocalCommand 来实现这一点。
我认为该解决方案不错,但我不喜欢它,因为它会通过scp
将我的本地 .bashrc 替换为远程 .bashrc 来替换远程计算机的 .bashrc。而且我无法让它完全按照我的预期工作。
另一个解决方案是使用 git 来管理所有点文件,如
http://blog.smalleycreative.com/tutorials/using-git-and-github-to-manage-your-dotfiles/
但对我来说,一个大问题是我必须用我的点文件设置每台服务器。即使我有时间(和耐心)将我的点文件部署到每台服务器,我仍然会遇到一个问题。
想象一下,如果多个用户使用相同的登录名登录到同一台服务器,将服务器默认设置更改为我的默认值。
然后...
因此,我为此开发了自己的解决方案,希望您喜欢它并发现它有用:
您需要:
- 创建(私人)要点https://gist.github.com/你的 .bashrc
- 你需要登录 github 来创建 gist
- 注意 .bashrc 环境变量中的敏感信息,例如密码。无论如何,这种信息不应该存在。
- 不要拿你给 gist 文件起的名字当回事。我会叫它吉斯特名称。选择一个不太可能在远程目录中找到的名称。请不要将其命名为“.bashrc”。=) 一个好的名字是
mycustombashrc.sh
- 保存要点后,点击获取其原始版本链接
<>
。您将需要此链接,原始要点链接或者原始链接
然后在您的本地.bashrc
末尾输入以下内容:
function customssh(){
ssh $@ -t 'cd $HOME ;
wget --quiet -N "RAWGISTLINK" ;
cp GISTNAME .'$USER'bashrc ;
bash --rcfile $HOME/.'$USER'bashrc'
}
记住替换 GISTNAME 和 RAWGISTLINK
现在运行
source ~/.bashrc
然后只需使用customssh
(你仍然会有常规的ssh
)
customssh mylogin@remoteserver
现在就尝试您的一个别名吧!
笔记
- 是的,这可能会在每次登录时下载要点文件,但相信我,它真的很快。别担心。
- 更新共享的 .bashrc
- 转到要点网址,并进行更改(或将本地的 .bashrc 复制到其中)。
- 然后更新 customssh 函数,将 RAWGISTLINK 替换为新的RAWGISTLINK(要点链接和 GISTNAME 相同,但是当您对文件进行更改时,原始要点链接会发生变化)。
- 现在只需运行
source ~/.bashrc
。就是这样!无需在远程服务器中更改任何内容!
- 我的解决方案完全基于 Ubuntu,可能需要进行一些调整才能与其他发行版兼容
- 您可能可以使用其他服务(例如 gist)来代替 github 的 gist。Pastebin 就是一个例子,但还有其他的。这完全可行,但我还没有尝试过。
- 您也可以
wget
从其他地方获取 custombashrc.sh。例如,公共网络服务器。 - 另一种选择是,如果您的本地计算机通过 ssh 在互联网上可见,您可以将
scp
文件从本地服务器(使用公共地址)传输到远程服务器。我没有使用这个解决方案,因为很难假设您的本地计算机不会隐藏在路由器或防火墙后面(就我而言,我在路由器后面) - 也许您可以在不同版本的 ubuntu 中发现问题,但我还没有遇到过。
这种方法最好的地方在于它不会改变远程服务器中的任何内容,而且只需在本地机器上做出很少的努力,使用 gist 您可以在所需的任何服务器中获得本地 .bashrc 的所有乐趣。
ssh
而且您仍然可以通过使用而不是 来轻松“禁用”此功能customssh
。
答案2
一种常见的方法是将你的点文件放入 github 或其他版本控制系统。你不仅可以轻松更新它们,还可以保留所做的更改的历史记录,以便在需要恢复某些内容时使用。
在 Google 上快速搜索“github 中的点文件”和“版本控制中的点文件”给了我几个看起来很有用的页面:
设置完成后,您可以使用每台服务器上的 cronjob 自动执行更新,或者只需在 .bash_profile 中添加“git pull”即可。
答案3
就像是同步可能符合您的需求。如果这不可行,请使用 Dropbox 在每个设备之间同步文件,并在本地同步的文件和您需要它的位置之间创建符号链接。
答案4
我最近遇到了这个问题并想添加关于如何将我的 .bashrc 文件推送到多个主机的答案。
在这个假设的例子中,有 18 个“vcn”服务器需要我的 .bashrc 文件。如果您有幸拥有标准化的命名约定,您可以利用 bash 中的花括号并使用循环迭代以数字方式附加的服务器名称。然后只需将本地 .bashrc 文件 scp 到它们即可。
for vcn in r1-vcn{1..9} r2-vcn{1..9}; do scp ~/.bashrc $vcn:/home/user/; done;