即使 git-daemon-export-ok 存在,git-daemon 也会说“不在白名单中”

alx*_*act 1 git

我试图建立一个 git 服务器。我成功设置了 SSH 服务器,现在我尝试设置匿名 git 服务,但它无法正常工作。

\n

我从 git 书籍https://git-scm.com/book/en/v2/Git-on-the-Server-Git-Daemon复制了示例 systemd 服务文件,仅更改了我拥有文件的路径:

\n
$ cat /etc/systemd/system/git-daemon.service \n[Unit]\nDescription=Start Git Daemon\n\n[Service]\nExecStart=/usr/bin/git daemon --reuseaddr --base-path=/srv /srv/src/\n\nRestart=always\nRestartSec=500ms\n\nStandardOutput=syslog\nStandardError=syslog\nSyslogIdentifier=git-daemon\n\nUser=git\nGroup=git\n\n[Install]\nWantedBy=multi-user.target\n
Run Code Online (Sandbox Code Playgroud)\n

然后创建一个git用户和组:

\n
$ sudo useradd -U --system git\n$ sudo usermod -d /nonexistent git\n$ sudo usermod -s /usr/sbin/nologin git\n$ sudo usermod -c git git\n$ getent passwd git      \ngit:x:998:998:git:/nonexistent:/usr/sbin/nologin\n$ groups git\ngit : git\n
Run Code Online (Sandbox Code Playgroud)\n

然后启用并启动该服务(我将在下面显示该服务处于活动状态并正在运行):

\n
$ sudo systemctl enable git-daemon.service\nCreated symlink /etc/systemd/system/multi-user.target.wants/git-daemon.service \xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd /etc/systemd/system/git-daemon.service.\n$ sudo systemctl start git-daemon.service\n
Run Code Online (Sandbox Code Playgroud)\n

然后创建文件来导出存储库:

\n
$ touch /srv/src/alx/libalx.git/git-daemon-export-ok\n$ ls -l /srv/src/alx/libalx.git/git-daemon-export-ok \n-rw-r--r-- 1 alx alx 0 Jan  7 18:49 /srv/src/alx/libalx.git/git-daemon-export-ok\n
Run Code Online (Sandbox Code Playgroud)\n

然后尝试从中克隆:

\n
$ git clone git://localhost/src/alx/libalx.git\nCloning into \'libalx\'...\nfatal: remote error: access denied or repository not exported: /src/alx/libalx.git\n
Run Code Online (Sandbox Code Playgroud)\n

该服务抱怨它没有被列入白名单(但它是,不是吗?):

\n
$ sudo systemctl status git-daemon.service \n\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd git-daemon.service - Start Git Daemon\n     Loaded: loaded (/etc/systemd/system/git-daemon.service; enabled; vendor preset: enabled)\n     Active: active (running) since Fri 2022-01-07 18:43:52 CET; 24min ago\n   Main PID: 43138 (git)\n      Tasks: 2 (limit: 3366)\n     Memory: 528.0K\n        CPU: 26ms\n     CGroup: /system.slice/git-daemon.service\n             \xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd43138 /usr/bin/git daemon --reuseaddr --base-path=/srv /srv/src/\n             \xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd43139 /usr/lib/git-core/git-daemon --reuseaddr --base-path=/srv /srv/src/\n\nJan 07 18:43:52 rpi systemd[1]: Started Start Git Daemon.\nJan 07 18:43:59 rpi git-daemon[43144]: [43144] \'/srv/src/alx/libalx.git\': not in whitelist\nJan 07 18:50:02 rpi git-daemon[43175]: [43175] \'/srv/src/alx/libalx.git\': not in whitelist\nJan 07 18:50:03 rpi git-daemon[43176]: [43176] \'/srv/src/alx/libalx.git\': not in whitelist\nJan 07 18:52:54 rpi git-daemon[43186]: [43186] \'/srv/src/alx/libalx.git\': not in whitelist\n
Run Code Online (Sandbox Code Playgroud)\n

为什么我无法通过 克隆git://

\n
\n

如果我传递一个完全无效的路径来克隆,我会在客户端得到相同的输出,但在服务器端日志是不同的:

\n
$ git clone git://localhost/src/ald/sdf/sdf.git\nCloning into \'sdf\'...\nfatal: remote error: access denied or repository not exported: /src/ald/sdf/sdf.git\n
Run Code Online (Sandbox Code Playgroud)\n
$ sudo systemctl status git-daemon.service \n...\nJan 07 19:13:37 rpi git-daemon[43261]: [43261] \'/srv/src/ald/sdf/sdf.git\' does not appear to be a git repository\n
Run Code Online (Sandbox Code Playgroud)\n

小智 5

几分钟前我自己就遇到了这个问题,并在解决问题的过程中遇到了你的问题。

从 systemd 文件中 git daemon 命令末尾的目录路径中删除尾部斜杠。这似乎会导致白名单出现问题,如 /var/log/syslog 中显示的错误所示。

ExecStart=/usr/bin/git daemon --reuseaddr --base-path=/srv /srv/src
Run Code Online (Sandbox Code Playgroud)

在我进行类似的更改后,我能够按预期使用 git 协议。