在 ssh 会话中获取自定义 .bashrc

在 ssh 会话中获取自定义 .bashrc

目前,我们有相当多的共享ssh 登录到各种服务器,如果我过多地摆弄默认 shell,我的同事会不喜欢的。不过,我的系统中确实有相当多的别名和自定义函数,.bashrc我希望它们能一直跟随我。

此外,由于某些连接可能比较棘手,我喜欢做的第一件事就是启动屏幕会话,这样如果连接再次失败,我就可以重新登录并继续我离开的地方。

目前,我通过在我的 ssh 登录信息中附加一个相当复杂的字符串来实现此目的:

ssh -t -l sharedname someserver.example.com 'if [ -z \`find ~ -maxdepth 1 -iname '.wrikken_bashrc.sh' -mtime -14 \` ]; then scp [email protected]:.bash_remote.sh ~/.wrikken_bashrc.sh; fi; screen -h 2000 -DR wrikken bash --rcfile ~/.wrikken_bashrc.sh'

这种方法效果令人满意(当然,一旦在文件中设置好密码,我就再也不需要输入密码了.bash_remote.sh),但我严重怀疑这是否是正确的解决方案。此外,偶尔需要输入密码才能更新文件.wrikken_bashrc.sh当然很麻烦。遗憾的是,个人帐户不是一种选择。

简而言之:有没有更好的方法让我的自定义别名和函数在 ssh 登录时跟随我?

答案1

我们的团队在开发服务器上使用了类似的设置。如果我们的开发人员需要运行命令来控制服务器实例,他们可以使用我们的“assume”命令 --- 它只是 ssh 的一个包装器。除非我们需要调试一些严重问题,否则开发人员不得使用生产服务器。

每一个被授权登录到服务器实例账户的开发人员都会在该服务器的authorized_keys中拥有一个条目(有关详细信息,请参阅 AUTHORIZED_KEYS 文件格式部分) 文件,但每个授权密钥都有一个标志,用于设置其用户名独有的环境变量:

environment="SSHUSER=jason" ssh-rsa (BASE64-ENCODED-KEY) jason@localhost

在该服务器实例的 .bashrc 中,我有一小段代码:

USERHOME=$(eval "echo ~$SSHUSER")
if [ -f "$USERHOME/.client_bashrc" ]; then
    . "$USERHOME/.client_bashrc"
fi

我们的开发人员可以在他们的主目录中保留一个 .client_bashrc 文件(与他们的 .bashrc 分开),并赋予其全球可读的权限。将他们的 .bashrc 与 .client_bashrc 分开有助于提高安全性,因为他们可以在 .bashrc 中保留私有定义和环境变量。他们可以选择在个人 bashrc 中放入一行代码以简单地包含 .client_bashrc,并在那里保留别名和定义,以便更轻松地使用系统。(所有这些都假设用户的主目录可以从开发服务器访问。)

华纳在他的评论中指出,这种共享用户名设置违反了最佳安全做法,这一点很有道理。我们的系统是多年前从共享主机上的帐户发展而来的。我们现在才开始限制开发者帐户的权限,并转向将开发者操作放在审计日志中的系统。

答案2

查看登录过程以man sshd了解可以将用户特定环境插入登录的位置很有用。该过程是:

  1. 如果是 tty 或除非 ~/.hushlogin,则打印登录名和 motd
  2. 如果在 tty 上登录;记录登录(请注意,sshd_config 中的 LogLevel VERBOSE 将显示用于登录的连接密钥
  3. 如果 /etc/nologin 存在,则退出
  4. 更改为以普通用户身份运行
  5. 设置基本环境
  6. 读取~/.ssh/environmentsshd_config 中是否设置了 PermitUserEnvironment
  7. cds 到用户的主目录
  8. 如果 ~/.ssh/rc 存在,则运行它;否则如果 /etc/ssh/sshrc 存在,则运行它...(主要用于 X11)
  9. 运行用户的 shell 或命令。

看来使用 ~/.ssh/environment 是控制每个连接环境的最佳方式。但是,正如 Jason 所建议的,这可以通过在 authorized_keys 中设置环境选项来实现(如果启用了 PermitUserEnvironment)。此时可以将 USER 环境变量设置为除登录用户之外的用户。

从主机登录的角度以及用户连接主机的便利性的角度考虑,覆盖 USER(以及其环境的其余部分)可能是最好的方法。

不幸的是,ssh 证书(我说的不是身份密钥)不允许在连接证书中专门指定环境变量。如果提供了环境变量,证书颁发机构可以生成嵌入的客户端证书

相关内容