Como criar um link simbólico sem usar o ln?

31

Eu apaguei um link simbólico crítico - libc.so.6. Eu tenho o arquivo que ele deve apontar, mas os comandos básicos como lnou wgetnão funcionarão mais devido à falta do link. No entanto, echoou outros recursos internos do Bash funcionam.

Estou procurando uma maneira de recriar esse link simbólico.

Sebas
fonte
11
@ Sebas, acho que você quis dizer todos os Bash builtins , não apenas echo.
Cristian Ciupitu
@CristianCiupitu talvez, o que é? catestá desativado ... na verdade, tudo estava.
Sebas 10/10
11
@ Sebas, isso é porque caté um programa externo. A página de manual do Bash Builtin Commands contém detalhes sobre o que poderia estar disponível.
Cristian Ciupitu
3
Suponho que você queira dizer sistemas baseados no GNU / Linux quando você diz "Unix", como muitos outros sistemas * nix têm versões de "resgate" dos utilitários padrão que estão estaticamente vinculados apenas para aqueles momentos "ops".
Chris S
Aqui está me pensar chroot seria a única solução ...
rubenvb

Respostas:

58

você pode usar o ldconfig, ele recria o link simbólico:

# rm /lib/libc.so.6 
rm: remove symbolic link `/lib/libc.so.6'? y
# ls -l /lib/libc*
ls: error while loading shared libraries: libc.so.6: cannot open shared object file:
# ldconfig 
# ls -l /lib/libc*
[skip]
lrwxrwxrwx. 1 root root      12 May 11 07:59 /lib/libc.so.6 -> libc-2.12.so

apenas testei, como você vê.

natxo asenjo
fonte
4
E, convenientemente, o / sbin / ldconfig está vinculado estaticamente. O ldconfig é responsável por esses links simbólicos em primeiro lugar.
Etherfish
16
Isso não é realmente apenas "conveniente", um binário vinculado estaticamente é praticamente um componente de design necessário da ferramenta que mantém suas bibliotecas dinâmicas! Mas é o que a torna uma ferramenta ideal para corrigir esse problema, e IMHO é a única maneira "correta". A questão aqui não é realmente sobre um link simbólico excluído (99,999% deles podem ser excluídos sem conseqüências), é "Eu quebrei o armazenamento dinâmico de bibliotecas do meu sistema". Fazendo a sugestão do @ natxo, "corrija-a usando a ferramenta que gerencia essa loja", óbvia e sensata. Qualquer outra coisa (recriar manualmente o link) é uma solução alternativa hacky.
FeRD
Sim, é mais lógico proceder assim mesmo que a outra resposta esteja correta também.
Sebas
(necromancia, desculpe) A maior razão pela qual isso importa, BTW, é excluir links simbólicos não é a única maneira de você estragar sua loja dinâmica de bibliotecas. Digamos, por exemplo, que você renomeou acidentalmente /lib/libc-2.12.sono exemplo acima para /lib/foobar. Bem, porcaria, não mais mv. Mas ldconfig -l /lib/foobaré inteligente o suficiente para /lib/libc.so.6apontar para o arquivo com o nome errado . (Os argumentos são obrigatórios, o padrão ldconfigignora os nomes de arquivos que não começam com "lib" e contêm ".so".) Nesse ponto, você pode mvvoltar (ou cp -pse for paranóico / inteligente) e depois executar ldconfignovamente para limpar .
FeRD 23/12/16
44

O CentOS 6 geralmente vem com busyboxum conjunto de ferramentas Unix vinculadas estaticamente, instalado no /sbin. Você pode executá-lo assim:

/sbin/busybox ln -s libc-2.12.so /lib/libc.so.6
Mark Plotnick
fonte
11
+1, apenas testei depois de remover o link simbólico em uma vm teste, woks em centos 6.5
Natxo asenjo
+1 Isso também responde à pergunta genérica no título da pergunta.
MattBianco
No Debian / Ubuntu é / bin / busybox
PHZ.fi-Pharazon
23

Defina LD_PRELOAD para pré-carregar a biblioteca relevante. Eu tentei com libpthread e parece funcionar:

root@spirit:~# mv /lib/x86_64-linux-gnu/libpthread.so.0 /lib/x86_64-linux-gnu/libpthread.so.0-bak
root@spirit:~# chattr
chattr: error while loading shared libraries: libpthread.so.0: cannot open shared object file: No such file or directory
root@spirit:~# LD_PRELOAD=/lib/x86_64-linux-gnu/libpthread.so.0-bak chattr
Usage: chattr [-RVf] [-+=AaCcDdeijsSu] [-v version] files...
Dennis Kaarsemaker
fonte
interessante, ele se reagrupa com o que os outros disseram.
Sebas
21

slnserve exatamente para esse propósito: consertar links simbólicos quando você não pode usar o ln regular porque você quebrou um link simbólico essencial. Para citar sua página de manual:

DESCRIÇÃO

  The  sln  program creates symbolic links.  Unlike the ln(1) program, it
  is statically linked.  This means that if for some reason  the  dynamic
  linker  is  not  working,  sln  can  be  used to make symbolic links to
  dynamic libraries.
aru
fonte
legal, eu não conhecia essa ferramenta. Em centos faz parte da glibc, por isso deve ser instalado por padrão
Natxo asenjo
8

Você pode configurar a LD_LIBRARY_PATHvariável para incluir o diretório em que real libc.so.6é:

 export LD_LIBRARY_PATH="/dir/for/libc.so.6/:$LD_LIBRARY_PATH"

Além disso, execute ldconfig para recriar os links. Isso deve fazer com que os comandos funcionem, para que você possa usar os lncomandos para corrigir seu sistema.

Outra maneira seria inicializar via LiveCD e vincular o arquivo lá.

phoops
fonte
Então, única maneira de inicializar o livecd e vincular o arquivo lá no chroot.
phoops
11
Além disso, você deve configurar LD_LIBRARY_PATH para incluir o diretório em que o arquivo libc.so.6 está. Isso pode permitir que você use os comandos, pois deve encontrar a lib.
phoops
caramba, desculpe, eu não pensei nisso primeiro.
phoops
2
Isso não funciona, porque o arquivo vinculado ao não é chamado libc.so.6. Você precisará definir LD_PRELOAD como na minha resposta.
Dennis Kaarsemaker
11
Eu tentei no Fedora 20 e não funcionou.
Cristian Ciupitu
-4

Use scp ou sftp para copiar uma versão do ln vinculada estaticamente. Verifique se é executável. Em seguida, use-o para corrigir o arquivo.

Robert Jacobs
fonte
11
scp e sftp não funcionarão, pois também não poderão carregar esse arquivo.
Florin Asăvoaie
scp, sftp, ftp seria executado a partir de um host remoto. Isso pressupõe que o daemon na máquina quebrada já esteja em execução. Outras possibilidades de transferência de arquivos são sistemas de arquivos que já estão montados, local ou remoto.
Robert Jacobs
3
Por favor, pare de desinformação. O SCP exige que o binário scp esteja presente e será executado nos dois hosts. O SFTP também lança novos processos fora do OpenSSH que exigem o respectivo binário. A maioria dos daemons de FTP faz o mesmo.
Florin Asăvoaie