ln을 사용하지 않고 심볼릭 링크를 만드는 방법은 무엇입니까?


31

중요한 심볼릭 링크를 삭제했습니다 libc.so.6. 나는 그것을 가리해야 파일을 가지고 있지만 같은 기본 명령어 ln또는 wget누락으로 인해 링크에 더 이상 작동하지 않습니다. 그러나 echo다른 Bash 내장 기능이 작동합니다.

이 심볼릭 링크를 다시 만드는 방법을 찾고 있습니다.


1
@Sebas, 난 당신이 모든 의미 생각 배쉬 내장 매크로 단지를 echo.
Cristian Ciupitu

@CristianCiupitu 어쩌면 무엇입니까? cat비활성화되었습니다 ... 실제로 모든 것이되었습니다.
Sebas

1
@Sebas cat는 외부 프로그램 이기 때문 입니다. 갈라 내장 명령 매뉴얼 페이지를 사용할 수 무엇에 대한 세부 정보를 가지고 있습니다.
Cristian Ciupitu

3
다른 많은 * nix 시스템이 "구제"순간을 위해 정적으로 링크 된 표준 유틸리티의 "구조"버전을 가지고 있기 때문에 "Unix"라고 말할 때 GNU / Linux 기반 시스템을 의미한다고 가정합니다.
Chris S

여기에 ... 내가 유일한 해결책이 될 것 chroot를 생각하고 있어요
rubenvb은

답변:


58

ldconfig를 사용하면 심볼릭 링크가 다시 만들어집니다.

# 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

보시다시피 방금 테스트했습니다.


4
그리고 편리하게 / sbin / ldconfig는 정적으로 연결됩니다. ldconfig는 처음에 이러한 심볼릭 링크를 담당합니다.
etherfish

16
정적으로 링크 된 바이너리는 동적 라이브러리를 유지하는 데 필요한 도구의 디자인 구성 요소입니다. 그러나이 문제를 해결하기위한 이상적인 도구이며 IMHO가 유일한 "올바른"방법입니다. 여기서 질문은 삭제 된 심볼릭 링크에 대한 것이 아니며 (결과의 99.999 %는 결과없이 삭제 될 수 있음) "시스템의 동적 라이브러리 저장소를 끊었습니다"입니다. @natxo의 제안에 따르면, "해당 상점을 관리하는 도구를 사용하여 수정하십시오". 다른 것 (수동으로 링크를 다시 작성)은 해키 해결책입니다.
FeRD

예, 다른 답변도 정확하더라도 진행하는 것이 더 논리적입니다.
Sebas

(necromancy, 죄송합니다) 이것이 중요한 문제인 BTW는 심볼릭 링크를 삭제하는 것이 동적 라이브러리 저장소를 망칠 수있는 유일한 방법은 아닙니다. 예를 들어 실수로 /lib/libc-2.12.so위의 예에서 이름을로 바꾸 었다고 가정 합니다 /lib/foobar. 음, 쓰레기, 더 이상 mv.하지 그러나 잘못된 이름의 파일 ldconfig -l /lib/foobar/lib/libc.so.6가리킬 정도로 똑똑 합니다. (args가 필요합니다. 기본적 으로 "lib"로 시작하지 않고 ".so"를 포함하는 파일 이름은 무시합니다.)이 시점에서 다시 또는 편집증 / 스마트 인 경우 다시 실행 하여 정리할 수 있습니다. . ldconfigmvcp -pldconfig
FeRD

44

CentOS 6에는 일반적으로 busybox에 정적으로 링크 된 유닉스 도구 세트가 포함되어 있습니다 /sbin. 다음과 같이 실행할 수 있습니다.

/sbin/busybox ln -s libc-2.12.so /lib/libc.so.6

1
+1 그냥 테스트 VM의 심볼릭 링크를 제거한 후 그것을 테스트, 그것은에 CentOS 6.5 웍
아 세뇨 natxo

+1 질문 제목의 일반적인 질문에 대한 답변입니다.
MattBianco

데비안 / 우분투에서는 / bin / busybox입니다
PHZ.fi-Pharazon

23

관련 라이브러리를 사전로드하려면 LD_PRELOAD를 설정하십시오. libpthread로 시도해 보았지만 작동하는 것 같습니다.

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...

흥미롭게도 다른 사람들의 말과 재편성됩니다.
Sebas

21

sln필수 심볼릭 링크를 끊었 기 때문에 규칙적인 ln을 사용할 수 없을 때 심볼릭 링크를 수정하는 것입니다. 매뉴얼 페이지를 인용하려면 :

기술

  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.

좋아, 나는이 도구를 몰랐다. 그것은 기본적으로 설치해야합니다 있도록 CentOS는 그것은,의 glibc의 일부입니다
아 세뇨 natxo

8

LD_LIBRARY_PATHreal libc.so.6이 있는 디렉토리를 포함하도록 variable을 설정할 수 있습니다 .

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

또한 ldconfig링크를 다시 작성 하기 위해 실행 하십시오. 이렇게하면 명령이 작동하므로 ln명령을 사용하여 시스템을 수정할 수 있습니다.

다른 방법은 LiveCD를 통해 부팅하고 파일을 연결하는 것입니다.


그런 다음 livecd를 부팅하고 chroot에 파일을 링크하는 유일한 방법입니다.
phoops

1
또한 libc.so.6 파일이있는 디렉토리를 포함하도록 LD_LIBRARY_PATH를 설정해야합니다. lib를 찾아야하므로 명령을 사용할 수 있습니다.
phoops

젠장, 미안하지만 내가 먼저 생각하지 않았습니다.
phoops

2
작동하지 않습니다. 연결된 파일의 이름이 libc.so.6이 아니기 때문입니다. 내 대답과 같이 LD_PRELOAD를 설정해야합니다.
Dennis Kaarsemaker 19 년

1
Fedora 20에서 시도했지만 작동하지 않았습니다.
Cristian Ciupitu

-4

scp 또는 sftp를 사용하여 정적으로 링크 된 버전의 ln을 복사하십시오. 실행 가능한지 확인하십시오. 그런 다음 파일을 수정하는 데 사용하십시오.


1
scp 및 sftp는 해당 파일을로드 할 수 없으므로 작동하지 않습니다.
Florin Asăvoaie 0시 18 분

scp, sftp, ftp는 원격 호스트에서 실행됩니다. 깨진 시스템의 데몬이 이미 실행중인 것으로 가정합니다. 파일 전송의 다른 가능성은 로컬 또는 원격으로 이미 마운트 된 파일 시스템입니다.
Robert Jacobs

3
잘못된 정보를 중지하십시오. SCP는 scp 바이너리가 있어야하며 두 호스트 모두에서 실행됩니다. SFTP는 OpenSSH에서 각 바이너리가 필요한 새 프로세스도 시작합니다. 대부분의 FTP 데몬이 동일하게 수행됩니다.
Florin Asăvoaie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.