Як перевірити, чи cygwin mintty / bash запускається як адміністратор?


15

Постановка проблеми: який найелегантніший та надійний спосіб перевірити, чи Cygwin mintty bashсеанс "Запустити як адміністратор"?

Чому саме? У мене зазвичай minttyвідкрито кілька терміналів при використанні Windows ( minttyне має вкладок). Найзручніше, коли мені потрібно знайти вікно терміналу, яке я запустив, клацнувши правою кнопкою миші «Запустити як адміністратор», коли, наприклад, я хочу запустити pingабо іншу разову процедуру. Я хотів би візуально вказати на «запустити як адміністратор» термінального сеансу (змінивши bashзмінну підказки оболонки PS1у моєму файлі запуску ~/.bashrc).

Деякі швидкі потенційні рішення:

  1. Я можу порівняти значення деяких змінних довкілля. Швидкий огляд envвипуску існує досить багато відмінностей. Однак важко сказати, який найбільш надійний з точки зору переносимості на іншу машину Windows (можливо, працює інша версія Windows).
  2. id, точніше id -Gnпоказує різні групи, якщо вони запускаються як адміністратор. У моїй машині Windows 7 У мене є Administratorsі rootгрупи , додані в список. Знову ж таки, я не впевнений, чи це портативний.
  3. Я міг би спробувати написати файл до місця, яке не вдасться, як звичайний користувач. Але я не хочу писати жодні файли в чужі місця - це в деяких уявних сценаріях може бути руйнівним (наприклад, невдалий носій інформації), і це здається абсолютно неелегантним на мій смак.
  4. Запуск якоїсь програми Windows, яка вказуватиме статусом повернення чи результатом, якщо команда виконується "як адміністратор". Найкраще було б те, що має аналогічне призначення з id(1)командою UNIX (але споконвічно існує в Windows - або Cygwin, але без занадто далеко знайденого перекладу системних концепцій Windows на емульовані POSIX концепції).

Якісь кращі чи елегантніші пропозиції? Можливо, cygwin надає утиліту для команд, призначену для цієї мети?

Оновлення: 97% дублікат /programming/4051883/batch-script-how-to-check-for-admin-rights/ - різниця полягає лише у використанні bashзамість (IMHO дивного та архаїчного) Windows cmd.exe. Будь ласка, перевірте відповіді та коментарі там.


використовуйте "запустити як адміністратор", якщо ви цього не зробите, тоді процес не підвищений до дозволів адміністратора, навіть якщо обліковий запис адміністратора запускає процес. Просто створіть ярлик, щоб це завжди робилося.
Рамхаунд

1
Я рекомендую спробувати ConEmu . Він має вкладки, може запускати вкладки як адміністратор, вказаний різними значками на панелі вкладок, а головне, використовує консоль за кадром, щоб рідні програми Windows працювали на ній правильно, на відміну від м'яти.
Ян Худек

2
@Ramhound Ви маєте рацію, що мою оригінальну проблему (розрізнення вікна терміналу адміністратора), яку я вже звузив у цьому питанні, можна було вирішити шляхом скорочення для mintty1. 1. працює як адміністратор, 2. використовує інший файл конфігурації з різним кольором налаштування та 3. використовує альтернативний значок. Якщо ви опишете широкій публіці, як це створити, я дам вам підсумок (якщо ви у своїй відповіді не скажете, що це неможливо зробити в рамках сценарію :-).
FooF

1
@FooF - Тільки тому, що ви запускаєте процес з користувачем на рівні адміністратора, це не означає, що сам процес ескалації. За замовчуванням Windows буде завершувати процес лише тоді, коли користувач схвалить таку дію, отже, функція "запустити як адміністратор" у Windows. Ви також можете надати ВСІ дозволи на будь-яку групу, яку ви хочете, навіть Fooякщо вона захотіла.
Рамхаунд

1
@FooF - Подумайте, як sudoце потрібно, навіть якщо ви працюєте як користувач root.
Рамхаунд

Відповіді:


9

Я просто написав цю функцію з тієї ж причини. Я ніколи не знаю, яка оболонка має права адміністратора.

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

Він адаптувався з цієї відповіді /programming//a/11995662/307968 для Windows cmd shell. Net Session повертає 0 статус, якщо ви адміністратор.

Тепер мені просто потрібно змінити своє підказку, а може бути, колір заголовка….


