如何避免在www-data下执行的git pull键入密码短语

时间:2013-05-24 11:40:39

标签: git ssh git-pull passphrase ssh-agent

当我需要执行从PHP脚本运行的Git pull命令时,我坚持操作。 (用户被添加到www-data组中)没有密码短语输入。我发现这可以使用命令解决:

eval "$(ssh-agent)"

ssh-add 

但是这个命令只能在我自己的用户(例如george)下工作。但是如果我尝试在git cloned repository中的www-data下执行以下命令:

sudo -u george git pull

我总是得到以下消息

Enter passphrase for key '/home/george/.ssh/id_rsa': 

注意:我也将用户添加到www-data组和visudo用户。但我不知道,如何解决密码传递或避免密码输入。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

有几种方法可以达到你想要的效果:

  1. 在我看来,最正确的#34;方式是:

    1. 为您的www-data用户生成一个特殊的SSH密钥,并确保此密钥使用密码加密 - 因为它是由密码所要求的密码短语。 SSH客户端解密密钥,然后用于身份验证。
    2. 远程部署该密钥(在很大程度上取决于您的设置),以便可以将其用于读取访问。
    3. 接下来,您必须使www-data用户只读该密钥,并且只有该用户(!), - 也就是说,密钥文件必须由www-data并设置了0600-rw-------)个权限位。

      有几种方法可以实现这一目标:

      • 由于SSH客户端在~/.ssh目录下查找密钥文件(即用户主目录下的.ssh目录),因此您有以下几种选择:
        • 如果您的www-data用户在文件系统上有真实的主目录(通过运行getent passwd www-data可以知道),您可以在其中创建.ssh目录并将密钥放入其中
        • 在提取脚本中,在运行HOME之前覆盖export环境变量(并git其新值),以便SSH客户端将主目录解析到其他位置。其余部分应如上所述进行设置。
      • SSH客户端支持每用户配置,其中可以指定应搜索密钥的位置,甚至为不同的服务器指定不同的密钥。请参阅ssh_config(5)手册页。
      • SSH客户端通常支持在命令行上指定密钥文件的位置。 OpenSSH客户端二进制文件(通常用于基于Linux和BSD的常用操作系统)支持-i命令行选项(代表" identity")。所以另一种方法是编写一个包装脚本,它只调用ssh -i /path/to/the/key/file并将该脚本的路径放入(export ed)环境变量GIT_SSH中,以便Git调用您的脚本而不是只是ssh
  2. 使用sudo是另一种选择(虽然我不喜欢它)但是很可能使用修改后的凭据运行的新进程不会继承会话中存在的某些环境变量,这些变量会告诉SSH客户端如何联系正在运行ssh-agent的实例,其缓存了您的解密密钥(是的,此代理的存在就是您只需要在交互式登录会话中输入一次密码的原因)。

    因此,您可以了解ssh-agent如何工作以及如何在使用修改过的凭据运行Git二进制文件时保留与其相关的环境变量sudo

    我不确定它是否会起作用,因为在运行时提供的访问Unix域套接字(或者我现在不能回忆起来的一个fifo?)仍然可能存在权限问题ssh-agent的实例用于联系它,因此您需要做一些研究。

  3. 使用sshpass之类的程序将密码提供给SSH客户端。

    这可以直接完成,也可以通过包装SSH客户端本身来完成(参见上文)。

    请注意,此方法 发臭 ,因为它意味着密码将以某个脚本中的明文形式存储在某处。因此,您必须确保此脚本受到保护,就像在第一种情况下保护未加密的密钥一样。

  4. 另一种选择是使用只读的未经身份验证的协议(git://file://架构 - 以适用的方式提供对您的存储库的访问权限。我们的想法是可以通过多种方式访问​​存储库,甚至可以使用不同的URL(具有不同的模式 - 意味着协议)来获取和推送相同的命名远程。