Как проверить, запускается ли cygwin mintty / bash от имени администратора?


15

Постановка проблемы: Какой самый элегантный и надежный способ проверить, является ли mintty bashсеанс Cygwin «Запуск от имени администратора»?

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

Некоторые быстрые потенциальные решения:

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

Есть лучшие или более элегантные предложения? Возможно, cygwin предоставляет командную утилиту, предназначенную для этой цели?

Обновление: 97% дубликатов /programming/4051883/batch-script-how-to-check-for-admin-rights/ - разница только в том, bashчтобы использовать вместо (имхо странно и архаично) Windows cmd.exe, Пожалуйста, проверьте ответы и комментарии там.


используйте «запуск от имени администратора», если вы не сделаете это, тогда процесс не будет повышен до прав администратора, даже если учетная запись администратора запускает процесс. Просто создайте ярлык, чтобы это всегда было сделано.
Ramhound

1
Я рекомендую попробовать ConEmu . Он имеет вкладки, может запускать вкладку как администратор, обозначенный другим значком на панели вкладок, и, что наиболее важно, использует консоль "за кулисами", поэтому собственные приложения Windows работают на нем правильно, в отличие от mintty.
Ян Худек

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

1
@FooF - То, что вы запускаете процесс с пользователем уровня администратора, не означает, что сам процесс был расширен. Windows по умолчанию будет преобразовывать процесс только в том случае, если пользователь одобрит такое действие, поэтому в Windows предусмотрена функция «Запуск от имени администратора». Вы также можете предоставить ВСЕ разрешения для ЛЮБОЙ группы, которую хотите, даже для Fooгруппы пользователей, если хотите.
Ramhound

1
@FooF - Просто подумайте, sudoчто требуется, даже если вы работаете как пользователь root.
Ramhound

Ответы:


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. 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.
sparrowt

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 "at" как-то не так). Хотя вопрос был о Cygwin, интересно сравнить с аналогами MSYS. Спасибо за вклад.
15:00

Очень похоже да. Тем не менее, я остановился на этом вопросе, пытаясь использовать его для проверки скрипта (Win7, Msys), а не для установки стиля приглашения bash, поэтому я подумал, что это может пригодиться кому-то другому, делающему то же самое
sparrowt

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