Libc hilang

Create time: 8 Mei 2007
Last edit: –

Sistem: Debian 4.0

Sedang dialami saat ini 🙂 Saat mengubah sebuah server remote dari Kanotix ke Debian stable dengan “apt-get dist-upgrade”, libc hilang (ter-remove lalu proses stop karena semua perintah menjadi gagal).

Kita perlu mentransfer libc dulu secara manual ke /lib…

Tapi bagaimana cara mentransfer file? Scp gagal, tidak bisa mentransfer file ke server. Tidak bisa melakukan dpkg, apt-get, wget, lynx, ftp dll dari server untuk mengambil file dari tempat lain. Bahkan perintah-perintah dasar seperti cp, ls, rm, mv, mkdir, semuanya gagal!

Untungnya, ada busybox sehingga perintah-perintah dasar dapat memakai versi busybox ini.

Lalu… ada satu session SSH yang masih hidup! Teorinya, kita dapat melakukan transfer file dengan kopi paste 🙂

Kita dapat membuat menjalankan deretan perintah ini di server:

> /si/file
echo "\0\234\023\0\0\0\377\222..." >> /si/file
echo "\021\057\377\370\0\0\111..." >> /si/file
...

Deretan byte ini adalah isi dari /si/file. Bisa kita generate dari komputer kita sendiri sbb:

$ perl -le'
    open F, "/si/file";
    print ">/si/file";
    while(1){
      read F,$buf,100; last if length($buf)==0;
      print "echo -ne \"",
        (map {ord($_)==0 ? "\\0" : sprintf("\\%03o",ord($_)) }
         split("",$buf)),"\">>/si/file";
    }' >/tmp/script.sh

Lalu script.sh ini kita “paste”-kan dari komputer kita ke session SSH server remote. Asumsi menggunakan program terminal Konsole:

#!/usr/bin/perl
sub esc { local $_=shift; s/'/'"'"'/g; "'$_'" }
open F, "/tmp/script.sh";
$|++;
while (<F>) {
  chomp;
  system "dcop konsole-9732 session-6 sendSession ".esc($_);
  system "sleep 0.02";
  print "line $i ...\n" if $i++ % 10 == 0;
}

konsole-9732 diganti dengan session Konsole (bisa dicari dengan perintah “dcop”). session-6 diganti dengan session SSH remote server yang sebenarnya (bisa dicek dengan perintah “dcop konsole-9732”).

Bersabarlah sejenak. File yang agak besar (ratusan KB) bisa beberapa menit ditransfernya. Serasa zaman BBS 🙂

Setelah itu, di session SSH remote server, tinggal “busybox chmod +x /si/file” (jika ini program atau librari). Demikianlah proses upload menggunakan Konsole 🙂

File apa yang sebaiknya ditransfer pertama kali menggunakan cara Konsole ini? Saran saya, wget-static. Build-lah wget-static dulu di komputer sendiri dengan cara:

  • ambil source wget mis dengan “apt-get source wget” atau ekstrak tarball wget.
  • jalankan perintah “LDFLAGS=–static ./configure && make”. Hasil kompilasi nanti ada di src/wget.

Setelah kita memiliki wget, mengambil file dari remote server menjadi lebih mudah…

Saran berikutnya untuk dikirim ke server: strace-static. Buildlah dan transfer ke server, kali ini bisa menggunakan wget-static yang telah dikirim sebelumnya ke server dengan “susah payah” :-).

Dengan strace, lebih mudah mencari librari apa yang masih missing. Dan mengkopikannya ke server.

Setelah libc tertransfer, saran saya buatlah dpkg dan apt-get bekerja lagi. Lalu lanjutkan dengan Debian Way dari situ.

Resita has written 702 articles