Приємна знахідка. Хоча, здається, є крайові випадки, коли це теж не вдається, якщо ви перевіряєте коментарі stackoverflow.
FooF

Тим не менш, я прийняв цю відповідь, тому що вона вказує на набагато всебічні дискусії (питання стак-потоку та прийнята відповідь на даний момент мають бали 147 і 255 відповідно).
FooF

Спасибі! Я використовую це, щоб вибірково забарвити ім'я користувача в моєму підказці. Якщо продаж підвищений, я забарвлюю його в червоний, інакше зелений. Корисно слідкувати за тим, які оболонки підняті, якщо у вас багато відкритих вікон терміналів.
HelloGoodbye

16

Остаточна відповідь на це питання надходить із списку розсилки Cygwin . Процес працює з правами адміністратора, якщо користувач, який його запустив, входить до групи 544 (Адміністратори). Крім того, з коментаря Cromax, поданого нижче, схоже, що група 114 (Місцевий акаунт та член групи адміністраторів) також іноді присутня. Тест для цих двох груп є

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

Наприклад,

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

Раніше вам також потрібно було перевірити наявність групи 0, кореневу групу в / etc / group. Але / etc / group більше не встановлюється в Cygwin, і зазвичай його слід видалити, якщо він присутній, тому його також більше не рекомендується перевіряти на групу 0. Просто група 544.


1
Дякуємо за запитання у списку розсилки Cygwin. :-) Приємно знати, що (емульований / перекладений) ідентифікатор групи залишається постійним між системами.
FooF

Звичайно ... я хотів знати себе, і люди там знають .
Ендрю Шульман

1
На жаль, це не працює в Mingw / Msys. Відповідь Стівена є, хоча тільки в Windows 7.
Воробей

1
Я щойно спробував це (на W7), і це не спрацювало, але я помітив, що якщо користувач Window входить до системи, як і адміністратор, тоді, коли Cygwin працює адміністратором, є ще одна група, яка з'являється у idвихідних даних, а саме 114 (Локальний рахунок та член групи адміністраторів). Таким чином, регулярне оновлення слід оновити до:id -G | grep -qE '\<(114|544)\>' && echo admin || echo user
Cromax

Спасибі. Я сам цього не бачив, але бачу, що група 114, схоже, є групою адміністраторів, тому здається, що це також розумно перевірити. Я переглянув відповідь.
Ендрю Шульман

7

Я використовую повернене значення програми Windows at. Я також відтворив функціональність спеціального символу ПРОМОНТУВАННЯ \$.

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

Приклади


Якщо припустити, що idв Windows немає еквівалента команди UNIX , я приймаю це як правильну відповідь. Принаймні запущена atкоманда без жодних аргументів не має жодних побічних ефектів. Я зараз буду використовувати цей метод у своєму .bashrcфайлі! Дякую за злом.
FooF

1
не працює на windows8.1
zzapper

1
@zzapper Будьте точнішими. Що відбувається / не відбувається? Повідомлення про помилки?
Стівен

4
id повертає ті самі значення, при цьому застаріле використання замість schtasks.exe, але це працює, будь то адміністратор чи ні
zzapper

2

id -G | grep -qE '\<(544|0)\>'не здавалося, що працює для мене, так як у мого виходу не було ні <>, ні 544 навіть при підвищенні. Однак, оскільки для запису потрібні висоти %WINDIR%\system32, я використовував це для тесту на висоту з функцією оболонки:

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

Застосовуючи до чудового уявлення Стівена про червоний хеш-характер:

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

1

Зробіть щось, що міг би зробити лише адміністратор і перевірити на успіх чи невдачу: -

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

або

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

або

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

або

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

1

У Msys в Windows спробуйте це (я виявив, що прийнята відповідь не працює в Msys)

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

Це покладається на те, що зворотний код atдорівнює нулю, лише коли він працює як адміністратор.


1
Це здається тим самим методом, що і @Steven, що давав раніше відповідь (яка, здається, не працює в Windows 8.1 згідно з коментарем - якщо MSYS "у" якимось чином). Поки питання стосувалося Cygwin, його цікаво порівняти з аналогічними MSYS. Дякуємо за внесок.
FooF

Дуже схоже так. Однак я закінчився цим питанням, намагаючись використати його для перевірки сценарію (Win7, Msys), а не для встановлення стилю підказок bash, тому я подумав, що це може бути
корисно тому,

Я погоджуюся на корисність.
FooF
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.