A razão pela qual eu preciso de alguma forma me tornar root sem digitar sudo
é porque
error while loading shared libraries: libc.so.6:
cannot open shared object file: No such file or directory
eu costumava sudo
tersudo mv /lib64/libc.so.6 /lib64/libc.so.6.bak
Porque segui algumas instruções para poder atualizar o link simbólico para libc-12.4.so
em vez do atual libc-12.2.so
por
LD_PRELOAD=./libc-2.14.so ln -s ./libc-2.14.so ./libc.so.6
Mas isso não funciona usando sudo
. Agora estou com medo de sair ou reiniciar para a morte do sistema. Porque preciso obter permissão de root para corrigir isso.
Eu não tenho um disco de recuperação. na pior das hipóteses, tenho que montar o disco rígido em outra máquina e consertá-lo.
Por favor ajude.
$ sudo bash -c "LD_PRELOAD=./libc-2.14.so ln -s ./libc-2.14.so ./libc.so.6"
sudo: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
$ LD_PRELOAD=./libc-2.14.so sudo LD_PRELOAD=./libc-2.14.so ln -s ./libc-2.14.so ./libc.so.6
sudo: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
$ LD_PRELOAD=./libc-2.12.so sudo LD_PRELOAD=./libc-2.12.so ln -s ./libc-2.12.so ./libc.so.6
sudo: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
$ LD_PRELOAD=./libc-2.12.so ln -s ./libc-2.12.so ./libc.so.6
ln: creating symbolic link `./libc.so.6': Permission denied
Você deve apenas inicializar a partir de um USB ao vivo (ou CD/DVD) e renomear
libc.so.6
de volta.LD_PRELOAD
não funciona com executáveis setuid. Mas, se quiser, você pode usar/bin/busybox
para fazer backups de última hora (que não requerem a execução de comandos como root) antes de reiniciar. É possível corrigir isso sem um USB/CD/DVD ao vivo, mas você ainda precisará reiniciar e sugiro usar um.LD_PRELOAD
não funciona com comandos setuid.No momento, você está tentando
sudo
usar a biblioteca compartilhada renomeada definindoLD_PRELOAD
. Isso não vai funcionar. Você não pode alterar ossudo
links das bibliotecas compartilhadas comLD_PRELOAD
, e isso também não funciona com nenhuma das alternativassudo
. Se você pudesse fazer isso, seria um bug de segurança extremamente grave.A maneira
sudo
epkexec
(esu
) funcionam para permitir que você eleve privilégios é que esses executáveis têm o bit setuid definido como 0 , o que faz com que sejam executados como o usuário que os possui, que para esses executáveis é o usuário root, em vez do usuário que realmente os executa. Quando eles correm, eles validam com muito cuidado o que você está pedindo para eles fazerem. Dessa forma, desde que seus desenvolvedores tenham sido cuidadosos o suficiente, eles permitirão apenas que os usuários executem ações para as quais estão autorizados.LD_PRELOAD
não tem efeito para executáveis setuid executados por usuários que não sejam seus proprietários . Isso é absolutamente vital para a segurança. Caso contrário, qualquer um poderia criar sua própria biblioteca e forçar um programasudo
a usá-la, e então qualquer um poderia obter privilégios de root. Você pode usarLD_PRELOAD
para executar programas não setuid, e o root pode usá-lo para executar praticamente qualquer coisa. Mas como um usuário não root, você não pode usá-lo para executar programas comosudo
,pkexec
, esu
que são setuid root.Se você já tinha um shell root em execução, não precisaria reiniciar. Mas mesmo se você tiver a conta root habilitada - ou seja, mesmo se você tiver uma senha definida para que possa usar para fazer login como root com um comando como -- você
su
ainda não seria capaz de corrigir o problema sem reiniciar . Por exemplosu
, no Ubuntu também requerlibc.so.6
e também é root setuid, portantoLD_PRELOAD
também não funcionará com ele. 1 (Veja também os comentários de Peter Cordes .)O problema aqui é que os mecanismos disponíveis para executar ações como root exigem que você execute executáveis setuid pertencentes ao root como você mesmo, mas
LD_PRELOAD
não tem efeito nessa situação. Se não fosse pela necessidade de executar ações como root - ou se você já tivesse um shell de root aberto - você seria capaz de renomeá-lo facilmente sem reinicializar e também sem usarLD_PRELOAD
. Isso ocorre porque os sistemas Ubuntu têm/bin/busybox
, que é vinculado estaticamente. Ele permite que você execute muitas das ferramentas * nix comuns , incluindo os comandosmv
e .cp
Você pode executar ou executar apenas para obter um shell no qual poderá executar os comandos. Corre/bin/busybox mv source destination
/bin/busybox sh
/bin/busybox
sem argumentos para obter uma lista de comandos suportados. Tem até uma versão dedpkg
!Você pode fazer backup de arquivos (se desejar) e reiniciar em um ambiente ativo.
Menciono
busybox
principalmente porque, embora você não possa usá-lo para obter privilégios de root e restaurar arquivoslibc.so.6
, você pode usá-lo para fazer backup de quaisquer arquivos que esteja preocupado em perder antes de reiniciar em um ambiente ativo. Duvido muito que você perca alguma coisa , mas já que está preocupado, você pode usarbusybox
para copiar quaisquer arquivos importantes - como documentos que você criou ou modificou desde seu último backup - para outro local.A reinicialização da maneira usual pode não ir muito longe, porque os desligamentos normais na verdade envolvem a execução de programas vinculados dinamicamente que dependem do
libc.so.6
. Você pode querer usar Alt++SysRqREISUB para reiniciar com segurança . Esta não é uma maneira ideal de desligar, mas provavelmente é melhor do que uma tentativa quase ineficaz de reinicialização seguida de uma reinicialização total. Outra opção seria tentar reiniciar e, em seguida, tentar usar o método REISUB para fazer o resto do caminho. (Se quiser desligar a máquina em vez de reiniciá-la, use REISU O em vez de REISU B .)Quando você inicializa a partir de um ambiente ativo, renomear o arquivo será fácil. Você não precisa
chroot
fazer nada extravagante. Basta montar seu sistema de arquivos raiz (o que geralmente você pode fazer com um clique no navegador de arquivos, embora possa usar omount
comando, se desejar). Em seguida, em um terminal, use o comandomv
ou para restaurar . Você precisará de , mas isso funciona bem em um ambiente ao vivo.cp
libc.so.6
sudo
Eu sei que você mencionou que não tem um disco de recuperação. Seria difícil, talvez impossível, criar um live USB inicializável naquele sistema, onde você não pode executar a maioria dos programas. (Você pode usar
busybox
para copiar e mover arquivos, e ainda tem umdd
comando, mas eu não recomendaria tentar usá-lo para isso. Normalmente, você precisaria ser capaz de executardd
como root para criar mídia ao vivo.) Talvez alguém o faça. sugerir um caminho. Se você tiver outra máquina para colocar o disco rígido, espero que possa criá-lo com essa máquina. Caso contrário, sua melhor aposta pode ser pedir a um conhecido para fazer um.Existe uma maneira sem um CD/DVD/USB ao vivo, mas você ainda deve reiniciar.
No entanto, existe uma alternativa para inicializar a partir de uma mídia externa. 2 Você ainda terá que reiniciar, mas não precisa de um sistema ativo. Eu não recomendo isso especialmente, pois é complicado; usar um ambiente ao vivo é mais fácil. Você pode fazer isso sem um, se realmente quiser.
Como Zanna havia apontado anteriormente nos comentários, o modo de recuperação não funcionaria porque a maioria dos programas precisa
libc.6.so
(por exemplo,/bin/bash
, que fornece o shell, precisa dele). Mas você pode inicializar o sistema/bin/busybox sh
como init passandoinit=/bin/busybox sh
como opção de inicialização para o kernel no GRUB. 3 Esta é essencialmente a mesma técnica que a mais comuminit=/bin/sh
(ouinit=/bin/bash
) para obter um shell root, mas com/bin/busybox sh
em vez do regular/bin/sh
, porque/bin/sh
é vinculado dinamicamente e requerlibc.so.6
.Se você quiser fazer dessa maneira, mantenha pressionada a Shifttecla esquerda enquanto (re)inicializa para que o menu de inicialização do GRUB apareça. (Se Shiftnão funcionar, use Esc.) Com as teclas de seta, selecione Opções avançadas para Ubuntu e pressione Enter. Após esse ponto, você não pressionará Enterporque isso inicializaria normalmente, em vez de com opções de inicialização personalizadas. Selecione qualquer kernel e pressione epara editar suas opções de inicialização temporariamente. Se houver várias linhas e seu cursor não estiver na linha que começa com
linux
, mova-o para lá com as teclas de seta. Adicioneinit=/bin/busybox sh
ao final dessa linha e pressione F10para inicializá-lo.Você deve obter um prompt de shell do BusyBox. Você terá que remontar o readwrite do sistema de arquivos raiz e renomeá
libc.so.6
-lo para que tenha o nome correto que costumava ter. Para conseguir isso, execute estes comandos no shell BusyBox (onde outros leitores que tenhamlibc.so.6
em um local diferente teriam que ajustar o nome do diretório passado para ocd
comando):Em seguida, recomendo que você sincronize todas as gravações em cache com o sistema de arquivos, remonte-o somente leitura e reinicie:
(Sem
-f
, oreboot
comando não funciona nessa situação, pois nenhum daemon init adequado está em execução.)0 Para aqueles que estão interessados: quando esses programas (como
sudo
) realmente executam seu comando ou criam um shell como root ou algum outro usuário alternativo, seus IDs de usuário reais e efetivos são definidos como os do usuário de destino. Mas quando você os executa, antes que eles façam isso, enquanto eles determinam se devem permitir que você execute a ação que você solicitou, seu ID de usuário efetivo é o de root, enquanto o ID de usuário real ainda é seu. Menciono isso para abordar um equívoco comum sobre a maneira como os IDs de usuário reais e eficazes funcionam em programas comosudo
; se você nunca ouviu falar de IDs de usuário reais e eficazes, sinta-se à vontade para ignorar esta nota de rodapé.1 Como mencionado,
busybox
no Ubuntu está vinculado estaticamente e não depende de arquivoslibc.so.6
. Você pode pensar que poderia usar isso para evitar a reinicialização, porquebusybox
oferece umsu
comando. No entanto, isso não ajuda em nada, porque como ele é instalado,busybox
não é root setuid. Para realmente permitir que um usuário não root se torne root,su
deve ser setuid root. A função útil debusybox su
é permitir que o root represente outros usuários, em vez de permitir que outros usuários representem o root.2 Zanna contribuiu muito com esse procedimento e também fez todos os testes para ele!
3 Isso é bem-sucedido ao passar
sh
parabusybox
, embora você espere que seja interpretado como uma opção de inicialização do kernel subsequente. Incluir aspas impede que funcione. Observe também que, no Ubuntu, obusybox
executável vinculado estaticamente é chamado apenas debusybox
, nãobusybox-static
(embora o pacote que o fornece seja chamado debusybox-static
). Se você desinstalou o BusyBox vinculado estaticamente e instalou o BusyBox vinculado dinamicamente, esse método não funcionará, mas é muito improvável que você tenha feito isso.Você não pode usar a senha root porque (ao renomear libc) você quebrou todas as formas "normais" de usá-la, incluindo o login em
getty
outro console de texto. Se você tivesse um su ou sudo vinculado estaticamente , poderia usá-lo para executarbusybox mv
ou (no caso geral de obter um shell raiz funcional), useLD_PRELOAD=whatever LD_LIBRARY_PATH=whatever static-su --preserve-environment
para passar este ambiente personalizado para um bash rodando como rootOs próprios binários setuid não podem confiar no ambiente fornecido por um usuário que os executa, mas (se funcionarem) podem transmitir o ambiente se você solicitar isso e souber a senha correta para autenticar essa operação.
Mas como você não tem um binário setuid estático que possa autenticar sua solicitação para passar um ambiente personalizado para um processo em execução como
root
, você deve apenas usar seu acesso físico para reinicializar em um ambiente que permite modificar o FS raiz. por exemplo, um DVD ou stick USB, ou inicialize seu sistema regular cominit=/bin/busybox sh
(consulte a resposta de @Eliah).Se você não tiver mídia de recuperação, crie algo inicializável em outro computador, usando uma imagem ao vivo do Ubuntu ou uma das várias imagens de inicialização de recuperação adequadas para reparar vários sistemas operacionais e executar diagnósticos de hardware ( aqui está uma análise de 5 diferentes uns ). (Eles geralmente são menores que um Ubuntu ativo, por exemplo, ocupando apenas cerca de 700 MB em um pendrive.)
Você pode configurar um stick USB para ser inicializável com um desses (ou Ubuntu) enquanto ainda pode usá-lo para armazenamento normal de arquivos; você não precisa dedicar um stick USB inteiro a uma imagem inicializável. (No entanto, as maneiras mais simples de criar um stick USB ao vivo irão destruir o conteúdo anterior e, às vezes, até mesmo não deixá-lo utilizável para armazenar arquivos.)
Outra opção é fazer com que o initramfs caia em um shell antes de fazer
pivot_root
e executar oinit=
que você passou na linha de comando do kernel. Isso não depende de nenhum conteúdo do próprio FS raiz. Você pode não ter um editor, mas tem umcat
redirecionamento, assim como mv e ln. (cat > /mnt/root/etc/something
). Se o problema que você precisa corrigir não for trivial, você provavelmente deve inicializar algo mais poderoso!Isso acontece automaticamente em alguns casos de falha de inicialização, por exemplo, se a detecção de RAID falhar ou algo assim, o root fs não é montado em primeiro lugar (mesmo somente leitura). ( Ubuntu 15.10 - "BusyBox built-in shell (initramfs)" em cada inicialização )
Você pode fazer isso acontecer
break=bottom
na linha de comando do kernel para cair no shell do busybox no initramfs, depois de fazer a maioria das coisas (carregar módulos e montar o FS raiz somente leitura), mas antes de executar o arquivoinit
.break=premount
pára mais cedo; veja esse link ou/usr/share/initramfs-tools/init
para mais detalhes.Resolvi esse problema no elementary OS, criando uma unidade inicializável contendo a versão do elementary OS que eu tinha e, em seguida, inicializando-a ao vivo.
Depois de inicializar o liveusb, copiei a pasta /lib para a pasta /lib do sistema operacional elementar com defeito e mesclei mantendo os arquivos recentes.
Isso funcionou para mim. Espero que seja para você também.