Abaikan sudo dalam skrip bash

9

Saya punya skrip bash kecil:

#!/bin/bash

touch dummy.txt

Jika saya menjalankan skrip ini dengan sudomaka akan membuat dummy.txtyang akan dilindungi root .

Yang ingin saya lakukan adalah:

Terlepas dari apakah script ini dijalankan menggunakan sudoatau user biasa, file tersebut dummy.txtharus tidak akan akar dilindungi.

Anonim
sumber
4
Apa pun yang Anda maksud dengan "root protected", Anda dapat menggunakan chowndan chmoddalam skrip Anda untuk mengatur kepemilikan dan izin yang diinginkan.
fkraiem
1
Tidak jelas apa yang Anda maksud dengan "root protected". Apakah maksud Anda bahwa hanya pengguna root yang dapat membaca / menulis (mis. Izin file diatur ke sesuatu seperti 700), atau bahwa pengguna root adalah pemilik file?
1
@DoritoStyle maaf atas kebingungannya. Dengan root protected , maksud saya pengguna root adalah pemilik file.
Anonim

Jawaban:

22

Anda bisa menguji apakah script yang dijalankan melalui sudomenggunakan EUIDdan SUDO_USERvariabel, dan kemudian jalankan touchsebagai SUDO_USERjika benar - sesuatu seperti

#!/bin/bash

if [[ $EUID -eq 0 ]] && [[ -n $SUDO_USER ]]; then
  sudo -u "$SUDO_USER" touch dummy.txt
else
  touch dummy.txt
fi
Steeldriver
sumber
2
Perhatikan bahwa ==digunakan untuk perbandingan string. Karena $EUIDseharusnya mengembalikan nilai integer, saya sarankan Anda menggunakan -edperbandingan. Spasi diperbolehkan dalam nama pengguna , jadi mungkin mengutip $SUDO_USERvariabel. Kalau tidak, jawaban yang bagus - ini adalah sesuatu yang saya pribadi akan gunakan.
Sergiy Kolodyazhnyy
@steeldriver inilah yang saya cari. Terima kasih!!
Anonim
1
Anda bisa meminta skrip dijalankan kembali dengan sudo -ujika skrip itu dijalankan sebagai root. OP berbicara tentang memiliki banyak perintah dalam satu skrip. Tapi hati-hati untuk menghindari infinite loop pada kesalahan.
Peter Cordes
1
Tidak ada kata splitting di dalam [[...]]sehingga tidak benar-benar diperlukan untuk mengutip variabel dalam pernyataan if @Serg dan aku gues -edadalah salah ketik untuk-eq
Arronical
@Arron ya, itu salah ketik -eq. Tidak tahu [[tidak ada pemisahan kata. Terima kasih. Secara pribadi, saya masih mengutip demi kebiasaan menulis yang baik
Sergiy Kolodyazhnyy
9

Jika skrip Anda tidak dimaksudkan untuk dijalankan root, cara paling aman untuk menyelesaikan masalah adalah dengan membatalkan eksekusi skrip di awal:

if [ "$EUID" = 0 ]; then
   echo "This script must NOT be run as root" 
   exit 1
fi

Secara opsional, Anda dapat menjalankan kembali skrip Anda sebagai pengguna fallback (mis. sudo -u FALLBACK_USER "$0") Alih-alih hanya membatalkan.

Mencoba memperbaiki kebiasaan masing-masing perintah akan membuat skrip Anda menjadi tidak perlu dan sulit untuk di-debug. Setiap kali Anda memodifikasinya, Anda harus melakukan semua pengujian dua kali (sebagai pengguna biasa, kemudian sebagai root), dan memperbaiki semua rootbug terkait yang muncul. Itu bukan solusi masa depan, jadi bisa dikatakan.

Dmitry Grigoryev
sumber
6

Secara default, file yang dibuat dengan root accound memiliki izin seperti:

-rw-r--r-- 1 root root 0 11 17 23:25 rootfile.txt

Di sini file milik pengguna root dan grup root, dan dapat dibaca dan ditulis oleh root, tetapi hanya dapat dibaca oleh orang lain.

Pendekatan paling sederhana adalah hanya dengan chownfile kembali ke pengguna asli.

chown username:group_name dummy.txt

Anda dapat menggunakan $SUDO_USERvariabel yang hanya dapat diakses saat sudodipanggil, seperti:

chown "$SUDO_USER":"$SUDO_USER" dummy.txt

Jika Anda menjalankan skrip sebagai pengguna biasa, chownbagian itu tidak diperlukan sama sekali, jadi Anda mungkin ingin mempertimbangkan untuk menggunakan pernyataan-if atau &&menguji untuk menguji kasus ketika skrip dijalankan sebagai root, dan lakukan sesuatu di sepanjang baris ini:

#!/bin/bash
touch dummy.txt
[ $UID -eq 0 ] && chown "$SUDO_USER":"$SUDO_USER" dummy.txt

Pendekatan di atas direkomendasikan. Ada yang lain, seperti menggunakan chmoduntuk mengubah izin baca-tulis-jalankan untuk pengguna dan grup, tetapi tidak disarankan.

Sergiy Kolodyazhnyy
sumber
terima kasih untuk balasan Anda. Tetapi dalam QI hanya dijelaskan skenario sederhana dalam kasus asli skrip asli akan membuat banyak file. Di linux, bisakah kita mengabaikan sudo saja?
Anonim
1
@Anonim jika Anda menjalankan keseluruhan skrip sudo, maka tidak - Anda tidak dapat mengabaikannya. Pilihan Anda adalah menjalankan skrip sebagai pengguna biasa (yang saya tidak mengerti mengapa Anda tidak melakukannya, karena Anda hanya membuat file untuk pengguna Anda di sini) atau mengubah kepemilikan file seperti yang saya tunjukkan dalam jawaban saya.
Sergiy Kolodyazhnyy
Ini adalah solusi yang paling benar dan seharusnya tidak sulit untuk ditingkatkan.
anak ayam