在尝试克隆远程服务器的etckeeper目录时,我偶然遇到了"请确保您拥有正确的访问权限和存储库存在"错误:
git clone normaluser@example.com:/etc
normaluser
不仅不是 /etc/
目录的所有者(它属于用户 root
),而且 /etc/.git/
目录只能由用户 root
访问。
另一方面,用户 normaluser
在 sudo
组中,因此在远程端运行 git pull 协作的 git 进程时使用 superuser 权限解决了这个问题。
git clone --upload-pack 'sudo git-upload-pack' normaluser@example:/etc
这里的技巧是为git clone提供选项--upload-pack 'sudo git-upload-pack'
。
默认情况下,当git clone成功建立与远程服务器的ssh连接时,它会生成git-upload-pack
,这是一个与客户端本地git协议工具合作的git协议工具。通过告诉git-clone生成sudo git-upload-pack
,它将获得从/etc/
读取的所有特权。
现在,在我的情况下,我的远程服务器的sudo环境已设置为记住normaluser
的sudo tty ticket:
Defaults:normaluser !tty_tickets
为了使精心制作的
git clone ...
成功,必须首先获取
sudo tty ticket,例如通过以用户
normaluser
身份执行
sudo whoami
并手动提供密码来获取。
如果不选择使用此sudo tty ticket解决方案,则可以利用askpass:
git clone --upload-pack 'SUDO_ASKPASS=/path/to/some-askpass sudo -A git-upload-pack' normaluser@example.com:/etc
注意 SUDO_ASKPASS=/path/to/some-askpass
和 sudo -A ...
:这些信息会告诉远程sudo调用要查询所提供的askpass可执行文件以提供密码。这可能是基于X11图形界面的ssh-askpass,该程序需要客户端X服务器和在客户端或服务器端启用的X11转发。
另外,也可以提供一个自定义脚本-based 的askpass可执行文件;对于这种可执行文件的唯一要求是在stdout上返回密码。
$ ssh-keygen -t rsa -C“youremail@example.com”
- Belter