
我可以克隆一個項目,如下所示:
$ git clone [email protected]:root/myproject.git ~/bla
但現在我想將它克隆到/var/www
.所以我嘗試
$ git clone [email protected]:root/myproject.git ~/var/www
但可惜的是,我沒有寫信的權限/var/www
。須藤來救援!
$ sudo git clone [email protected]:root/myproject.git ~/var/www
Cloning into 'www'...
[email protected]'s password:
這是什麼?系統要求我輸入密碼?我們不需要臭密碼!
顯然,我正在透過請求發送 root 使用者的 ssh 金鑰,並且由於它們尚未導入到 git 儲存庫,所以我被拒絕了。過去,我的解決方案是暫時更改資料夾的權限,或者首先將其複製到我有權訪問的位置,然後使用 sudo 移動它,但我想了解正確的方法。
那麼...我如何將 git 與普通使用者的 ssh 金鑰一起使用,但使用 sudo 檔案權限?
答案1
如果您有ssh
正在運行的代理,請執行以下操作:
sudo SSH_AUTH_SOCK="$SSH_AUTH_SOCK" git clone...
這基本上告訴git
由該命令啟動的命令root
(或ssh
由該命令啟動的命令git
)使用您的ssh
代理(如何連接到它,這root
應該能夠,因為它擁有所有權利)。
如果您沒有執行 ssh 代理,您可以預先啟動一個:
eval "$(ssh-agent)"
(並根據需要使用 向其添加鍵ssh-add
)。
或者,您可以使用
sudo -E git clone...
透過每一個環境變數跨越sudo
,而不僅僅是$SSH_AUTH_SOCK
。
我會不是根據@NgOon-Ee 在評論中的建議添加$SSH_AUTH_SOCK
到env_keep
列表中。一般來說,您不想污染root
的環境,因為這是您啟動服務的使用者。例如sudo sshd
,啟動一項sshd
服務意味著ssh
透過該服務啟動的所有會話都將繼承您的使用者$SSH_AUTH_SOCK
環境,並使用他們不能也不應該使用的東西來污染使用者環境。即使對於 以外的其他目標用戶root
,傳遞該變數也是沒有意義的,因為目標用戶無法使用該身份驗證代理。
現在,這僅解決金鑰身份驗證問題。如果您還想root
繼承 中的設置~/.ssh/config
,則無法使用ssh
環境變數來做到這一點,但可以使用git
環境變數來做到這一點。例如,將sugit
函數定義為:
sugit() {
sudo "GIT_SSH_COMMAND=
exec ssh -o IdentityAgent='$SSH_AUTH_SOCK' \
-o User=$LOGNAME \
-F ~$LOGNAME/.ssh/config" git "$@"
}
也就是說,告訴git
使用ssh
使用 ssh 設定檔、代理和使用者名稱而不是 root 的命令。
或者甚至更好,告訴以原始用戶身份git
運行:ssh
sugit() {
sudo "GIT_SSH_COMMAND=
exec sudo -Hu $LOGNAME SSH_AUTH_SOCK='$SSH_AUTH_SOCK' ssh" git "$@"
}
答案2
如果關鍵檔案(或套接字)無法被使用者sudo
執行時讀取,則檔案(或套接字)權限可能會很複雜。這絕對包括root
檔案是否駐留在root
沒有權限的網路共用上,或者主目錄是否應該加密,這可能會再次拒絕root
存取。
在支援擴展 ACL 的 Unix 系統上的另一種方法是使用它們,在這種情況下,您可以在通常的基本權限之上授予額外的寫入存取權限:
$ sudo chown apache:www /var/www/html
$ sudo chmod g+s /var/www/html
$ sudo setfacl -m g:webedit:rwx /var/www/html
$ groups
jdoe webedit
$ ls -ld /var/www/html
drwxrwsr-x+ 4 apache www 25 Nov 21 19:42 /var/www/html
$
webedit
但由於該群組擁有權限setfacl
$ git clone ~/repo /var/www/html
Cloning into '/var/www/html'...
done.
$ ls -al /var/www/html
total 0
drwxrwsr-x+ 4 apache www 25 Nov 21 19:42 .
drwxr-xr-x 4 root root 31 Oct 19 20:39 ..
drwxrwsr-x 3 jdoe www 14 Nov 21 19:42 a
drwxrwsr-x 8 jdoe www 152 Nov 21 19:42 .git
$
然而,擴展 ACL 存在各種問題,例如檢查備份軟體如何處理它們等