Apakah ada cara untuk mengidentifikasi apakah saya sebagai pengguna biasa memiliki hak untuk mengeluarkan perintah.
Sebagai contoh; Saya ingin memeriksa apakah saya memiliki hak untuk mengeluarkan perintah shutdown sebelum saya benar-benar mengeluarkannya.
Sesuatu seperti perintah berikut
-> doIhaveRightToIssue shutdown
-> Yes/No
command-line
permissions
Bernhard Colby
sumber
sumber
sudo
) dan mencari tahu. Perintah mode teks mungkin perlusudo
dan perintah grafis mungkin perlugksudo
. Anda juga dapat memeriksa di mana perintah diinstalwhich command
. Jika dalam/sbin
atau/usr/sbin
- Anda dapat mengharapkan bahwa perintah tersebut membutuhkansudo
ataugksudo
.Jawaban:
Kasus paling sederhana adalah kasus biner yang dapat dieksekusi
gzip
. Pertama, kami menemukan executable:Kemudian kita melihat atribut dari file ini:
Tiga x memberitahu kita bahwa file tersebut dapat dieksekusi oleh pemilik (yang pertama
root
), atau siapa pun dalam gruproot
(keduaroot
) dan siapa pun lainnya, masing-masing. Jadi pengguna Anda diizinkan untuk menjalankan program.Namun, executable Anda mungkin berupa file skrip yang memanggil executable lain di dalamnya. Anda mungkin dapat menjalankan skrip tetapi tidak dengan program yang disebut di dalamnya. Tidak ada cara untuk menentukan apakah pengguna Anda diizinkan untuk melakukan itu, selain benar-benar mencobanya.
Lalu ada kasus-kasus khusus seperti
shutdown
- ini benar-benar tautan simbolis ke utilitas inti yang disebutsystemctl
, yang memiliki mekanisme sendiri untuk menentukan apakah Anda diizinkan untuk memanggilnya, dan menanyakan kata sandi sudo Anda jika tidak, misalnya .(Tentang
which
perintah: ini menempatkan file executable di $ PATH yang Anda boleh jalankan, dan memberi tahu Anda yang mana yang Anda gunakan jika Anda memiliki lebih dari satu dengan nama yang sama di $ PATH. Itu tidak menemukan sembarang executable. I gunakan di sini sebagai contoh di mana mencari izin. Fakta yangwhich
menemukan executable sudah menunjukkan bahwa Anda memiliki izin untuk menjalankannya.)sumber
which
perintah harus cukup untuk file-file yang berada di salah satu direktori yang ditambahkan ke$PATH
variabel. Misalnya, melakukansudo chmod 700 /bin/nano
atausudo chmod 744 nano
menyebabkanwhich
tidak menghasilkan output. Untuk skrip lokal, yang berada di suatu tempat selain dari satuPATH
direktori,ls -l
ataustat
panggilan akan melakukan trik. Jawaban yang bagus, tapi tolong tambahkan info ini ke posting Andastat -c '%a' /bin/gzip
untuk mendapatkan755
misalnya.Dengan
sudo
:Jika saya tidak memiliki izin,
sudo
akan mengeluh bukannya menunjukkan perintah.Dengan polkit, Anda memeriksa tindakan yang ingin Anda jalankan:
Menemukan tindakan yang relevan adalah pertanyaan yang berbeda.
sumber
sudo -l
bahkan jika Anda bukan seorang sudoer - itulah intinya-l
- untuk memberi tahu Anda apakah Anda dapat menjalankan perintah dengan sudo.Kamu bisa memakai:
command -v shutdown
mengembalikan jalur keshutdown
perintah.test -x
memeriksa apakah jalur itu dapat dieksekusi untuk Anda.Perhatikan bahwa meskipun Anda mungkin dapat menjalankan perintah, perintah tersebut mungkin masih gagal karena tidak memiliki izin yang memadai untuk melakukan tugas tersebut. Ini adalah kasus umum pada sistem tipe Unix, yang alih-alih membatasi akses untuk mengeksekusi perintah, alih-alih membatasi akses pada operasi yang sebenarnya dapat dilakukan oleh program.
sumber
alias shutdown="shutdown now"
?$(which shutdown)
atau$(shopt -u expand_aliases && command -v shutdown)
. Masalah ini hanya muncul dalam mode interaktif.Yah itu bisa agak sulit di kali ...
Pertama-tama, lihat izin dengan
ls -l
...Jika triplet terakhir / ketiga mendapat x ("dapat mengeksekusi") di dalamnya, maka orang lain - dan itu berarti Anda - dapat menjalankannya ... Jika itu adalah shell-script atau sesuatu seperti itu, maka orang lain akan membutuhkan r (" dapat membaca ") juga.
Jika orang lain tidak mendapatkan izin eksekusi tetapi grup (triplet kedua) melakukannya, maka Anda dapat menjalankannya jika Anda adalah anggota grup - dalam contoh selesai, bin . Misalnya, wheel -group sering digunakan untuk membatasi siapa yang dapat menjalankan
su
, jadi hanya pengguna yang termasuk dalam grup ini yang dapat menjalankannya sama sekali. Contoh lain adalah membuat grup untuk pengembang , dan membatasi eksekusi C-compiler dan alat-alat tersebut untuk grup ini.Jika ada + tambahan setelah triplet terakhir, itu berarti AccessControllLists digunakan - ini dapat menambahkan hak eksekusi ke pengguna dan grup tambahan.
+++
Bahkan jika Anda dapat menjalankan perintah, perintah tersebut mungkin bergantung pada akses ke file, direktori dan / atau perangkat yang tidak Anda miliki aksesnya - ini mungkin membatasi apa yang dapat Anda lakukan (Anda mungkin tidak dapat untuk melakukan apa saja).
Akhirnya meskipun Anda mungkin diizinkan untuk menjalankan perintah, perintah itu sendiri dapat memeriksa identitas Anda, dan menolak untuk membiarkan Anda menggunakannya kecuali Anda terdaftar dalam file konfigurasi atau pengguna tertentu (mis. Root ). Sebagai contoh,
mount
perintah hanya akan mengizinkan root untuk me-mount perangkat apa pun - pengguna normal hanya diperbolehkan untuk memasang perangkat yang terdaftar di / etc / fstab ... yang mungkin tidak ada. Jika Anda tidak me- root dan mencoba memasang sesuatu,mount
akan mengeluh dan menolak untuk memasang perangkat. Contoh lain adalahsudo
, yang akan berjalan untuk siapa saja, tetapi hanya pengguna yang terdaftar di / etc / sudoers yang benar-benar diizinkan untuk menjalankan sesuatu sebagai root .sumber
Menggunakan
which
,type
,command
dll adalah solusi praktis yang akan bekerja di 99% dari kasus, tetapi untuk menjadi 100% yakin Anda akan harus secara manual memeriksa setiap direktori executable yang tercantum dalam Anda$PATH
. Banyak shell (termasukbash
) akan mengawali perintah Anda dengan entres dari$PATH
dan mencoba untuk mengeksekusi file-file itu berulang kali sampai mereka berhasil. Karenawhich
tidak dapat benar-benar menjalankan perintah, tidak mungkin untuk memprediksi file mana yang benar-benar akan dipilih oleh shell Anda.Sebagai contoh, bayangkan saya punya
PATH=/opt/arm/bin:/bin
, kedua direktori berisi file yang dapat dieksekusi, tetapi untuk arsitektur yang berbeda. Menjalankanwhich dd
akan kembali/opt/arm/bin/dd
(dengan asumsi saya memiliki izin untuk menjalankannya), karena entri itu yang lebih dulu. Namun, ketika saya jalankandd
di shell saya,/bin/dd
akan dieksekusi, karena/opt/arm/bin/dd
akan gagal dijalankan. Situasi yang sama dapat terjadi dalam kasus binari yang korup, hilangnya lib, dll. Pada akhirnya, tidak ada cara pasti untuk mengetahui apakah Anda akan dapat menjalankan perintah atau tidak, selain dari mencoba.Aspek lain adalah apa yang Anda anggap "memiliki izin". Sebagai pengguna, saya memiliki izin untuk menjalankan
rm ~/file
tetapi tidakrm /root/file
. Sekali lagi, tidak ada cara umum untuk mengetahuinya tanpa inspeksi manual, atau mengeluarkan perintah dan mengamati hasilnya.sumber