我有一个旧的 Ubuntu Linux 20 安装。我最近发现,在我开始完全使用包管理之前,我安装了一堆软件,但我记不清安装的详细信息了。我试过,apt
但它说那些包没有安装。
我以为我可能只是删除了软件的文件夹,但是猜测这可能会导致问题,因为某些软件在启动时启动,而我找不到其具体配置位置。
我发现了以下“冗余”/未知的进程:
- elasticsearch,“/usr/share/elasticsearch/jdk/bin/java”来自用户
messagebu
(抱歉,名字似乎被修剪了) - 来自用户的“/usr/bin/mono /usr/lib/hyperfastcgi/4.0/...”
syslog
- 来自用户的 mysqld
systemd-c
- 来自用户的“/usr/bin/mono /usr/lib/mono/4.5/mono-service.exe”
syslog
所以,实际上我有三个问题:
- 删除包含该软件的二进制文件和所有其他内容的文件夹是否安全?
- 我如何识别它被配置为在启动时启动?
- 我还应该知道/做什么才能安全地删除它?
谢谢!
答案1
如果您按照其他答案中所述尝试手动删除软件,则值得查看该命令的输出
sudo dpkg--验证
它会检查您安装的软件包的完整性。您可能会发现系统中有少量文件已被修改 - 可能是您更改了配置文件 - 您应该尝试了解每个文件并尽可能修复任何看似错误的文件。
答案2
删除包含此进程的二进制文件和所有其他内容的文件夹是否安全?
是。不是。也许吧。
这实际上取决于供应商打算如何部署应用程序以及管理员在安装时执行的操作。
一些应用程序(及其所有依赖项)确实部署在它们自己的子目录中,该子目录可以是单个平面目录或大型子目录树,通常模仿传统的 Linux 根文件系统,例如包含etc
配置文件的子目录、[s]bin
二进制文件的子目录、var
包含数据的子目录等。
如果您没有在同一子目录中部署任何其他应用程序;删除它将彻底删除该应用程序。
可能您调整了应用程序配置。相当典型的调整是将持久数据和日志目录更改为系统上的其他位置。
我如何识别它被配置为在启动时启动?
相当典型的是,systemd 启动服务/守护进程,如下例所示。在这种情况下,systemctl status
应该列出单元文件和由这些文件启动的所有进程,systemctl -a
其他开关也很有用。
类似这样的工具pstree
对于可视化父子关系和查看哪个进程启动了什么非常有用。当仅使用 systemd 时,将提供非常相似的输出,但当systemctl status
使用其他机制时,这通常会让您有所了解。
然后还有一些更“晦涩”的方法,例如有些人喜欢使用@reboot
cron 时间戳规范让 cron 在重启后(重新)启动服务。
pstree -a
systemd --switched-root --system --deserialize 22
├─/usr/bin/spamd
│ ├─spamd child
│ └─spamd child
├─agetty --noclear tty1 linux
├─atd -f
├─auditd
│ └─{auditd}
├─chronyd
├─crond -n
├─dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
│ └─{dbus-daemon}
├─dhclient -1 -q -lf /var/lib/dhclient/dhclient--eth0.lease -pf /var/run/dhclient-eth0.pid -H server eth0
├─dovecot
│ ├─anvil
│ ├─auth
│ ├─config
│ ├─imap
│ ├─imap-login
│ └─log
├─fail2ban-server -s /usr/bin/fail2ban-server -xf start
│ └─8*[{fail2ban-server}]
├─firewalld -Es /usr/sbin/firewalld --nofork --nopid
│ └─{firewalld}
├─httpd -DFOREGROUND
│ ├─httpd -DFOREGROUND
│ ├─httpd -DFOREGROUND
│ ├─rotatelogs -l /var/log/httpd/error_log.%Y.%m 86400
│ ├─rotatelogs -l /var/log/httpd/access_log.%Y.%m 86400
├─master -w
│ ├─anvil -l -t unix -u
│ ├─pickup -l -t unix -u
│ ├─proxymap -t unix -u
│ ├─qmgr -l -t unix -u
│ ├─smtpd -n smtp -t inet -u -o stress= -s 2
│ └─tlsmgr -l -t unix -u
├─mms
│ └─85*[{mms}]
该 pstree 列表中的“主”进程就是一个很好的例子。这个奇怪的进程名称实际上是从 postfix.service systemd 单元启动的 postfix。在输出中更容易找到systemctl status
:
└─system.slice
├─postfix.service
│ ├─ 1110 /usr/libexec/postfix/master -w
│ ├─ 1112 qmgr -l -t unix -u
│ ├─ 1121 tlsmgr -l -t unix -u
│ └─11508 pickup -l -t unix -u
├─spamass-milter.service
│ └─1032 /usr/sbin/spamass-milter -g postfix -p /run/spamass-milter/postfix/sock
我还应该知道/做什么才能安全地删除它?
确定服务如何启动然后停止它通常是一个很好的方法。
然后养成不从源代码安装东西的习惯,而是使用包管理器或例如捕捉或运行容器。
答案3
答案取决于许多细节,所以 Bob 是正确的,清理起来会很困难。甚至可能你的系统上有恶意软件,如果是真的,可能很难识别。即使你很幸运并且小心谨慎,也很可能某物留在你的系统中,它不应该在那里,而且它可能存在安全风险,例如如果您保留一个旧版本的库,而该库在需要时没有得到更新。
处理此问题的安全方法是从头开始全新安装从那时起总是使用包管理器安装所有软件。如果您有一套系统,并且作为新管理员一直在学习,那么偶尔这样做也不错。在进行新安装时,您可以自动执行一些工作,以便下次一切都进行得更快。
当然,在执行此操作之前,请将完整的系统备份到离线磁盘,并单独复制您自己的数据。这样,如果出现问题,您将能够恢复到工作状态。