Artikel:Penjelasan pesan kesalahan umum di Linux
[draft artikel untuk infolinux]
Sebagai seorang pemula, Anda tentu kadang merasa bingung dengan
beberapa pesan kesalahan di shell command line Linux yang cukup
singkat tanpa penjelasan. Misalnya, saat ingin menjalankan sebuah
perintah, hasilnya "Permission denied". Tapi kenapa tepatnya
permission denied, padahal Anda sudah login sebagai root, yang mana
seharusnya sudah bisa melakukan apapun? Atau "command not found". Kok
bisa? Padahal nama perintahnya sudah benar sesuai yang ada di
buku/manual, tidak salah ketik.
Artikel ini menjelaskan beberapa pesan kesalahan umum secara lebih
mendetil: maksud pesan kesalahan, beberapa penyebab umum munculnya
pesan kesalahan tersebut, disertai tip-tip yang relevan.
Command not found
Pesan kesalahan ini muncul jika shell tidak bisa menemukan perintah
yang Anda inginkan.
Salah satu penyebab yang paling umum bagi pemula, memang, adalah salah
ketik atau lupa apa nama persis perintahnya. Nama-nama perintah di
Linux kadang "kriptik" atau aneh, sehingga sulit diingat. Sebagian
nama perintah amat disingkat-singkat berupa 2-3 huruf saja, karena
dulu memang di Unix ruang memori dan disk amat amat terbatas sehingga
semua serba superpendek. Contohlah: ls, pwd, du,
df. Jangankan pemula, pengguna veteran pun kadang lupa dengan
berbagai perintah atau skrip yang jumlahnya ribuan itu. Katakanlah
a2ensite atau a2dismod, dua skrip helper di Debian yang sering sekali
saya lupa sampai sekarang. Belum lagi kadang tiap distro memiliki nama
perintah yang berbeda: di distro yang satu "useradd", di yang lain
"adduser".
Penyebab lain adalah memang program yang Anda inginkan belum
terinstal. Saat Anda menginstal sebuah sistem baru, kadang setting
default dari distro adalah minimalis. Sebuah kebijakan yang cukup baik
sebetulnya. Contohnya, saat menginstal sebuah sistem Debian tanpa GUI
dan berbagai embel-embel, bahkan perintah seperti less pun belum
ada. Apalagi utilitas popular seperti mc atau wget atau editor
favorit Anda, yang harus diinstal dulu. Cara menginstalnya tentu di
luar bahasan artikel ini, karena berbeda-beda sesuai distro (apt-get,
yum, klik, dll) dan selera (GUI, TUI, atau command line).
Penyebab lain yang umum adalah, programnya ada tapi berada di lokasi
yang tidak dicari oleh shell. Perlu dicatat bahwa saat Anda
mengetikkan nama sebuah perintah di shell seperti ini:
$ ketuk
Maka shell seperti bash biasanya mencari ketuk ini di daftar
fungsi atau alias yang telah didefinisikan sebelumnya, atau program
atau skrip bernama ketuk yang ada di filesystem. Untuk program
atau skrip yang ada di filesystem, shell akan mencari hanya di lokasi
tertentu saja yaitu sesuai yang didefinisikan di variabel lingkungan
PATH. Mari kita lihat isi PATH:
$ echo $PATH
/usr/local/bin:/usr/bin:/usr/bin/X11:/bin
Artinya adalah, shell hanya akan mencari di direktori /usr/local/bin,
/usr/bin, /usr/bin/X11, dan /bin, dalam urutan
tersebut. Program-program yang berada di lokasi yang lain, seperti
/sbin, /usr/sbin, /opt/VirtualBox-1.3.8, bahkan di direktori yang
saat ini Anda berada (current directory) pun akan diabaikan. Jadi
Anda mungkin bingung, kok program yang berada di depan mata, yang jika
di-"ls" sudah jelas-jelas ada, ketika ingin dieksekusi kok tetap saja
dianggap "not found"?
Untuk mengeksekusi program-program di luar lokasi standar yang ada di
PATH, Anda dapat menyebutkan lokasinya sebelum nama program, misalnya:
$ /opt/Ketuk-1.2/bin/ketuk
Atau jika Anda saat ini sedang berada di direktori /opt/Ketuk-1.2/doc,
Anda bisa menggunakan lokasi relatif:
$ ../bin/ketuk
Salah satu kasus yang umum terjadi adalah: di beberapa distro jika
Anda berubah menjadi root (menggunakan perintah "su"), maka PATH tetap
belum berubah. Akibatnya, jika Anda mencoba menjalankan perintah:
# traceroute www.google.com
maka shell tidak menemukan program traceroute ini, yang mana
umumnya berada di lokasi /usr/sbin, yang tidak terdaftar dalam PATH
standar user normal. Untuk memperoleh PATH milik root yang mengandung
lokasi-lokasi sbin: /sbin, /usr/sbin, /usr/local/sbin maka saat
berganti menjadi root Anda perlu menggunakan perintah "su -".
Ngomong-ngomong, mengapa kelakuan shell seperti itu, hanya mencari
program di PATH? Yang pertama, jelas, supaya proses pencarian program
tidak memakan waktu terlalu panjang. Di dalam sebuah sistem bisa ada
ratusan hingga ribuan direktori dan tidak ada indeks yang sifatnya
real time, terlalu memakan waktu jika shell mencoba menelusuri semua
direktori ini satu per satu.
Alasan lain adalah, dalam kasus current directory, demi
keamanan. Program hanya akan dicari di lokasi yang sudah tertentu dan
diketahui aman (/usr/bin, /bin, dll). Current directory kadang "tidak
aman". Anda bisa saja sedang berjalan-jalan ke /tmp atau direktori
milik user lain. Bisa aja ada nama program bernama "ls", "cat", "less"
di direktori tersebut tapi isinya sama sekali lain. Sekarang bayangkan
Anda seorang admin atau staf shared hosting, dan salah satu user Anda
berpura-pura meminta bantuan Anda untuk melihat sebuah direktori
miliknya, dengan tujuan agar Anda "tak sengaja" menjalankan program
"ls", syukur-syukur sebagai root. Program ini bisa saja bertujuan
untuk menginstal malware atau memasang backdoor bagi si user. Nah,
sudah mengerti bukan mengapa secara defaultnya shell tidak memasukkan
current directory dalam PATH?
Sebagai catatan, untuk mengeksekusi sebuah perintah yang berada di
current directory, gunakan sintaks:
$ ./ketuk
Dan jika Anda tetap ngotot ingin agar dapat mengeksekusi
program-program yang ada current directory secara polos, maka Anda
dapat menambahkan current directory ini (".") ke dalam PATH, contoh:
$ export PATH="$PATH:."
Perintah tadi dapat ditambahkan misalnya ke ~/.bash_profile Anda agar
dieksekusi setiap kali Anda login. Perlu diingat bahwa menambahkan
current directory ke PATH amat tidak dianjurkan karena risiko
keamanannya, terutama jika ini dilakukan untuk user root.
Permission denied
Pesan kesalahan ini muncul jika Anda dianggap tidak memiliki hak yang
cukup untuk menjalankan program.
Beberapa program, terutama yang sifatnya setuid, diproteksi dari user
atau group tertentu. Misalnya:
$ ls -l /bin/su
-rwsr-x--- 1 root su-user 27000 2006-12-08 01:28 su
Di sini terlihat bahwa hanya root dan anggota group "su-user" saja
yang diizinkan mengakses /bin/su.
Kadang-kadang Anda mengalami program yang baru Anda kopi atau upload
tidak bisa dieksekusi dengan pesan error permission denied
ini. Umumnya ini karena permission file belum ada bit x (execute),
contoh 0644 dan belum 0755:
$ ls -l ketuk
-rw-r--r-- 1 steven steven 373 2007-05-05 06:42 ketuk
Untuk menjalankan sebuah program, dibutuhkan bit x (execute) pada
permission. Meskipun Anda root, kernel tetap akan menolak mengeksekusi
sebuah program atau skrip yang tidak memiliki bit x.
Untuk memperbaiki masalah ini, berikan bit x pada program:
$ chmod +x ketuk
$ ls -l ketuk
-rwxr-xr-x 1 steven steven 373 2007-05-05 06:42 ketuk
Catatan: jika programnya adalah sebuah skrip, maka Anda bisa juga
memanggil skrip ini dengan diawali nama interpreter/bahasa
pemrogramannya. Dengan cara ini, Anda tidak membutuhkan bit x pada si
skrip melainkan cukup bit r (read) saja. Contoh, jika ketuk pada
contoh di atas adalah skrip Perl:
$ perl ketuk
Connection refused, Connection timed out, Connection reset by peer
Tiga pesan kesalahan ini juga sering dijumpai dalam bekerja di
jaringan, dan seorang pemula kadang tidak mengerti jelas maksudnya dan
bedanya satu dengan yang lain. Penyebab munculnya pesan-pesan
kesalahan ini memang beragam.
Jika diterjemahkan, "connection refused" artinya permintaan koneksi
kita ditolak. Umumnya ini terjadi jika kita ingin menghubungi sebuah
service yang sedang mati. Maksudnya mati di sini adalah tidak ada
program (daemon, server) yang sedang mendengarkan (listen) di port
yang ingin kita hubungi. Contoh, cobalah menghubungi sebuah port acak
di komputer Anda sendiri:
$ telnet localhost 23056
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
Ini memang karena umumnya tidak ada daemon yang listen pada port
tersebut. Berbeda misalnya dengan port umum seperti 80 (HTTP). Jika
sistem Anda sudah diinstal web server:
$ telnet localhost 80
Connected to localhost.
Escape character is '^]'.
Ini artinya kita berhasil konek ke port 80 untuk berbicara dengan web
server. Tekan Ctrl-] (tahan tombol Control diikuti tekan tombol "]")
untuk keluar.
Apa jadinya kalau webserver kita matikan? Misalnya:
# /etc/init.d/apache2 stop
(di distro tertentu mungkin Anda menggunakan sudo
/etc/init.d/apache2 stop).
$ telnet localhost 80
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
Kini hasilnya adalah Connection refused, karena tidak ada lagi program
yang mendengarkan koneksi di port 80. Jadi kadang-kadang pesan
kesalahan ini dapat dipakai untuk tujuan monitoring, karena menjadi
indikasi apakah sebuah service hidup atau mati.
Tapi bisa saja pesan Connection refused terjadi karena
firewall. Misalnya, di firewall ada rule untuk me-REJECT paket remote
ke port 25, untuk mencegah program di komputer lokal menghubungi SMTP
server remote (dan melakukan spam, misalnya). Maka jika kita mencoba:
$ telnet mx.yahoo.com 25
Trying 68.142.195.60...
telnet: Unable to connect to remote host: Connection refused
Belum tentu berarti service SMTP di Yahoo! mati, tapi mungkin saja ada
firewall yang membuat koneksi Anda gagal.
"Connection timed out" artinya saat Anda mencoba menghubungi sebuah
port remote, tidak ada jawaban balik dari ujung sana. Penyebabnya
dapat berbeda-beda: bisa saja koneksi Anda ke remote host memang amat
lambat sehingga limit waktu koneksi yang ditetapkan terlampaui. Bisa
juga terdapat firewall yang memblokir dengan men-DROP (bukan
me-REJECT) paket-paket yang dikirimkan sehingga permintaan koneksi
Anda tidaklah pernah sampai ke tujuan.
Bagaimana dengan "Connection reset by peer"? Pesan kesalahan ini
terjadi jika koneksi dengan remote host sudah terjadi, namun
putus. Penyebab putusnya bisa antara lain: program di remote host
sengaja memutuskan koneksi. Ini pun penyebabnya bisa macam-macam: IP
Anda tidak disukai oleh si program, sudah ada terlalu banyak koneksi
dari IP atau blok IP Anda, program di sisi sana tewas karena satu dan
lain hal, dll. Penyebab lain adalah masalah koneksi internet, misalnya
jika Anda menggunakan dialup dan saluran telepon terputus atau hang
up.
Singkatnya, jika Anda mengalami problem koneksi jaringan, perlu
melihat dulu apakah penyebabnya di sisi sistem Anda, di sisi sistem
remote, atau di antara keduanya (ISP, firewall gateway, proxy, dll).
|