Ich habe das:
curl -L "https://github.com/cmtr/cp-go-api/tarball/$commit_id" | tar x -C "$project_dir/"
Ich versuche gerade, ein Tarball von GitHub herunterzuladen und es in ein vorhandenes Verzeichnis zu extrahieren. Das Problem ist, dass ich diesen Fehler erhalte:
Step 10/13 : RUN curl -L "https://github.com/channelmeter/cp-go-api/tarball/$commit_id" | tar x -C "$project_dir/"
---> Running in a883449de956
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 9 100 9 0 0 35 0 --:--:-- --:--:-- --:--:-- 35
tar: This does not look like a tar archive
tar: Exiting with failure status due to previous errors
The command '/bin/sh -c curl -L "https://github.com/channelmeter/cp-go-api/tarball/$commit_id" | tar x -C "$project_dir/"' returned a non-zero code: 2
weiß jemand, warum es kein Tar-Archiv ist? Wenn Sie im Browser zu github.com gehen und dieses Muster eingeben, wird ein Tar.gz-Archiv heruntergeladen:
https://github.com/<org>/<repo>/tarball/<sha>
also nicht sicher, warum es nicht funktioniert.
Antwort1
Letztendlich liegt es daran, dass Github Anmeldeinformationen verlangt. Ohne 2-Faktor-Authentifizierung können Sie dies einfach mit curl tun:
curl -u username:password https://github.com/<org>/<repo>/tarball/<sha>
wenn Sie jedoch eine Zwei-Faktor-Authentifizierung eingerichtet haben, müssen Sie ein Github-Zugriffstoken verwenden und Sie sollten api.github.com anstelle von github.com verwenden, und zwar etwa so:
curl -L "https://api.github.com/repos/<org>/<repo>/tarball/$commit_sha?access_token=$github_token" | tar -xz -C "$extract_dir/"
Die Sache mit dem Zugriffstoken ist hier dokumentiert: https://help.github.com/en/github/authenticating-to-github/erstellen-eines-persönlichen-zugriffstokens-fur-die-befehlszeile
Antwort2
Ein anderer Ansatz hierfür ist die Verwendung eines GitHub-Cookies. Es beginnt zwar immer noch mit dem normalen Benutzer/Passwort, aber nach der ersten Anfrage können Sie mithilfe des Cookies weitere Anfragen stellen. Hier ist ein Beispiel mit PHP:
<?php
# GET
$get = curl_init('https://github.com/login');
curl_setopt($get, CURLOPT_COOKIEJAR, 'github.txt');
curl_setopt($get, CURLOPT_RETURNTRANSFER, true);
$log = curl_exec($get);
curl_close($get);
# POST
preg_match('/name="authenticity_token" value="([^"]*)"/', $log, $auth);
$pf['authenticity_token'] = $auth[1];
$pf['login'] = getenv('USER');
$pf['password'] = getenv('PASS');
$post = curl_init('https://github.com/session');
curl_setopt($post, CURLOPT_COOKIEFILE, 'github.txt');
curl_setopt($post, CURLOPT_POSTFIELDS, $pf);
curl_exec($post);
Anschließend können Sie Shell cURL mit -b github.txt
oder PHP cURL mit verwenden CURLOPT_COOKIEFILE github.txt
. Stellen Sie sicher, dass Sie dies curl_close
wie oben gezeigt tun, da sonst die Cookie-Datei erst nach Bedarf erstellt wird.