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