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