Cygwin mintty / bash'ın yönetici olarak çalıştırılıp çalıştırılmadığını nasıl kontrol edebilirim?


16

Sorun Bildirimi: Cygwin mintty bashoturumunun "Yönetici olarak çalıştır" olup olmadığını sınamanın en zarif ve sağlam yolu nedir?

Neden, özellikle? minttyWindows kullanırken genellikle birkaç terminalim açık ( minttysekmeler yok). En garip olanı, örneğin çalıştırmak pingveya başka bir kerelik bir işlem yapmak istediğimde "Yönetici olarak çalıştır" ı sağ tıklatarak başlattığım terminal penceresini bulmam gerektiğinde . Ben (değiştirerek görsel terminal oturumu "run yöneticisi olarak" -lık belirtmek istiyoruz bashkabuk istemi değişkeni PS1benim başlangıç dosyasında ~/.bashrc).

Bazı hızlı potansiyel çözümler:

  1. Bazı çevresel değişkenlerin değerlerini karşılaştırabilirim. Çıktıya hızlı bir şekilde bakıldığında envoldukça fazla fark vardır. Bununla birlikte, başka bir Windows makinesine taşınabilirlik açısından hangisinin en güvenilir olduğunu söylemek zor olabilir (belki de farklı Windows sürümünü çalıştırıyor).
  2. id, daha spesifik id -Gnolarak yönetici olarak çalıştırıldığında farklı grupları gösterir. Windows 7 makinemde listeye eklenen gruplar Administratorsve rootgruplar var . Yine, taşınabilir olup olmadığından emin değilim.
  3. Normal kullanıcı olarak başarısız olacak bir konuma bir dosya yazmaya çalışabilirim. Ama garip yerlere herhangi bir dosya yazmak istemiyorum - bazı hayal senaryolarında potansiyel olarak yıkıcı olabilir (örneğin, başarısız depolama ortamı) ve bu benim zevkime tamamen yetersiz görünüyor.
  4. Komutun "yönetici olarak" çalıştırılması durumunda dönüş durumu veya çıktı ile belirtilecek bazı Windows programları çalıştırılıyor. En iyisi, UNIX id(1)komutununkine benzer bir amaca sahip olabilir (ancak yerel olarak Windows veya Cygwin'de mevcuttur, ancak Windows sistem kavramlarının POSIX öykünmüş kavramlarına çok fazla getirilmeden).

Daha iyi veya daha zarif öneriler var mı? Belki cygwin bu amaca yönelik bir komut programı sağlar?

Güncelleme: /programming/4051883/batch-script-how-to-check-for-admin-rights/ 'in % 97 kopyası - fark burada bash(IMHO garip ve arkaik) Windows yerine kullanılıyor cmd.exe. Lütfen oradaki cevapları ve yorumları kontrol edin.


"Yönetici olarak çalıştır" seçeneğini kullanmazsanız, bir Yönetici hesabı işlemi başlatmış olsa bile işlem Yönetici izinlerine yükseltilmez. Bunun için daima bir kısayol oluşturun.
Ramhound

1
ConEmu denemenizi tavsiye ederim . Sekmeleri vardır, sekme çubuğunda farklı simge ile gösterilen sekmeyi yönetici olarak çalıştırabilir ve en önemlisi yerel pencere uygulamalarının nane üzerinde aksine doğru bir şekilde çalışması için sahnelerin arkasında konsol kullanır.
Jan Hudec

2
@Ramhound Bu soruya zaten daralmış olduğum orijinal sorunumun (yönetici terminal penceresini ayırt ederek) minttybunun 1. için bir kısayol yaparak çözülebileceğini haklıyorsunuz 1. yönetici olarak çalışır, 2. farklı renkte farklı yapılandırma dosyası kullanır ayarları ve 3. alternatif bir simge kullanır. Eğer genel olarak bunu nasıl yaratacağınızı açıklarsanız, size bir oy vereceğim (cevabınızda bir senaryo içinde yapılamayacağını söylemezseniz :-).
FooF

1
@FooF - Yönetici düzeyindeki bir kullanıcıyla bir işlem yürütmeniz, işlemin kendisinin yükseltildiği anlamına gelmez. Varsayılan olarak, Windows yalnızca kullanıcı bu tür bir eylemi onaylarsa, bu nedenle Windows'taki "Yönetici olarak çalıştır" özelliği işlemden geçirir. İsterseniz, HERHANGİ bir Fookullanıcı grubuna TÜM izinleri de sağlayabilirsiniz .
Ramhound

1
@FooF - sudoBir root kullanıcısı olarak çalışsanız bile gerekli olanı düşünün .
Ramhound

Yanıtlar:


9

Bu işlevi sadece aynı nedenden dolayı yazdım. Hangi kabuğun yönetici ayrıcalıklarına sahip olduğunu asla bilemiyorum.

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

Windows cmd kabuğu için /programming//a/11995662/307968 bu yanıttan uyarlanmıştır . Yönetici iseniz Net Session 0 durumunu döndürür.

Şimdi sadece istemimi veya belki başlık çubuğu rengini değiştirmek gerekiyor ....


Güzel bulmak. Stackoverflow yorumlarını kontrol ederseniz, bu da başarısız olduğu kenar durumlarda var gibi görünüyor.
FooF

Bununla birlikte, bu cevabı kabul ettim çünkü çok kapsamlı bir tartışmaya işaret ediyor (yığın akışı sorusu ve orada kabul edilen cevap şu anda sırasıyla 147 ve 255 puanları var).
FooF

Teşekkürler! Bunu istemimde kullanıcı adını seçerek renklendirmek için kullanıyorum. Satış yükseltilirse, kırmızı, aksi takdirde yeşil renklendiririm. Çok sayıda terminal penceresi açıksa hangi mermilerin yükseltildiğini takip etmek için kullanışlıdır.
HelloGoodbye

16

Bu sorunun kesin cevabı Cygwin posta listesinden geliyor . İşlemi başlatan kullanıcı 544 grubunun (Yöneticiler) bir parçasıysa, işlem Yönetici haklarıyla çalışır. Ayrıca Cromax tarafından yapılan aşağıdaki yorumdan, grup 114'ün (Yerel hesap ve Yönetici grubunun üyesi) bazen mevcut olduğu görülmektedir. Bu iki grup için test

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

Örneğin,

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

Geçmişte, / etc / group içindeki kök grup 0 olan grubu da kontrol etmeniz gerekiyordu. Ancak / etc / group artık Cygwin'e yüklenmemiştir ve genellikle varsa kaldırılmalıdır, bu nedenle grup 0'ı da kontrol etmeniz önerilmez . Sadece 544 grubu.


1
Cygwin posta listesine sorduğunuz için teşekkür ederiz. :-) (Öykünülen / çevrilen) grup kimliklerinin sistemler arasında sabit kaldığını bilmek güzel.
foof

