go - 在 golang 中用于多个 SFTP 客户端的 Chroot
问题描述
我使用 Golang 作为我的应用程序的 SFTP 服务器,我想用不同的根目录隔离我的客户端。
此应用程序允许多个客户端连接,但我想为每个客户端提供自定义根目录(以便更好地隔离)。
在 golang 中,我尝试分叉该进程,但似乎不可能:Fork a go process
我尝试syscall.Chroot
了一个 goroutine,但是所有的二进制文件都被 chroot 了……与此同时,这阻止了其他客户端使用该服务,因为二进制文件被当前用户 chroot。
如果您对我的问题有可能的解决方案,我将很高兴阅读您的内容。
func main() {
if listener, err := net.Listen("tcp", fmt.Sprintf("0.0.0.0:%d", sshServer.Port)); err == nil {
for {
if nConn, err := listener.Accept(); err == nil {
// ...
if sshConn, chans, reqs, err := ssh.NewServerConn(nConn, &sshServer.Config); err == nil {
// ...
// Accept all channels
go handleChannels(chans)
}
}
}
}
}
...
func handleChannels(chans <-chan ssh.NewChannel) {
// Service the incoming Channel channel.
for newChannel := range chans {
// ...
if err := syscall.Chroot(chrootPath); err != nil {
panic(err)
}
if err := os.Chdir("/"); err != nil {
panic(err)
}
channel, requests, errChannel := newChannel.Accept()
if err := server.Serve(); err == io.EOF {
server.Close()
}
}
}
使用的库:
- golang.org/x/crypto/ssh
- github.com/pkg/sftp
解决方案
推荐阅读
- c# - UWP/C# 基于 NavView 模式更改控件可见性
- laravel - Laravel 5.6多对多多态关系插入不起作用
- python - 删除熊猫中的单个和范围列
- javascript - RXJS Pipe 不监听 oberservable 的变化
- javascript - Javascript - 检查变量是否已设置给我未定义的错误
- java - How to avoid busy spinning of a pause-able producer?
- java - How to save data every line in txt file with call repository save in Java
- mysql - MySQL - 存储多个字段或一个 CSV 字段?
- html - Rendering html in slim string, sinatra
- javascript - 为什么我的递归函数返回“未定义”?