Saya menggunakan git bash
pada Windows. Saya ingin menjalankan ls
perintah dengan bash
. Saya dapat menjalankan ls
terpisah seperti ini:
$ ls
f1 f2
Namun, ketika saya mencoba dengan bash
, saya mendapatkan kesalahan:
$ bash ls
/usr/bin/ls: /usr/bin/ls: cannot execute binary file
Tetapi jika saya membuat skrip saya, itu berfungsi dengan baik:
$ echo "echo [email protected]" > my.sh && bash my.sh
Apa yang bisa menjadi masalah?
Jawaban yang Diterima:
Dari manual yang bagus untuk bash(1)
:
ARGUMEN
Jika argumen tetap ada setelah pemrosesan opsi, dan opsi -c maupun
-s tidak diberikan, argumen pertama diasumsikan sebagai
nama file berisi perintah shell.
Apakah ls
berisi perintah shell? Tidak, ini adalah file biner. bash
mengoceh tentang fakta ini dan gagal.
Sebuah strace
dapat membantu menunjukkan apa yang sedang terjadi:
$ strace -o alog bash ls
/usr/bin/ls: /usr/bin/ls: cannot execute binary file
alog
file bisa menjadi sedikit berantakan, tetapi menampilkan bash
mencari ls
di direktori kerja saat ini—risiko keamanan jika seseorang telah menempatkan ls
. yang nakal file di suatu tempat!—dan kemudian melakukan PATH
cari:
$ grep ls alog
execve("/usr/bin/bash", ["bash", "ls"], [/* 43 vars */]) = 0
open("ls", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/local/bin/ls", 0x7fff349810f0) = -1 ENOENT (No such file or directory)
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
access("/usr/bin/ls", X_OK) = 0
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
access("/usr/bin/ls", R_OK) = 0
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
access("/usr/bin/ls", X_OK) = 0
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
access("/usr/bin/ls", R_OK) = 0
open("/usr/bin/ls", O_RDONLY) = 3
Mengapa ini bisa menjadi risiko keamanan, jika Anda menjalankan bash somecmd
dari direktori yang salah di mana seseorang telah membuat ls
(atau perintah lain yang diketahui karena bug dalam skrip):
$ echo "echo rm -rf /" > ls
$ bash ls
rm -rf /
$