如何使用普通使用者的 ssh 金鑰但具有 sudo 檔案權限的任何命令(例如 git)

如何使用普通使用者的 ssh 金鑰但具有 sudo 檔案權限的任何命令(例如 git)

我可以克隆一個項目,如下所示:

$ 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_SOCKenv_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 存在各種問題,例如檢查備份軟體如何處理它們等

相關內容