重要な共有ライブラリを誤って削除してしまい、動的にリンクされた実行可能ファイルを実行できなくなりました。たとえば、 と/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)
転送されたデータが ssh コンソールに生の 16 進数形式で表示される場合は、遅延を増やす必要があります (受信側が十分に高速ではありません)。
- 送信が完了したら、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