![使用 su 或 sudo 时出现分段错误](https://linux22.com/image/1098612/%E4%BD%BF%E7%94%A8%20su%20%E6%88%96%20sudo%20%E6%97%B6%E5%87%BA%E7%8E%B0%E5%88%86%E6%AE%B5%E9%94%99%E8%AF%AF.png)
问题示例:
$ su
Segmentation fault
$ sudo ls
Segmentation fault
我之前尝试从源代码编译 sqlite3。我不知道它安装了什么库。这可能是发生这种情况的原因。
我尝试了一下strace su
并得到以下结果:
...
fstat64(6, {st_mode=S_IFREG|0644, st_size=17964, ...}) = 0
mmap2(NULL, 20788, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0xb7295000
mmap2(0xb7299000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x3) = 0xb7299000
close(6) = 0
mprotect(0xb7299000, 4096, PROT_READ) = 0
mprotect(0xb72f9000, 4096, PROT_READ) = 0
set_tid_address(0xb758a728) = 11144
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV (core dumped) +++
Segmentation fault (core dumped)
当我尝试gdb su
运行时,它给了我Cannot find new threads: generic error
。我在网上寻找解决问题的方法,遇到了这线程,然后尝试运行LD_PRELOAD=/lib/i386-linux-gnu/libpthread.so.0 gdb su
(如线程中建议的那样)。当我再次尝试运行它时,它给出了相同的错误。
根据 strace,我认为它的线程处理方式存在一些问题,但我不知道如何修复它。有没有办法重新安装基本的 bash 实用程序?
以下是有关我的系统的更多信息:
$ uname -a
myhost 3.2.0-37-generic-pae #58-Ubuntu SMP Thu Jan 24 15:51:02 UTC 2013 i686 i686 i386 GNU/Linux
(我很确定硬件是 64 位的)
答案1
使用,它与viaaptdcon
通信,因此不需要或,重新安装损坏的软件包。最好的办法可能是重新安装所有软件包。apt-daemon
dbus
su
sudo
首先,确保没有损坏的安装需要修复:
aptdcon --fix-install
还要确保磁盘上有可用空间:
df -h
然后,获取当前安装的软件包列表:
echo \"$(dpkg --get-selections | grep install | cut -f 1)\"
将其保存到文本编辑器中以供日后使用。然后,aptdcon
使用完整包列表像这样调用:
aptdcon --reinstall "package1 package2 package3..."
我之所以这样告诉你,是因为aptdcon
出于各种原因,无法重新安装某些软件包,所以如果你aptdcon
觉得有必要,就必须将它们删除,然后再试一次,可能还要试多次。
答案2
我看到了这个问题,但根本原因略有不同。我一直在测试 Kerberos,我的 /etc/krb5.conf 中有一些配置错误。我通过 strace 发现 sudo 在读取该文件后不久就出现了分段错误,所以我猜想我的配置文件有问题。我没有追踪到特定的变量,但有一点很突出,那就是我在 krb5.conf 中将 default_domain 变量设为空,如下所示
[libdefaults]
default_realm =
这可能会导致 sudo 中的一些粗心代码生成零长度字符串并以某种方式错误处理它,从而导致 SIGSEGV。我没有尝试进一步调试它,因为这不是正确的设置。我只是删除了我的 /etc/krb5.conf。
答案3
这可能是由 samba 的 pam 模块导致的。
如果是这种情况,那么这应该可以解决问题:
- 重启机器并选择启动到恢复模式。如果你看不到恢复模式,那么你首先需要选择“高级选项”选项。
- 从恢复菜单中选择“进入 root shell”
- 执行命令:dpkg --purge libpam-smbpass
- 执行命令:dpkg --purge libpam-winbind
然后您应该能够再次使用“su”和“sudo”。
然后你可能想要或需要做一个
- sudo apt-get -f 安装
以帮助修复任何剩余的损坏包裹。
如果您需要 libpam-smbpass 和/或 libpam-winbind 包,或者“samba”包损坏,您可能会发现必须删除或重命名 /var/lib/samba/secrets.tdb:
- sudo mv /var/lib/samba/secrets.tdb /var/lib/samba/secrets.tdb.old
来源/相关:https://bugs.launchpad.net/ubuntu/+source/samba/+bug/260687
答案4
如果您遇到了 OP 所遇到的问题,那么您无法按照 Jorge Suárez de Lis 的建议去做,因为它会引发依赖错误。
所以,
aptdcon --reinstall "libsqlite3-0"
和
aptdcon --install "libsqlite3-0"
返回错误信息:
错误:org.debian.apt.TransactionFailed-error-cache-broken:以下软件包具有未满足的依赖关系:
在执行此操作时:
aptdcon --fix-depends
将修复该问题,并且 su 和 sudo 将再次起作用。