从Shell脚本运行ssh-agent


19

我正在尝试创建一个shell脚本,该脚本除其他外将启动ssh-agent并向该代理添加私钥。例:

#!/bin/bash
# ...
ssh-agent $SHELL
ssh-add /path/to/key
# ...

这样做的问题是ssh-agent显然启动了$ SHELL的另一个实例(在我的情况下是bash),并且从脚本的角度来看,它已经执行了所有操作,并且ssh-add以及它下面的任何内容都永远不会运行。

如何从我的shell脚本运行ssh-agent并保持其在命令列表中的移动?

Answers:


8

ssh-agent应该启动一个会话,完成后,用户会话结束。因此,ssh-agent之后的任何命令都可能在注销后执行。

您想要的是一个session-script包含如下会话命令的:

#!/bin/bash
ssh-add /path/to/key
bash -i # or other session starter

然后开始ssh-agent session-script


谢谢!创建一个单独的脚本并以该脚本结尾可以达到目的exit
2013年

2
什么是会话脚本?
亚历山大·米尔斯

15

将以下内容放在脚本顶部:

eval `ssh-agent`

您的脚本应如下所示:

#!/bin/bash
eval `ssh-agent`
ssh-add /path/to/key
...
...

说明

周围的反引号ssh-agent收集其输出。eval收集该输出,将其连接为单个命令,然后执行该命令。然后,您可以ssh-add用来提供您的关键凭证。


9
谢谢,这正是我所需要的,尽管值得指出的是反引号即将到来。在新的bash格式中,应为eval $(ssh-agent)
sibaz

在我将bash -i脚本放到最后之前,此解决方案对我不起作用。
Adolfo Correa '18

6

我倾向于在需要代理的脚本中执行类似的操作。

#!/bin/bash

# if we can't find an agent, start one, and restart the script.
if [ -z "$SSH_AUTH_SOCK" ] ; then
  exec ssh-agent bash -c "ssh-add ; $0"
  exit
fi

... and so on.

基本上,脚本执行的第一件事是检查代理是否正在运行。如果不是,则exec用于代替脚本启动新进程。启动了代理,添加了密钥,最后再次调用了脚本(请参阅参考资料$0)。


但这不会保留任何脚本参数。并且,如果任何参数具有空格,传递它们都不容易。
丹尼尔森·萨玛

3
您可以使用.. "ssh-add ; $0 $*".. "ssh-add ; $0 $@"替代,它可能会起作用。这不是完美的,但在许多情况下肯定可以工作。最好的解决方案几乎总是使您的代理先运行,这在晦涩的情况下可能很有用。
Zoredache 2014年

6

我发现这对我有用。

eval `ssh-agent` # create the process
ssh-add ~/.ssh/priv_key # add the key
git -C $repo_dir pull # this line is the reason for the ssh-agent
eval `ssh-agent -k` # kill the process

我创建ssh-agent进程,添加密钥,执行我需要做的,然后将其杀死。无需检查它是否稍后运行。


4

在这种情况下最好使用钥匙串

Debian / Ubuntu:

apt-get install keychain

RHEL / Fedora / CentOS

yum install keychain

在您的.bashrc中添加以下内容:

eval `keychain --eval id_rsa`

更好?为什么会更好?
JFlo

@JFlo“更好”,它将把环境变量保存到$ HOME / .keychain / <file>。如果该命令仍在运行,则再次运行该命令将提取一个现有的ssh-agent。然后可以在shell /脚本之间重用它。在某些情况下并非十分安全,因此您必须拨打电话。对我来说,它是在一些剧本是我写来完成相同的任务的改进
斯科特卡尔森

2

我发现使用Zoredache的解决方案,该密钥可用于碰巧与调用脚本的shell共享同一ssh-agent的任何shell。出于明显的安全原因,我想在需要root用户访问远程计算机的脚本中避免这种情况。

我发现将以下shebang放在脚本工作的顶部:

#!/usr/bin/ssh-agent bash

ssh-add /path/to/ssh-key
ssh root@remotehost "remote commands"

-2

我已经尝试了很多,最终可行的解决方案是用空字符串替换密码短语。

ssh-keygen -p

这是非常不安全的做法。为什么根本不使用ssh?如果您不保护自己的私钥,则最好以明文形式进行交谈。
JFlo '18年

@JFlo:如果您的客户端系统足够安全,则可能不是这样。尤其是(如果可以)添加ACL,SELinux或类似的东西,使用静态文件很容易,但是使用ssh-agent的随机套接字则不太容易。就是说,我通常不会推荐它作为首选。
dave_thompson_085

尽管这是您提供的非常有用的过程,但我认为它不能回答关于OP的任何问题。
亚历山大·伯德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.