这几天在废弃的手机和平板上尝试安装完整的Linux系统,折腾了好几天,发现很多软件对arm的支持相当不完善。源里缺很多包,自己编译也编译不过。有些软件的老版本反而是稳定的,新版本总是出现,比如 firefox。来来回回换了很多版本,最后总结下来比较稳定的版本是 Debian Jessie。当我装回 Jessie 后尴尬地发现,sshd 起不来了,VNC也起不来了。经过仔细观察,发现在安装完基本系统后,开始配置 ssh,结果刷新完 apt 缓存后,相关的包压根就没有安装,提示 openssh 相关的包无法通过验证。因为前几天的尝试是成功的,被成功的经验误导了,排查了好久最终发现,确实是GPG证书过期了:我在昨天(2022/11/20)发现问题!证书的过期时间是 2022/11/19。
W: GPG error: http://mirrors.ustc.edu.cn jessie Release: The following signatures were invalid: KEYEXPIRED 1668891673
因为 apt 命令是在 chroot 的沙盒里运行的,要如何从外部干预呢?因为没有文档,只能乱猜乱试。如果发现了 Linux Deploy 有一个 telnet 守护模式,而且有一个 Web 接口。在设置中打开:
启用telnet守护模式:true
端口:5023
启用httpd守护模式:true
端口:5080
访问限制:A:127.0.0.1 D:*
上面的A:127.0.0.1
允许本机访问,而D:*
则屏蔽掉所有外部访问, 相当于打开了白名单。访问限制不允许留空,如果删掉,会自动填上诸如:/:android:xxxxxxxx
的内容。此时,不再是基于地址的访问限制策略,而是基于密码的验证,其中android
是用户名,xxxxxxxx
就是密码。
返回
再点击菜单中的“终端”,此时,就会自动打开浏览器并打开以下地址:
http://127.0.0.1:5080/cgi-bin/terminal?size=10
如果正常的话可以获得一个 shell。android自带的浏览器如果过于老旧的话,打开的是一个空白页面,此时需要用更新的浏览器去打开上面的地址。我用 firefox 打开就正常了。也可以更改上面的“访问限制”,允许外部主机,然后用电脑上的浏览器登陆进去操作。
此时获得的 shell 不是容器内的 Linux shell, 而是宿主机(android)的shell。Linux Deploy 在 data 目录下释放了一个 'bin'目录,里面有一些基本的 Linux命令,最关键的是命令linuxdeploy
,直接运行打印帮助信息。下面是一些常用命令:
# 执行布署
linuxdeploy deploy
# 挂载容器
linuxdeploy mount
# 卸载容器
linuxdeploy umount
# 启动容器,
linuxdeploy start
# 关闭容器
linuxdeploy stop
最关键的是 shell
子命令,它可以执行容器内的 shell 命令。
# 先启动容器
linuxdeploy mount
liuuxdeploy start
# 忽略证书验证,强制安装缺失的包
linuxdeploy shell -d -u <username> "sudo apt install -y --force-yes openssh-server"
执行上面的命令,如果不意外的话,会从卡住的地方继续安装 ssh, --force-yes
忽略证书验证。安装完成后, Debian 会自动启动 sshd 服务,此时,就可以从外部通过 ssh 进入容器内的系统了。
考虑到 Jessie 早已经被废弃,官方不可能再更新GPG证书,以后从源里安装任何包都会提示无法通过验证,都需要带上 --yes --force-yes
选项,一劳永逸的解决办法是:
echo 'APT::Get::AllowUnauthenticated "true";' | sudo tee /etc/apt/apt.conf.d/99disable-gpg-auth
标签:容器,shell,Deploy,linuxdeploy,ssh,Linux,安装
From: https://www.cnblogs.com/zh-geek/p/16911086.html