socat可以用来转发一个SSH代理套接字到一个chroot?

我正在通过SSH连接的远程服务器上构build定制的Debian环境。 这包括构build一个debootstrap环境,然后通过chroot来运行一个定制的安装程序。 作为定制安装过程的一部分,我需要安装程序能够将chroot环境ssh移出到远程服务器,在chroot 外部使用ssh-agent的SSH凭据重新使用。

我根本无法想象如何做到这一点。 原则上,我认为在调用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的pipe道,我想这是可以理解的(以某种方式)。

有没有办法解决? 我在chroot之前设置了一个SSH主套接字,并在chroot中使用了这个套接字,但是这会涉及对安装程序的相当侵略性的重写,所以我并不热衷于这个计划。

UPDATE

事实certificate,我可以通过创build一个到套接字的硬链接来获得我想要的效果。 我真的没有想到会工作。

您可以将SSH代理转换为chroot,但是您必须跳过一些循环,其中第一个使得套接字可以在chroot中访问,第二个是在chroot中告诉用户。

为了使套接字可用,OP的build议使用socat工作,只要权限设置正确。 假设您正在使用脚本启动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 

它在应该能够访问代理的chroot中build立用户的uidgid (例子中的爱丽丝 )。 然后创build该目录,并以与OP相同的方式build立一个socat 。 另外就是user=${_owner%:*} pirce,它将chid中的套接字设置为使得alice可以访问它。

然后它会记住socat PID,以便在chroot退出时它可以被拆除。 最后,它会导出SSH_AUTH_SOCKvariables,使其在chroot中可用。


现在, chroot只能由root来完成,所以我的猜测是脚本是由拥有代理进程的普通用户的sudo运行的。 如果这是准确的,那么还有一件事是要让sudo把环境变成可变的脚本。 要做到这一点,编辑/etc sudoers (批准的机制是这样sudo visudo ),并添加以下内容:

 Defaults env_keep+=SSH_AUTH_SOCK 

如果sudo将在chroot中使用(即从root切换到alice ),则还需要在chroot中对/etc/sudoers进行此更改。

这是一个在普通用户查看的chroot中的代理套接字的例子。

 $ ls -l $SSH_AUTH_SOCK srwxr-xr-x 1 alice root 0 Feb 1 15:06 /tmp/ssh-q1ntaubl6I2z/agent.1443