Пользователь root / эквивалент sudo в Cygwin? - PullRequest
151 голосов
/ 03 ноября 2010

Я пытаюсь запустить bash-скрипт в Cygwin.

Я получаю Must run as root, i.e. sudo ./scriptname ошибки.

chmod 777 scriptname не помогает.

Я искал способы подражать sudo на Cygwin, чтобы добавить пользователя root, поскольку вызов "su" отображает ошибку su: user root does not exist, что-нибудь полезное, и ничего не нашел.

У кого-нибудь есть предложения?

Ответы [ 17 ]

0 голосов
/ 16 мая 2019

Основываясь на ответе @ mat-khor, я взял syswin su.exe, сохранил его как manufacture-syswin-su.exe и написал скрипт-обертку Он обрабатывает перенаправление команды stdout и stderr, поэтому его можно использовать в конвейере и т. Д. Кроме того, сценарий завершается со статусом данной команды.

Ограничения:

  • Параметры syswin-su в настоящее время жестко заданы для использования текущим пользователем. Добавление env USERNAME=... к вызову сценария отменяет его. Если бы потребовались другие параметры, сценарий должен был бы различать syswin-su и аргументы команды, например, расщепление на первом --.
  • Если запрос UAC отменен или отклонен, сценарий зависает.

.

#!/bin/bash
set -e

# join command $@ into a single string with quoting (required for syswin-su)
cmd=$( ( set -x; set -- "$@"; ) 2>&1 | perl -nle 'print $1 if /\bset -- (.*)/' )

tmpDir=$(mktemp -t -d -- "$(basename "$0")_$(date '+%Y%m%dT%H%M%S')_XXX")
mkfifo -- "$tmpDir/out"
mkfifo -- "$tmpDir/err"

cat >> "$tmpDir/script" <<-SCRIPT
    #!/bin/env bash
    $cmd > '$tmpDir/out' 2> '$tmpDir/err'
    echo \$? > '$tmpDir/status'
SCRIPT

chmod 700 -- "$tmpDir/script"

manufacture-syswin-su -s bash -u "$USERNAME" -m -c "cygstart --showminimized bash -c '$tmpDir/script'" > /dev/null &
cat -- "$tmpDir/err" >&2 &
cat -- "$tmpDir/out"
wait $!
exit $(<"$tmpDir/status")
0 голосов
/ 26 марта 2018

Я встретился с этим обсуждением, ища некоторые подробности о реализации sudo в разных операционных системах. Прочитав его, я обнаружил, что решение @ brian-white (https://stackoverflow.com/a/42956057/3627676) полезно, но его можно немного улучшить. Я избегал создания временного файла и реализован для выполнения всего одним скриптом.

Также я исследовал следующий шаг улучшения вывода в одном окне / консоли. К сожалению, безуспешно. Я попытался использовать именованные каналы для захвата STDOUT / STDERR и печати в главном окне. Но дочерний процесс не записывал в именованные каналы. Однако запись в обычный файл работает хорошо.

Я отбросил все попытки найти основную причину и оставил текущее решение как есть. Надеюсь, что мой пост может быть полезным.

Улучшения:

  • нет временного файла
  • без разбора и восстановления параметров командной строки
  • ждать повышенных команд
  • используйте mintty или bash, если первый не найден
  • вернуть код завершения команды

    #!/bin/bash

    # Being Administrators, invoke the command directly
    id -G | grep -qw 544 && {
        "$@"
        exit $?
    }

    # The CYG_SUDO variable is used to control the command invocation
    [ -z "$CYG_SUDO" ] && {
        mintty="$( which mintty 2>/dev/null )"
        export CYG_SUDO="$$"
        cygstart --wait --action=runas $mintty /bin/bash "$0" "$@"
        exit $?
    }

    # Now we are able to:
    # -- launch the command
    # -- display the message
    # -- return the exit code
    "$@"
    RETVAL=$?

    echo "$0: Press  to close window..."
    read

    exit $RETVAL

0 голосов
/ 11 июля 2016

Очень простой способ иметь оболочку cygwin и соответствующие дочерние оболочки для работы с правами администратора - это изменить свойства ссылки , которая открывает начальную оболочку.

Следующее действительно для Windows 7+ (возможно, и для предыдущих версий, но я не проверял)

Обычно я запускаю оболочку cygwin по ссылке cygwin в кнопке start (или на рабочем столе). Затем я изменил свойства cygwin-ссылки на вкладках

/ Совместимость / Уровень привилегий /

и поставил галочку,

«Запустить эту программу от имени администратора»

Это позволяет оболочке cygwin открываться с правами администратора и соответствующими вложенными оболочками.

0 голосов
/ 13 ноября 2013

Используйте это, чтобы получить окно администратора с запущенным bash или cmd из любого контекстного меню каталогов. Просто щелкните правой кнопкой мыши имя каталога и выберите запись или нажмите подсвеченную кнопку.

Это основано на инструменте chere и к сожалению не работающем ответе (для меня) от link_boy. У меня отлично работает с Windows 8,

Побочным эффектом является другой цвет в окне администратора cmd. Чтобы использовать это на bash, вы можете изменить файл .bashrc пользователя с правами администратора.

Я не могу запустить "фоновую" версию (щелкнуть правой кнопкой мыши в открытом каталоге). Не стесняйтесь добавлять это.

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash]
@="&Bash Prompt Here"
"Icon"="C:\\cygwin\\Cygwin.ico"

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash\command]
@="C:\\cygwin\\bin\\bash -c \"/bin/xhere /bin/bash.exe '%L'\""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash_root]
@="&Root Bash Prompt Here"
"Icon"="C:\\cygwin\\Cygwin.ico"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash_root\command]
@="runas /savecred /user:administrator \"C:\\cygwin\\bin\\bash -c \\\"/bin/xhere /bin/bash.exe '%L'\\\"\""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_cmd]
@="&Command Prompt Here"

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_cmd\command]
@="cmd.exe /k cd %L"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_cmd_root]
@="Roo&t Command Prompt Here"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_cmd_root\command]
@="runas /savecred /user:administrator \"cmd.exe /t:1E /k cd %L\""
0 голосов
/ 21 июля 2013

