Bagaimana saya bisa tahu jika saya memiliki izin untuk menjalankan perintah tertentu?

18

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
Bernhard Colby
sumber
4
Cara langsung adalah dengan mencoba (tanpa sudo) dan mencari tahu. Perintah mode teks mungkin perlu sudodan perintah grafis mungkin perlu gksudo. Anda juga dapat memeriksa di mana perintah diinstal which command. Jika dalam /sbinatau /usr/sbin- Anda dapat mengharapkan bahwa perintah tersebut membutuhkan sudoatau gksudo.
sudodus

Jawaban:

26

Kasus paling sederhana adalah kasus biner yang dapat dieksekusi gzip. Pertama, kami menemukan executable:

$ which gzip
/bin/gzip

Kemudian kita melihat atribut dari file ini:

$ ls -l /bin/gzip
-rwxr-xr-x 1 root root 98240 oct 27  2014 /bin/gzip

Tiga x memberitahu kita bahwa file tersebut dapat dieksekusi oleh pemilik (yang pertama root), atau siapa pun dalam grup root(kedua root) 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 disebut systemctl, yang memiliki mekanisme sendiri untuk menentukan apakah Anda diizinkan untuk memanggilnya, dan menanyakan kata sandi sudo Anda jika tidak, misalnya .

(Tentang whichperintah: 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 yang whichmenemukan executable sudah menunjukkan bahwa Anda memiliki izin untuk menjalankannya.)

Jos
sumber
Jawaban yang sangat ringkas (+1). Sebagai contoh, adalah mungkin untuk mensimulasikan hasil apt-get install dengan -s flag (sudo apt-get install -s htop). Saya pikir jika tidak ada cara untuk mempelajari izin dari suatu perintah sebelum ada masalah, setidaknya ada sesuatu seperti "simulasi".
Bernhard Colby
Tentu saja, ada utilitas yang menyediakan flag "run-run" atau "simulasi" yang dapat Anda gunakan.
Jos
4
whichperintah harus cukup untuk file-file yang berada di salah satu direktori yang ditambahkan ke $PATHvariabel. Misalnya, melakukan sudo chmod 700 /bin/nanoatau sudo chmod 744 nanomenyebabkan whichtidak menghasilkan output. Untuk skrip lokal, yang berada di suatu tempat selain dari satu PATHdirektori, ls -latau statpanggilan akan melakukan trik. Jawaban yang bagus, tapi tolong tambahkan info ini ke posting Anda
Sergiy Kolodyazhnyy
Melepaskan apa yang Serg katakan, gunakan sesuatu seperti stat -c '%a' /bin/gzipuntuk mendapatkan 755misalnya.
AT
21

Dengan sudo:

$ sudo -l shutdown
/sbin/shutdown

Jika saya tidak memiliki izin, sudoakan mengeluh bukannya menunjukkan perintah.

Dengan polkit, Anda memeriksa tindakan yang ingin Anda jalankan:

$ pkcheck --action-id org.freedesktop.login1.power-off --process $$ -u --enable-internal-agent && echo yes
polkit\56temporary_authorization_id=tmpauthz1
yes

Menemukan tindakan yang relevan adalah pertanyaan yang berbeda.

muru
sumber
Masalah dengan sudo adalah saya bukan sudoer dalam sistem. Karena itu, saya berusaha berhati-hati sebelum benar-benar mengeluarkan perintah.
Bernhard Colby
4
@BernhardColby Anda dapat menjalankan dengan aman sudo -lbahkan jika Anda bukan seorang sudoer - itulah intinya -l- untuk memberi tahu Anda apakah Anda dapat menjalankan perintah dengan sudo.
muru
Terima kasih (+1), saya tidak mengetahuinya. Saya akan mencoba solusi Anda segera setelah saya mendapatkan pc saya.
Bernhard Colby
8

Kamu bisa memakai:

test -x $(command -v shutdown) && echo yes || echo no

command -v shutdownmengembalikan jalur ke shutdownperintah. test -xmemeriksa 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.

Robie Basak
sumber
Bagaimana dengan misalnya alias shutdown="shutdown now"?
Dmitry Grigoryev
Untuk menghindari masalah dengan alias, orang dapat menggunakan $(which shutdown)atau $(shopt -u expand_aliases && command -v shutdown). Masalah ini hanya muncul dalam mode interaktif.
David Foerster
5

Yah itu bisa agak sulit di kali ...

Pertama-tama, lihat izin dengan ls -l...

 perintah grup pengguna owngrpotr
-rwxr-xr-x root bin vim

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, mountperintah 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, mountakan mengeluh dan menolak untuk memasang perangkat. Contoh lain adalah sudo, yang akan berjalan untuk siapa saja, tetapi hanya pengguna yang terdaftar di / etc / sudoers yang benar-benar diizinkan untuk menjalankan sesuatu sebagai root .

Baard Kopperud
sumber
3

Menggunakan which, type, commanddll 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 (termasuk bash) akan mengawali perintah Anda dengan entres dari $PATHdan mencoba untuk mengeksekusi file-file itu berulang kali sampai mereka berhasil. Karena whichtidak 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. Menjalankan which ddakan kembali /opt/arm/bin/dd(dengan asumsi saya memiliki izin untuk menjalankannya), karena entri itu yang lebih dulu. Namun, ketika saya jalankan dddi shell saya, /bin/ddakan dieksekusi, karena /opt/arm/bin/ddakan 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 ~/filetetapi tidak rm /root/file. Sekali lagi, tidak ada cara umum untuk mengetahuinya tanpa inspeksi manual, atau mengeluarkan perintah dan mengamati hasilnya.

Dmitry Grigoryev
sumber