Bagaimana cara memeriksa apakah cygwin mintty / bash dijalankan sebagai administrator?

15

Pernyataan Masalah: Apa cara paling elegan dan tangguh untuk menguji apakah mintty bashsesi Cygwin adalah "Jalankan sebagai administrator"?

Kenapa, secara spesifik? Saya biasanya memiliki beberapa minttyterminal terbuka saat menggunakan Windows ( minttytidak memiliki tab). Yang paling canggung adalah ketika saya harus menemukan jendela terminal yang saya mulai dengan mengklik kanan "Run as administrator" ketika misalnya saya ingin menjalankan pingatau prosedur satu kali lainnya. Saya ingin menunjukkan "run as administrator" -ness sesi terminal secara visual (dengan mengubah bashvariabel prompt shell PS1dalam file start-up saya ~/.bashrc).

Beberapa solusi potensial cepat:

  1. Saya dapat membandingkan nilai beberapa variabel lingkungan. Dengan cepat melihat envoutput ada banyak perbedaan. Namun sulit untuk mengatakan mana yang paling dapat diandalkan dalam hal portabilitas ke mesin Windows lain (mungkin menjalankan versi Windows yang berbeda).
  2. id, lebih khusus id -Gnmenunjukkan grup yang berbeda jika dijalankan sebagai administrator. Di mesin Windows 7 saya, saya memiliki Administratorsdan rootgrup ditambahkan ke daftar. Sekali lagi, saya tidak yakin apakah ini portabel.
  3. Saya bisa mencoba menulis file ke lokasi yang akan gagal sebagai pengguna biasa. Tapi saya tidak ingin menulis file apa pun ke tempat-tempat aneh - ini bisa dalam beberapa skenario yang dibayangkan berpotensi merusak (misalnya gagal media penyimpanan) dan ini tampaknya sama sekali tidak sesuai dengan selera saya.
  4. Menjalankan beberapa program Windows yang akan ditunjukkan dengan mengembalikan status atau keluaran jika perintah dijalankan "sebagai administrator". Yang terbaik adalah beberapa dengan tujuan analog dengan id(1)perintah UNIX (tetapi secara native ada di Windows - atau Cygwin, tetapi tanpa terlalu jauh menerjemahkan konsep sistem Windows ke konsep yang ditiru POSIX).

Ada saran yang lebih baik atau lebih elegan? Mungkin cygwin menyediakan utilitas perintah yang didedikasikan untuk tujuan ini?

Pembaruan: 97% duplikat dari /programming/4051883/batch-script-how-to-check-for-admin-rights/ - perbedaannya hanya ada di sini menggunakan bashalih-alih (IMHO aneh dan kuno) Windows cmd.exe. Silakan periksa jawaban dan komentar di sana.

FooF
sumber
gunakan "jalankan sebagai Administrator" kecuali jika Anda melakukan ini maka prosesnya tidak dinaikkan ke izin Administrator bahkan jika akun Administrator memulai proses. Buat saja jalan pintas jadi ini selalu dilakukan.
Ramhound
1
Saya sarankan mencoba ConEmu . Memiliki tab, dapat menjalankan tab sebagai administrator yang ditunjukkan oleh ikon berbeda di tabbar dan yang paling penting menggunakan konsol di belakang layar sehingga aplikasi windows asli bekerja dengan benar seperti pada mintty.
Jan Hudec
2
@Ramhound Anda benar bahwa masalah asli saya (membedakan jendela terminal administrator) yang telah saya persempit menjadi pertanyaan ini dapat diselesaikan dengan membuat jalan pintas untuk mintty1. yang dijalankan sebagai administrator, 2. menggunakan file konfigurasi berbeda dengan warna berbeda. pengaturan dan 3. menggunakan ikon alternatif. Jika Anda menjelaskan kepada masyarakat umum cara membuat ini, saya akan memberi Anda upvote (kecuali jika Anda mengatakan dalam jawaban Anda bahwa itu tidak dapat dilakukan dalam skrip :-).
FooF
1
@FooF - Hanya karena Anda menjalankan proses dengan pengguna tingkat Administrator tidak berarti proses itu sendiri telah meningkat. Windows secara default hanya akan melakukan proses jika pengguna menyetujui tindakan tersebut maka fitur "jalankan sebagai Administrator" di Windows. Anda juga dapat memberikan SEMUA izin ke grup APAPUN yang Anda inginkan, bahkan Foogrup pengguna jika Anda mau.
Ramhound
1
@FooF - Anggap saja sebagai sudoyang diperlukan bahkan jika Anda menjalankan sebagai pengguna root.
Ramhound

Jawaban:

9

Saya baru saja menulis fungsi ini untuk alasan yang sama. Saya tidak pernah tahu shell mana yang memiliki hak admin.

function isadmin()
{
    net session > /dev/null 2>&1
    if [ $? -eq 0 ]; then echo "admin"
    else echo "user"; fi
}

Itu diadaptasi dari jawaban ini /programming//a/11995662/307968 untuk windows cmd shell. Sesi Net mengembalikan 0 status jika Anda adalah admin.

Sekarang saya hanya perlu mengubah prompt saya, atau mungkin warna batang judul ....

Darrel Lee
sumber
Temuan yang bagus. Meskipun tampaknya ada kasus tepi di mana ini juga gagal, jika Anda memeriksa komentar stackoverflow.
FooF
Namun demikian saya menerima jawaban ini karena itu menunjuk pada diskusi yang jauh komprehensif (pertanyaan stackoverflow dan jawaban yang diterima di sana saat ini memiliki skor masing-masing 147 dan 255).
FooF
Terima kasih! Saya menggunakan ini untuk secara selektif mewarnai nama pengguna di prompt saya. Jika penjualan naik, saya warnai merah, jika tidak hijau. Berguna untuk melacak cangkang mana yang ditinggikan jika Anda memiliki banyak jendela terminal yang terbuka.
HelloGoodbye
16