Как правило, у меня есть помощник реестра «Открыть здесь», чтобы открыть оболочку cygwin с административными привилегиями из любого места на моем компьютере.

Помните, что вам нужно иметьУстановлен пакет cygwin "chere", сначала используйте "chere -i -m" из привилегированной оболочки cygwin.

Предполагая, что ваша установка cygwin находится в C: \ cygwin ...

Вот код реестра:

Windows Registry Editor Version 5.00

[-HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash]

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash]
@="Open Cygwin Here as Root"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash\command]
@="c:\\cygwin\\bin\\mintty.exe -i /Cygwin-Terminal.ico -e /bin/xhere /bin/bash.exe"

[-HKEY_CLASSES_ROOT\Directory\Background\shell\cygwin_bash]

[HKEY_CLASSES_ROOT\Directory\Background\shell\cygwin_bash]
@="Open Cygwin Here as Root"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\Background\shell\cygwin_bash\command]
@="c:\\cygwin\\bin\\mintty.exe -i /Cygwin-Terminal.ico -e /bin/xhere /bin/bash.exe"

[-HKEY_CLASSES_ROOT\Drive\shell\cygwin_bash]

[HKEY_CLASSES_ROOT\Drive\shell\cygwin_bash]
@="Open Cygwin Here as Root"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Drive\shell\cygwin_bash\command]
@="c:\\cygwin\\bin\\mintty.exe -i /Cygwin-Terminal.ico -e /bin/xhere /bin/bash.exe"

Надеюсь, это поможет.Дайте мне знать, если это работает для вас.Спасибо.

PS: Вы можете захватить этот код, скопировать и вставить его и сохранить его в файле name.reg, чтобы запустить его ... или вы можете вручную добавить значения.

0 голосов
/ 11 декабря 2012

Не могу полностью протестировать это сам, у меня нет подходящего сценария, чтобы попробовать его, и я не эксперт по Linux, но вы можете взломать что-нибудь достаточно близко.

Я попробовал эти шаги, и они «кажутся» работающими, но не знаю, будет ли этого достаточно для ваших нужд.

Чтобы обойти отсутствие «корня»'user:

  • Создайте пользователя на локальном Windows-компьютере с именем root, сделайте его членом группы «Администраторы»
  • Отметьте bin / bash.exe как'Запуск от имени администратора для всех пользователей (очевидно, что вам придется включать и выключать его по мере необходимости)
  • Удерживая нажатой левую кнопку сдвига в проводнике Windows, одновременно щелкая правой кнопкой мыши файл Cygwin.bat
  • Выберите «Запуск от имени другого пользователя»
  • Введите. \ Root в качестве имени пользователя, а затем пароль.

После этого вы будете работать как пользователь с именем «root».'в cygwin, что в сочетании с «Запуск от имени администратора» в файле bash.exe может быть достаточно.

Однако вам все еще нужен sudo.

Я подделал это (и кто-то еще сбольше знаний о Linux, вероятно, может подделать это лучше), создав файл 'sudo' в / bin и usiС помощью этой командной строки вместо этого отправьте команду su:

su -c "$*"

Командная строка 'sudo vim' и другие, кажется, работают нормально для меня, поэтому вы можете попробовать ее.

Интересно узнать, работает ли это для ваших нужд или нет.

0 голосов
/ 20 октября 2012

Попробуйте:

chmod -R ug+rwx <dir>

где <dir> - каталог, в котором вы хочу поменять разрешения.

...