14

Постановка проблемы: Какой самый элегантный и надежный способ проверить, является ли сеанс 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, которая сообщит статусом возврата или выводом, если команда запускается "как администратор". Лучше всего подойдут те, которые аналогичны назначению команды UNIX id(1) (но изначально существуют в Windows или Cygwin, но без слишком надуманного перевода системных понятий Windows в эмулируемые POSIX-концепции).

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

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

6 ответов6

14

Окончательный ответ на этот вопрос приходит из списка рассылки 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.

7

Я использую возвращаемое значение программы Windows at . Я также воссоздала функциональность специального символа 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 "

Примеры

6

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

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

Это адаптировано из этого ответа https://stackoverflow.com/a/11995662/307968 для оболочки Windows cmd. Net Session возвращает 0 статуса, если вы являетесь администратором.

Теперь мне просто нужно изменить подсказку или, возможно, цвет заголовка ....

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 равна нулю только при запуске от имени администратора.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .