如何在没有 eval 的情况下启动 ssh-agent

如何在没有 eval 的情况下启动 ssh-agent

我已经知道的

  • 首先ssh-agent你需要使用命令eval $(ssh-agent)
  • 出于安全原因,您必须这样做。子进程无法更改上述进程的环境变量。
  • 当您启动时,ssh-agent您会得到 2 个变量,您可以手动将其导出到当前 shell。

我不知道并且需要你的帮助

  • 我可以以某种方式将环境变量传递到当前打开的所有终端吗?
  • 我可以将环境变量传递给整台计算机而不是只传递一个 shell 吗?
  • ssh-agent有没有一种方法可以不eval手动启动export


感谢您的帮助 :)

答案1

我有时将输出重定向到文件:

ssh-agent > ~/.ssh-agent

然后我可以通过执行以下操作在同一窗口或另一个窗口中选择该环境:

. ~/.ssh-agent

答案2

  • 我可以以某种方式将环境变量传递到当前打开的所有终端吗?

必须将变量写入文件并在每个终端中手动获取该文件。

  • 我可以将环境变量传递给整台计算机而不是只传递一个 shell 吗?

不容易。大多数进程一旦启动就根本不接受来自外部的环境变量更改;他们只是按原样使用从父进程继承的环境。 Shell 可以通过源脚本“拉取”环境设置,但您无法从进程外部将新环境变量“推入”其中。 (终端窗口和其中的 shell 是两个独立的进程,并且shell进程的环境是你平时关心的那个。)

另一方面,出于安全原因,处理用户登录的进程倾向于主动将传递给新会话的环境修剪为某些内置或系统管理员控制的“安全”环境变量列表。

如果您希望系统上的任何人都能够与某个地方建立经过身份验证的 SSH 连接,您可以以 root 身份创建一个无密码 SSH 密钥对,/etc/skel/.ssh/使用该密钥类型的默认密钥名称将其放入目录中,现在您创建的每个用户从那时起,将自动获取该密钥的副本...并且由于您使用了默认名称,因此 SSH 客户端将自动为每个拥有该密钥副本的用户的每个传出连接尝试该名称。

我认为这不会比授予每个人访问单个共享 SSH 代理的安全性显着降低。事实上,通过这种方法,一个用户无法通过向共享 SSH 代理发送“卸载所有存储的密钥”命令来破坏其他用户的工作,就像他们在您的想法中所做的那样......

(这似乎是一种可能XY问题。您到底想通过在系统范围内共享单个 SSH 代理来实现什么目的?如果您只是描述您试图通过共享 SSH 代理解决的实际问题的要求,可能会有更好的解决方案。)

  • 有没有办法启动 ssh-agent 而不需要评估或手动导出?

如果您具有系统的 root 访问权限,则可以将pam_ssh.soPAM 模块添加到系统的 PAM 配置中。该模块有两个功能:

  • 如果用作身份验证模块,它可以通过检查用户是否知道位于~/.ssh/login-keys.d/...的 SSH 密钥的密码来验证用户的身份,但这不是您感兴趣的部分。
  • 如果用作会话管理模块,它将启动 SSH 代理,自动使用属于该用户的 SSH 密钥(没有密码或密码与所使用的登录密码相同)加载它,并将适当的环境变量插入到即将开始的会话的环境。

至少 Debian 和相关发行版应该将pam_ssh.soPAM 模块打包为libpam-ssh.其他发行版可能会以不同的方式命名其 PAM 库包,因此您可能需要进行一些搜索。

答案3

  • 要将环境变量传递到所有打开的终端,您可以将导出命令添加到 shell 的启动脚本中(例如 bash 的 ~/.bashrc)。
  • 您无法将环境变量传递给整个计算机。每个 shell 会话都在自己的进程中运行,并具有自己的环境变量。
  • 如果不使用 eval 或手动导出环境变量,则无法启动 ssh-agent。出于安全原因,这些步骤是必要的,因为 ssh-agent 需要修改 shell 的环境才能正常工作。

答案4

这可能是一个解决方案?:

if [ -S "$SSH_AUTH_SOCK" ] && [ ! -h "$SSH_AUTH_SOCK" ] ; then
    ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
    export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
fi

我在 ~/.ssh/rc 中使用它通过 GNU 屏幕进行代理转发。

然后,对于每个需要它的会话,我export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock都会参加该会话。

相关内容