Jawaban pasti untuk pertanyaan ini berasal dari milis Cygwin . Suatu proses berjalan dengan hak Administrator jika pengguna yang memulai itu adalah bagian dari grup 544 (Administrator). Juga dari komentar di bawah oleh Cromax, tampaknya grup 114 (Akun lokal dan anggota grup Administrator) juga terkadang hadir. Tes untuk dua kelompok ini adalah

id -G | grep -qE '\<(114|544)\>'

Sebagai contoh,

id -G | grep -qE '\<(114|544)\>' && echo admin || echo user

Di masa lalu Anda juga perlu memeriksa grup 0, grup root di / etc / group. Tapi / etc / group tidak lagi diinstal di Cygwin, dan biasanya harus dihapus jika ada, jadi tidak lagi disarankan untuk memeriksa grup 0 juga. Hanya kelompok 544.

Andrew Schulman
sumber
1
Terima kasih telah bertanya di milis Cygwin. :-) Senang mengetahui bahwa id grup (yang ditiru / diterjemahkan) tetap konstan di antara sistem.
FooF
Tentu ... saya ingin tahu sendiri, dan orang-orang di sana tahu .
Andrew Schulman
1
Sayangnya ini tidak berfungsi di Mingw / Msys. Jawaban Steven tidak, meskipun hanya pada Windows 7.
sparrowt
1
Saya baru saja mencobanya (pada W7) dan itu tidak berhasil, tetapi saya perhatikan, bahwa jika pengguna Window satu login seperti juga seorang administrator, maka ketika Cygwin dijalankan sebagai administrator, ada kelompok lain yang muncul dalam idoutput, yaitu 114 (Akun lokal dan anggota grup Administrator). Jadi regexp harus diperbarui ke:id -G | grep -qE '\<(114|544)\>' && echo admin || echo user
Cromax
Terima kasih. Saya belum melihat itu sendiri, tetapi saya melihat bahwa grup 114 tampaknya merupakan grup Administrator, jadi sepertinya masuk akal untuk memeriksanya juga. Saya merevisi jawabannya.
Andrew Schulman
7

Saya menggunakan nilai pengembalian program Windows at. Saya juga menciptakan kembali fungsi karakter khusus PROMPTING \$.

# Set a white $ initially
eStyle='\[\e[0m\]$'

# If 'at' succeeds, use a red # instead
at &> /dev/null && eStyle='\[\e[0;31m\]#\[\e[0m\]'  # Use # in red

PS1='\n\[\e[0;32m\]\u@\h \[\e[0;33m\]\w\[\e[0m\]\n'"$eStyle "

Contohnya

Steven
sumber
Dengan asumsi tidak ada yang setara dengan idperintah UNIX di Windows, saya menerima ini sebagai jawaban yang benar. Setidaknya menjalankan atperintah tanpa argumen tampaknya tidak memiliki efek samping. Saya akan menggunakan metode ini dalam .bashrcfile saya mulai sekarang! Terima kasih untuk hacknya.
FooF
1
sepertinya tidak berfungsi di windows8.1
zzapper
1
@zzapper Harap lebih spesifik. Apa yang terjadi / tidak terjadi? Pesan kesalahan?
Steven
4
id mengembalikan nilai yang sama, pada penggunaan yang sudah usang schtasks.exe tetapi ini berfungsi baik admin atau tidak
zzapper
2

id -G | grep -qE '\<(544|0)\>'sepertinya tidak bekerja untuk saya, karena output saya tidak memiliki <> atau 544 bahkan ketika meningkat. Namun, karena ketinggian diperlukan untuk menulis %WINDIR%\system32, saya menggunakannya untuk menguji ketinggian dengan fungsi shell:

is_elevated() { 
   [[ $(uname -o) -eq "Cygwin" ]] || return 1
   touch $WINDIR/system32/.cyg_elevated &> /dev/null
}

Ketika diterapkan pada ide bagus Steven tentang karakter hash merah:

is_elevated && PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\[\e[0;31m\]#\[\e[0m\] '
Josh
sumber
1

Lakukan sesuatu yang hanya bisa dilakukan oleh admin dan menguji keberhasilan atau kegagalan: -

if touch c:/Users/.x ; then  echo 'ok'  ; fi

atau

touch c:/Users/.x && echo ok

atau

touch c:/Users/.x && \rm c:/Users/.x && echo ok

atau

touch c:/Users/.x  &> /dev/null && \rm c:/Users/.x && echo you are admin
zzapper
sumber
1

Di Msys pada Windows coba ini (saya menemukan jawaban yang diterima tidak berfungsi di Msys)

at &> /dev/null && echo "Running as admin" || echo "NOT running as admin"

Ini bergantung pada kode kembali atmenjadi nol hanya ketika dijalankan sebagai admin.

burung pipit
sumber
1
Ini tampaknya metode yang sama dengan @Steven memberikan jawaban sebelumnya (yang tampaknya tidak berfungsi pada Windows 8.1 menurut komentar - kecuali jika MSYS "at" entah bagaimana). Sementara pertanyaannya adalah tentang Cygwin, menarik untuk membandingkan dengan MSYS serupa. Terima kasih atas kontribusinya.
FooF
Sangat mirip ya. Namun saya akhirnya pada pertanyaan ini mencoba menggunakannya untuk memeriksa skrip (Win7, Msys) daripada mengatur gaya bash prompt, jadi saya pikir ini mungkin berguna bagi orang lain yang melakukan hal yang sama
sparrowt
Saya setuju dengan kegunaannya.
FooF