실수로 중요한 공유 라이브러리를 제거했는데 지금은 동적으로 링크된 실행 파일을 실행할 수 없습니다. 예를 들어, 심지어 /bin/ls
보여줍니다 error while loading shared libraries: libunwind.so.8: cannot open shared object file: No such file or directory
.
SSH가 작동을 멈추기 때문에 제거된 파일을 다시 복사할 수도 없습니다( scp
새 연결을 시작할 수 없습니다). 그리고 컴퓨터에서 디스크를 제거하고 올바른 파일을 다시 쓸 수 없습니다. 내장 장치이고 이동식 디스크가 없습니다.
나에게는 -- 아직 기존 쉘 세션이 있는데 어떤 상황에서도 닫아서는 안 됩니다. 왜냐하면 새 세션을 열 수 없기 때문입니다.
내장된 셸 명령(echo, printf, read 등과 같은)만을 통해 다른 시스템에서 바이너리 파일(공유 라이브러리)을 어떻게 전송할 수 있습니까?
답변1
Bash에 내장된 /dev/tcp TCP 버스를 사용해 볼 수 있습니다.
http://fibrevillage.com/scripting/603-dev-tcp-examples-and-trouble-shooting
이를 사용하여 HTTP 요청을 공식화할 수 있어야 HTTP를 통해 파일을 가져올 수 있습니다.
답변2
/dev/tcp를 사용할 수 없는 경우 아래 설명된 대로 대체 솔루션을 사용할 수 있습니다.
대상 머신에서 다음 명령을 입력하십시오.
(while read -s l; do echo "$l"; done) > temp.txt
그런 다음 PC에서 다음 작업을 수행합니다.
- 설치
x11-utils
(필요xwininfo
) 및xdotool
; - SSH 세션이 활성화된 콘솔의 창 ID를 결정합니다.
xwininfo
이를 위해 사용합니다. - 데이터를 전송하려면 다음 명령을 사용하십시오.
od -An -v -tx1 file.bin | (while read l; do xdotool type --delay 0 --window 0xa0000d "$(echo -e \"$l\r\")"; sleep 0.02; echo -ne .; done)
전송된 데이터가 원시 16진수 형식으로 SSH 콘솔에 나타나는 경우 지연을 늘려야 합니다(수신 측이 빠르지 않음).
- 전송이 완료된 후 SSH 콘솔에서
Enter
및 키를 누른 후 다음 명령을 입력하여 수신된 파일을 16진수에서 바이너리로 변환합니다.Ctrl-D
(while read -s l; do for c in $l; do printf "\x$c"; done; done) < temp.txt > file.bin
다음 명령을 사용하여 파일 길이를 확인하십시오
(x=0; IFS=""; while read -d '' -s -r -n 1 c; do x=$(($x+1)); done; echo $x) < file.bin
.길이가 일치하면(신뢰할 수 없는 전송 중에 데이터가 손실되지 않음) 파일을 원하는 위치에 복사할 수 있습니다.
(IFS=""; while read -d '' -s -r -n 1 c; do printf "%c" "$c"; done) < file.bin > destination