
我正在遠端伺服器上建立自訂 Debian 環境,並透過 SSH 連接到該伺服器。這涉及建立一個 debootstrap 環境,然後進入其中運行自訂安裝程式。作為自訂安裝過程的一部分,我需要安裝程式能夠從 chroot 環境 ssh 到另一個遠端伺服器,重新使用 SSH 憑證我的 ssh-agent外部chroot 知道。
我根本想不出該怎麼做。原則上,我思考在呼叫 chroot 之前,我應該能夠使用 socat 將 $SSH_AUTH_SOCK 轉送到 chroot 環境中,如下所示:
socat UNIX-CONNECT:$SSH_AUTH_SOCK UNIX-LISTEN:chroot_root$SSH_AUTH_SOCK,fork &
sudo -E chroot chroot_root /bin/bash
但是,當我嘗試在 chroot 中使用 ssh 時,socat 的管道就會斷開,我想這是可以理解的(在某種程度上)。
有沒有辦法解決?我有一個後備方案,即在 chroot 之前設置一個 SSH 主套接字,並將其用於 chroot 內的所有內容,但這將涉及對安裝程序的相當侵入性的重寫,所以我真的不熱衷於那個計劃。
更新
事實證明,我只需創建一個到套接字的硬連結就可以獲得我想要的效果。老實說,我沒想到這會起作用。
答案1
您可以將 SSH 代理轉發到 chroot,但必須跳過幾個步驟,第一個是使套接字在 chroot 中可訪問,第二個是告訴 chroot 中的使用者。
為了使套接字可用,socat
只要權限設定正確,OP 的建議就可以使用。假設您使用腳本來啟動 chroot,以下程式碼片段用於socat
在 chroot 中提供代理套接字:
# Set up a SSH AGENT forward socket
if [ -n "$SSH_AUTH_SOCK" ]
then
_dir="$mnt$(dirname $SSH_AUTH_SOCK)"
_owner=$(awk -F':' '{if ($1=="alice") {print $3":"$4}}' $mnt/etc/passwd)
mkdir "$_dir"
chown "$_owner" "$_dir"
socat UNIX-CONNECT:$SSH_AUTH_SOCK \
UNIX-LISTEN:$mnt$SSH_AUTH_SOCK,fork,user=${_owner%:*} &
socat_pid=$!
export SSH_AUTH_SOCK
fi
它建立了用戶的uid
和(gid
愛麗絲在範例中)在 chroot 中應該能夠存取代理。然後它會建立該目錄並以socat
與 OP 幾乎相同的方式建立一個目錄。新增的內容是user=${_owner%:*}
pirce,它在 chroot 內設定套接字上的 uid,以便愛麗絲可以訪問它。
然後它會記住socat
PID,以便在 chroot 退出時可以將其拆除。最後,它導出SSH_AUTH_SOCK
變數以使其在 chroot 中可用。
現在,chroot
只能透過我的猜測來完成,該腳本是由擁有代理進程的普通用戶root
運行的。sudo
如果這是準確的,那麼還需要做一件事,那就是允許sudo
將環境變數傳遞到腳本中。為此,請編輯/etc sudoers
(批准的機制是 so sudo visudo
)並添加以下內容:
Defaults env_keep+=SSH_AUTH_SOCK
如果要在 chroot 中使用(即從 切換到),也需要/etc/sudoers
在 chroot 中進行此更改。sudo
root
alice
下面是一般使用者檢視的 chroot 內代理套接字的範例。
$ ls -l $SSH_AUTH_SOCK
srwxr-xr-x 1 alice root 0 Feb 1 15:06 /tmp/ssh-q1ntaubl6I2z/agent.1443