|
本帖最后由 liufangg 于 2022-8-2 02:36 编辑
小米论坛的帖子的 转过来了,容器启动后能登陆,后面就看不懂了,哪位大佬出个详细点教程
启动容器内ssh,挂载路由器主文件系统
用容器平台创建一个stack,内容如下
服务:
debian:
image: registry.cn-shanghai.aliyuncs.com/aliyun2671973364/arm8-debian-sshd:0.1
ports:
- “22002:22”
volumes:
- /userdisk:/host/userdisk
- /etc:/host/etc
容器成功启动以后,验证下能不能登陆:
ssh root@192.168.31.1 -p 22002
#密码root
构建一个全静态链接的sshd服务并拷贝到路由器
这里我不想去折腾原生的sshd服务,如果有时间也可以找个原生可以跑的sshd写入到路由器文件系统去,当然直接简单点放路由器的u盘上理论上也行。
文件:main_sshd.go 源码
package main
import (
“fmt”
“io”
“log”
“os”
“os/exec”
“syscall”
“unsafe”
“github.com/gliderlabs/ssh”
“github.com/creack/pty”
)
func setWinsize(f *os.File, w, h int) {
syscall.Syscall(syscall.SYS_IOCTL, f.Fd(), uintptr(syscall.TIOCSWINSZ),
uintptr(unsafe.Pointer(&struct{ h, w, x, y uint16 }{uint16(h), uint16(w), 0, 0}))}
func main() {
ssh.Handle(func(s ssh.Session) {
cmd := exec.Command(“/bin/sh”)
ptyReq, winCh, isPty := s.Pty()
if isPty {
cmd.Env = append(cmd.Env, fmt.Sprintf(“TERM=%s”, ptyReq.Term))
f, err := pty.Start(cmd)
if err != nil {
panic(err)
}
go func() {
for win := range winCh {
setWinsize(f, win.宽度,赢。Height)
}
}()
go func() {
io.Copy(f, s) // stdin
}()
io.Copy(s, f) // stdout
cmd.Wait()
} else {
io.WriteString(s, “No PTY request.\n”)
s.Exit(1)
}
})
log.Println(“在端口 2222 上启动 ssh 服务器...”)
addr := os.Getenv(“LSN_ADDR”)
if addr == “” {
addr = “:33002” //这个字符串是监听端口
}
log.致命(ssh.ListenAndServe(addr, nil, ssh.PasswordAuth(func(ctx ssh.Context, pass string) bool {
return pass == “jan4984”//这个字符串是密码
}))))
}
编译:
go mod init test
GOPROXY=https://goproxy.cn go mod tidy
GOARCH=arm64 GOOS=linux go build -ldflags “-s -w” ./main_sshd.go
scp -P 22002 main_sshd root@192.168.31.1:/host/userdisk/
#密码root
创建自启动
ssh root@192.168.31.1 -p 22002
#密码root
echo '#!/bin/sh
/userdisk/main_sshd' > /host/userdisk/sshd.sh
chmod +x sshd.sh
echo “*/1 * * * * /userdisk/sshd.sh >/dev/null 2>&1” >> /host/etc/crontabs/root
final验证
ssh -oHostKeyAlgorithms=+ssh-rsa root@192.168.31.1 -p 33002
|
|