Tabii ... Kendimi bilmek istedim ve insanlar var biliyorum .
Andrew Schulman

1
Ne yazık ki bu Mingw / Msys'de işe yaramıyor. Steven'ın cevabı, sadece Windows 7'de olmasına rağmen
10'da serçe

1
Ben sadece denedim (W7 üzerinde) ve işe yaramadı, ama fark ettim, eğer Window kullanıcı biri olarak bir yönetici olarak giriş, o zaman Cygwin yönetici olarak çalıştırıldığında, başka bir grup var KOK idbireyin çıkışı, yani 114 (yerel hesap ve yönetici grubunun bir üyesi). Bu nedenle id -G | grep -qE '\<(114|544)\>' && echo admin || echo user
normal

Teşekkürler. Bunu kendim görmedim, ama 114. grubun bir Administrators grubu gibi göründüğünü görüyorum, bu yüzden bunu kontrol etmek de mantıklı görünüyor. Cevabı revize ettim.
Andrew Schulman

7

Windows programının dönüş değerini kullanıyorum at. Ayrıca PROMPTING özel karakterinin işlevselliğini yeniden oluşturdum \$.

# 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 "

Örnekler


idWindows'ta UNIX komutunun eşdeğeri olmadığını varsayarsak , bunu doğru cevap olarak kabul ediyorum. En azından athiçbir argüman olmadan çalışan komutun herhangi bir yan etkisi yok gibi görünüyor. Bundan sonra dosyamda bu yöntemi kullanacağım .bashrc! Kesmek için teşekkürler.
FooF

1
windows8.1 üzerinde çalışmıyor gibi görünüyor
zzapper

1
@zzapper Lütfen daha spesifik olun. Ne olur / olmaz? Hata mesajları?
Steven

4
id aynı değerleri döndürür, kullanımdan kaldırılır, bunun yerine schtasks.exe kullanın, ancak bu yönetici olsun ya da olmasın çalışır
zzapper

2

id -G | grep -qE '\<(544|0)\>'benim için işe yaramadı, çünkü çıktımda bile <> veya 544 çıktı yoktu. Ancak, yükseklik yazmak için gerekli olduğundan %WINDIR%\system32, ben bir kabuk işlevi ile yükseklik test etmek için kullanılır:

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

Steven'ın mükemmel kırmızı hash karakteri fikrine uygulandığında:

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

1

Yalnızca yöneticinin yapabileceği ve başarılı olup olmadığını test edebileceği bir şey yapın: -

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

veya

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

veya

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

veya

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

1

Windows'ta Msys'de bunu deneyin (kabul edilen cevabın Msys'de çalışmadığını gördüm)

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

Bu, atyalnızca yönetici olarak çalıştırıldığında dönüş kodunun sıfır olmasına dayanır .


1
Bu, @Steven'nin önceki yanıtta verdiği yöntemle aynı görünüyor (bir yoruma göre Windows 8.1'de çalışmıyor gibi görünüyor - MSYS "at" bir şekilde olmadığı sürece). Soru Cygwin hakkında olsa da, benzer MSYS ile karşılaştırmak ilginçtir. Katkınız için teşekkürler.
FooF

Çok benzer evet. Ancak ben bash istemi stili ayarlamak yerine bir komut dosyası (Win7, Msys) kontrol etmek için kullanmaya çalışırken bu soru sona erdi, bu yüzden bu aynı işi başka birine yararlı olabileceğini düşündüm
sparrowt

Yararlılığı kabul ediyorum.
FooF
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.