Seperti yang dijelaskan oleh @dabut , masalahnya di sini adalah skrip Anda tidak memiliki garis shebang . Tanpa shebang, sudo
akan default untuk mencoba menjalankan file menggunakan /bin/sh
. Saya tidak dapat menemukannya didokumentasikan di mana pun, tetapi saya mengonfirmasi dengan memeriksa sudo
kode sumber tempat saya menemukan yang berikut dalam file pathnames.h
:
#ifndef _PATH_BSHELL
#define _PATH_BSHELL "/bin/sh"
#endif /* _PATH_BSHELL */
Ini berarti "atur jika variabel _PATH_BSHELL
tidak ditentukan, atur ke /bin/sh
". Kemudian, dalam configure
skrip yang disertakan dalam tarball sumber, kami memiliki:
for p in "/bin/bash" "/usr/bin/sh" "/sbin/sh" "/usr/sbin/sh" "/bin/ksh" "/usr/bin/ksh" "/bin/bash" "/usr/bin/bash"; do
if test -f "$p"; then
found=yes
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $p" >&5
$as_echo "$p" >&6; }
cat >>confdefs.h <<EOF
#define _PATH_BSHELL "$p"
EOF
break
fi
done
Lingkaran ini akan mencari /bin/bash
, /usr/bin/sh
, /sbin/sh
, /usr/sbin/sh
atau /bin/ksh
dan kemudian menetapkan _PATH_BSHELL
untuk mana ditemukan pertama kali . Karena /bin/sh
itu yang pertama dalam daftar dan itu ada, _PATH_BSHELL
diatur ke /bin/sh
. Hasil dari semua ini adalah bahwa shell default sudo
kecuali ditentukan lain /bin/sh
.
Jadi, sudo
akan secara default menjalankan hal-hal menggunakan /bin/sh
dan, pada Ubuntu, yang merupakan symlink ke dash
, shell minimal yang sesuai dengan POSIX:
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Feb 27 2015 /bin/sh -> dash
The [[
konstruk fitur bash, itu tidak didefinisikan oleh standar POSIX dan tidak dimengerti oleh dash
:
$ bash -c '[[ true ]] && echo yes'
yes
$ dash -c '[[ true ]] && echo yes'
dash: 1: [[: not found
Secara terperinci, dalam tiga doa Anda mencoba:
./test.sh
Tidak ada sudo
; tanpa adanya garis shebang, shell Anda akan mencoba untuk mengeksekusi file itu sendiri. Karena Anda menjalankan bash
, ini akan berjalan bash ./test.sh
dan bekerja secara efektif .
sudo su
diikuti oleh ./test.sh
.
Di sini, Anda memulai shell baru untuk pengguna root
. Ini akan menjadi apa pun shell yang didefinisikan dalam $SHELL
variabel lingkungan untuk pengguna itu dan, pada Ubuntu, shell default root adalah bash
:
$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
sudo ./test.sh
Di sini, Anda membiarkan sudo
menjalankan perintah secara langsung. Karena shell defaultnya /bin/sh
seperti dijelaskan di atas, ini menyebabkannya menjalankan skrip dengan /bin/sh
, yang mana dash
dan gagal karena dash
tidak mengerti [[
.
Catatan : perincian tentang bagaimana sudo
menyetel shell default tampaknya sedikit lebih rumit. Saya mencoba mengubah file yang disebutkan dalam jawaban saya untuk menunjuk /bin/bash
tetapi sudo
masih default ke /bin/sh
. Jadi harus ada beberapa tempat lain dalam kode sumber di mana shell default didefinisikan. Namun demikian, poin utama (yang sudo
defaultnya sh
) masih berlaku.
sudo su
. Jalankan sajasudo -i
atausudo -s
sebaliknya.