Setting up openssh-server (1:8.2p1-4ubuntu0.9) …
dpkg: error processing package openssh-server (–configure):
installed openssh-server package post-installation script subprocess returned error exit status 10
Setting up ufw (0.36-6ubuntu1.1) …
dpkg: error processing package ufw (–configure):
installed ufw package post-installation script subprocess returned error exit status 10
Errors were encountered while processing:
openssh-server
ufw
E: Sub-process /usr/bin/dpkg returned an error code (1)
”“”
sudo rm /var/lib/dpkg/lock
sudo dpkg --configure -a
重配置包
sudo dpkg-reconfigure openssh-server
“”“
这些命令根本没有作用,后来看到了一篇文章,dpkg是”debian"系统包括ubuntu的包管理工具,其中ubuntu下的 /var/lib/dpkg/info 是包含包管理的作用信息,举例来说:
在 /var/lib/dpkg/info 目录中,你可以找到以下类型的文件和目录:
控制文件 (*.control): 这些文件包含了关于包的详细信息,如包的名称、版本、依赖关系、描述等。这些文件通常以包的名称命名,并以 .control 结尾。例如,对于 nginx 包,你可能会找到一个名为 nginx.control 的文件。
预定义格式文件 (*.md5sums, *.list, *.shlibs, *.symbols, *.conffiles 等): 这些文件包含了额外的信息,如 MD5 校验和(用于验证包文件的完整性)、包中包含的文件列表、符号链接库信息、配置文件列表等。
作用
1,包管理:dpkg 使用这些文件来管理已安装的包。例如,当您运行 dpkg -l 命令时,它会读取这些文件来列出已安装的包及其版本。
2,依赖解析:在安装或更新软件包时,dpkg 会检查这些文件中的依赖关系信息,以确保所有必需的依赖都被满足。
3,配置管理:通过读取 *.conffiles 文件,dpkg 可以知道哪些配置文件是由包管理的,从而在必要时备份或还原这些文件。
4,软件包验证:通过检查 MD5 校验和等,dpkg 可以验证软件包文件的完整性,确保没有在传输或安装过程中被损坏。
我由此想到,既然 /var/lib/dpkg/info 在软件安装时候会检查里面的依赖,那么这个目录临时改个名字,然后新建一个空的info目录,再此安装openssh-server 时候肯定不会报错了吧,因为info没有历史遗留信息,所以我按照这个思路
一,cd /var/lib/dpkg 目录新建info目录,安装完成openssh-server 把info下的文件copy到老的info.bak下,然后删除新目录,把旧目录改名为info
mv info inf.bak
mkdir info
apt remove openssh-server (进行到这步的时候,我查看sshd服务已经停止了,神奇的是我的ssh远程连接并没有断开)
rm -rf /etc/ssh
apt install -y openssh-server 顺利安装完成openssh-server
apt install -y openssh-client
mv info/* info.bak
rm -rf info
mv info.bak info
二,新建 /etc/ssh目录
安装完openssh-server /etc/ssh 目录并不存在,需要新建
mkdir -p /etc/ssh
然后从另外一台同样版本系统的ubntun 中copy /etc/ssh 下的目录文件到这台服务器上
apt remove openssh-server 的时候/etc/init.d/ssh 文件并没有删除,并不需要copy了
三,添加权限用户
删除openssh-server的时候删除了 sshd 这个用户,重新把这个用户建立下就可以了
我这里直接从另外一台服务器 /etc/passwd中直接copy过来了,如下:
sshd:x:111:65534::/run/sshd:/usr/sbin/nologin
这里设置了 sshd 运行的目录 /run/sshd
还得新建/run/sshd目录,mkdir -p /run/sshd 权限是root账号,所以,直接建立这个目录即可。
四,启动ssh
上述设置完毕,通过 /usr/sbin/sshd -t 来启动测试,如果没有任何提示,说明成功
然后 systemctl start ssh 启动sshd服务
通过systemctl status ssh 查看服务正常
然后把ssh服务加入到自启动中 systemctl enable ssh
搞定,收工!!!
五:总结
解决这个问题的关键思路是,既然 /var/li/dpkg/info 目录在安装软件的时候需要从这里查询软件的依赖,那我使用一个新的 info ,把老的info改名为info.bak ,安装完成openssh-server 把 新的info中的文件copy到老的info目录中,然后删除新的info目录,把老的info目录改成info目录,这个搞定了openssh-server 安装和删除都报错的问题。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!