1

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

eval "$(ssh-agent)"

ssh-add 

但是这个命令只在我自己的用户下工作(例如乔治)。但是,如果我尝试在 git cloned 存储库中的 www-data 下执行以下命令:

sudo -u george git pull

我总是收到以下消息

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

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

非常感谢您的帮助。

4

1 回答 1

3

有几种方法可以实现您想要的:

  1. 在我看来,最“正确”的方式是:

    1. 为您的用户生成一个特殊的 SSH 密钥www-data,并确保该密钥没有使用密码加密——因为 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行选项(代表“身份”)。因此,另一种方法是编写一个包装脚本,它只调用ssh -i /path/to/the/key/file并将该脚本的路径放入 ( exported) 环境变量GIT_SSH中,以便 Git 调用您的脚本,而不仅仅是ssh.
  2. 使用sudo是另一种选择(尽管我不喜欢它),但很可能使用修改后的凭据运行的新进程不会继承会话中存在的某些环境变量,这些环境变量会告诉 SSH 客户端如何联系正在运行的实例,ssh-agent其中缓存了您的解密密钥(是的,这个代理的存在就是为什么您只需要在交互式登录会话中输入一次密码)。

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

    我不确定它是否会起作用,因为访问 Unix 域套接字(或 fifo?-我现在不记得)可能仍然存在权限问题,该套接字由正在运行的实例提供,ssh-agent用于联系它,所以你需要做一些研究。

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

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

    请注意,这种方法很糟糕,因为它暗示密码将在某些脚本中以明文形式存储在某处。因此,您必须确保以与第一种情况下保护未加密密钥相同的方式保护此脚本。

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

于 2013-05-24T12:38:19.063 回答