Session 为什么nohup无法使ssh代理进程在会话之外保持活动状态?

Session 为什么nohup无法使ssh代理进程在会话之外保持活动状态?,session,ssh,nohup,Session,Ssh,Nohup,当我编写.bashrc脚本来保存pubkey密码短语时,最重要的命令是: eval `ssh-agent -s` 问题是,如果会话退出,ssh代理将自动关闭,这导致需要在下一个会话中再次输入密码短语。我想要的是在系统重新启动之前只设置一次密码短语。因此,我尝试: eval `nohup ssh-agent -s` 希望ssh代理可以像其他长时间运行的进程一样不启动会话。但是,它不起作用。。。为什么?如何实现我的目标 先谢谢你 仅供参考,整个脚本是: ssh-reagent() { for

当我编写.bashrc脚本来保存pubkey密码短语时,最重要的命令是:

eval `ssh-agent -s`
问题是,如果会话退出,ssh代理将自动关闭,这导致需要在下一个会话中再次输入密码短语。我想要的是在系统重新启动之前只设置一次密码短语。因此,我尝试:

eval `nohup ssh-agent -s`
希望ssh代理可以像其他长时间运行的进程一样不启动会话。但是,它不起作用。。。为什么?如何实现我的目标

先谢谢你

仅供参考,整个脚本是:

ssh-reagent() {
  for agent in $TMPDIR/ssh-*/agent.*; do
    export SSH_AUTH_SOCK=$agent
    if ssh-add -l &> /dev/null; then
      echo "Found working SSH Agent:"
      ssh-add -l
      return
    else
      rm -rf $(dirname ${SSH_AUTH_SOCK})
      export SSH_AUTH_SOCK=
    fi
  done
  eval `ssh-agent -s`  # <-- How to keep ssh-agent alive when logout?
  ssh-add ~/.ssh/id_rsa
}
ssh-reagent
ssh-reagent(){
对于$TMPDIR/ssh-*/agent.*.do中的代理
导出SSH\u AUTH\u SOCK=$agent
如果ssh添加-l&>/dev/null;那么
echo“找到正在工作的SSH代理:”
ssh添加-l
返回
其他的
rm-rf$(dirname${SSH\u AUTH\u SOCK})
导出SSH\u AUTH\u SOCK=
fi
完成

eval`ssh-agent-s`#否!错误的方法!相反,您只需注意在何处启动ssh代理。您不应该对启动的每个shell执行此操作,而应该对登录shell只执行一次。该操作会生成用户的所有其他进程,因此在用户再次注销之前,代理将始终可用

典型地点包括:

  • 图形登录的
    /etc/X11/xdm/sys.xsession
    ~/.xsession
  • 普通登录shell的
    /etc/profile
    ~/.profile
    ~/.bash\u profile

这取决于您的发行版和个人喜好。

很抱歉造成混淆。事实上,我的代码来自re-agent脚本。让我在帖子中展示整个内容。很抱歉,您添加到问题中的脚本不是ssh试剂脚本,它是一个修改版本。原始版本没有调用
ssh-agent
这就是您介绍问题的地方。我的答案仍然适用,我想说。正如文档所解释的:ssh代理应该已经存在,只有这样您才能重新连接到它。每次生成一个新代理根本没有任何意义。哦,我看到了区别。我应该将ssh代理行放入~/.bash_profile中,并将ssh试剂放入~/.bashrc中.我说的对吗?是的,这是正确的方向。尽管我不确定这是否涵盖了您的用例。通常,您从系统上现有会话打开的新shell已经可以访问代理。您只需要在打开第二个会话(而不是第二个shell)时使用类似的方法即可在您已经有一个的系统上。因此,这两种情况下都是关于登录过程的。例如:您使用XSession启动ssh代理,然后通过ssh从外部额外连接到同一个系统。在这种情况下,脚本允许在其他登录中重用已经运行的代理。我尝试了您的解决方案,但不起作用。OS:Ubuntu12.04 LTS x64带有默认的bash。失败来自两个方面。每次我登录时都会执行#1~/.bash_配置文件,该文件也会调用~/.bashrc。因此它相当于我的代码。#2最奇怪的是,为什么nohup不能持有ssh代理进程,但其他进程可以?