当我需要执行从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用户。但我不知道,如何解决密码传递或避免密码输入。
非常感谢您的帮助。
答案 0 :(得分:2)
有几种方法可以达到你想要的效果:
在我看来,最正确的#34;方式是:
www-data
用户生成一个特殊的SSH密钥,并确保此密钥不使用密码加密 - 因为它是由密码所要求的密码短语。 SSH客户端解密密钥,然后用于身份验证。接下来,您必须使www-data
用户只读该密钥,并且只有该用户(!), - 也就是说,密钥文件必须由www-data
并设置了0600
(-rw-------
)个权限位。
有几种方法可以实现这一目标:
~/.ssh
目录下查找密钥文件(即用户主目录下的.ssh
目录),因此您有以下几种选择:
www-data
用户在文件系统上有真实的主目录(通过运行getent passwd www-data
可以知道),您可以在其中创建.ssh
目录并将密钥放入其中HOME
之前覆盖export
环境变量(并git
其新值),以便SSH客户端将主目录解析到其他位置。其余部分应如上所述进行设置。ssh_config(5)
手册页。OpenSSH
客户端二进制文件(通常用于基于Linux和BSD的常用操作系统)支持-i
命令行选项(代表" identity")。所以另一种方法是编写一个包装脚本,它只调用ssh -i /path/to/the/key/file
并将该脚本的路径放入(export
ed)环境变量GIT_SSH
中,以便Git调用您的脚本而不是只是ssh
。使用sudo
是另一种选择(虽然我不喜欢它)但是很可能使用修改后的凭据运行的新进程不会继承会话中存在的某些环境变量,这些变量会告诉SSH客户端如何联系正在运行ssh-agent
的实例,其缓存了您的解密密钥(是的,此代理的存在就是您只需要在交互式登录会话中输入一次密码的原因)。
因此,您可以了解ssh-agent
如何工作以及如何在使用修改过的凭据运行Git二进制文件时保留与其相关的环境变量sudo
。
我不确定它是否会起作用,因为在运行时提供的访问Unix域套接字(或者我现在不能回忆起来的一个fifo?)仍然可能存在权限问题ssh-agent
的实例用于联系它,因此您需要做一些研究。
使用sshpass
之类的程序将密码提供给SSH客户端。
这可以直接完成,也可以通过包装SSH客户端本身来完成(参见上文)。
请注意,此方法 发臭 ,因为它意味着密码将以某个脚本中的明文形式存储在某处。因此,您必须确保此脚本受到保护,就像在第一种情况下保护未加密的密钥一样。
另一种选择是使用只读的未经身份验证的协议(git://
或file://
架构 - 以适用的方式提供对您的存储库的访问权限。我们的想法是可以通过多种方式访问存储库,甚至可以使用不同的URL(具有不同的模式 - 意味着协议)来获取和推送相同的命名远程。