[英]git push/pull over ssh to locally hosted gitlab as root requires git@gitlab password
我開始在這個問題上解決這個問題。 我將它分開是因為我意識到這是一個不涉及 gitpython 的不同問題,而是單獨涉及 git。
我有一個 python 腳本,該腳本涉及推和拉到必須以 root 身份運行的本地 gitlab 實例。 .git/config 看起來像這樣:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = git@gitlab.our.instance.name:my-name/repo-name.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
我發現,每當我從 gitlab 以 root 身份運行git pull
或git clone
時,它都需要 git@gitlab.our.instance.name 主機密碼,就好像它是正如您在遠程 url 中看到的,所有遠程操作都是通過 ssh 協議完成的,而不是 https。
這是 gitlab 的配置問題嗎? 關於 git 或 ssh 我不知道的東西? 我必須以 sudo 身份運行此腳本,所以現在我正在研究一種不以 root 身份運行git pull
的方法。
對於有類似問題並看到error: cannot open.git/FETCH_HEAD: Permission denied
while not running as sudo,delete.git/FETCH_HEAD 或將其所有權更改為遠離 root,它應該正常執行。 這是因為git pull
涉及git fetch
,但由於它不成功,它留下了 root:root 擁有的空 FETCH_HEAD,非特權用戶無法寫入。
這與 Git 或 GitLab 無關。 這只是 sudo 在 Unix / Linux 系統上運行的基本方式。
這些系統具有用戶身份或 UID 的概念。 在操作系統級別,您的 UID 是一個簡單的 integer 編號。 數字 0 是為超級用戶保留的,他們可能(這取決於您可以單獨啟用的許多操作系統選項和安全功能)是否能夠粗暴地運行普通用戶權限。
除了UID之外,系統的rest還提供了一個人的主目錄等概念。 配置文件——包括~/.ssh/config
和~/.gitconfig
往往位於主目錄中; 事實上, ~
這里代表那個目錄。 (用$HOME
替換~
是由 shell 完成的,而不是由操作系統完成的。Python為此具有os.path.expanduser
;它模擬了典型的 Z2591C98B701245FE62491898B1E 擴展。)
例如,ssh 命令使用您的主目錄來定位您的.ssh/config
文件以及默認的.ssh/id_rsa
和.ssh/id_rsa.pub
文件。 So when you, as yourself, run ssh git@gitlab.our.instance.name
, ssh is able to "log in" to gitlab.our.instance.name
as user git
if your personal ssh configuration has the right keys in it.
當您運行sudo <command>
時,由sudo
運行的命令以超級用戶身份運行,即 UID 為零。 它還以超級用戶的主目錄作為主目錄運行。 因此,使用的 ssh 配置和密鑰是~root/.ssh/*
中的那些,而不是~jake/.ssh/*
或您自己的個人主目錄中的那些。
除此之外,運行的命令代表 uid 零運行。 如果 uid 零(“超級用戶”)可以繞過大多數正常權限,則該用戶可以創建新文件,例如.git/FETCH_HEAD
,即使.git
歸您所有並且不授予 UID 零權限。 但是當該用戶確實創建了這樣一個文件時,新文件歸該用戶所有,即由root
擁有。
如果完全有可能不這樣做,那么長和短永遠不會通過 sudo 運行任何東西,因為這樣做會繞過太多的權限檢查(取決於操作系統配置和其他細節)並留下太多由超級用戶擁有的文件用戶,以便只有超級用戶有權對這些文件執行任何操作,從而迫使您繼續使用sudo
進行自我延續的舞蹈,從而使您的系統不安全。
我必須以 sudo 身份運行此腳本...
這就是問題所在。 修復它。 進行設置,以便腳本可以作為一些普通的、非特殊特權的用戶運行。
我意識到這是一個“醫生,當我這樣做時很痛”的案例:“那么不要那樣做”-但這就是答案,真的,不要那樣做,如果你發現了,出於某種可怕的原因,你必須這樣做一兩納秒,寫一些東西在那一兩納秒內完成,然后將所有權轉移回你並退出,讓你自己繼續。 盡可能少做超級用戶,因為您在這里所做的一切都必須由安全專家進行三重安全檢查。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.