Пользователь root / эквивалент sudo в Cygwin?


156

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

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

chmod 777 scriptname ничего не помогает

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

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


привет, КенБ, не могли бы вы дать нам более подробную информацию о whatсценарии, который вы пытаетесь запустить? В оболочке cygwin нет эквивалента sudo - права принадлежат пользователю win, запустившему оболочку cygwin, поэтому ссылка KyleWpppd хороша для избежания ошибок, таких как «неизвестная команда sudo». В вашем случае звучит так, как будто это специфическая проблема со скриптом, который вы хотите выполнить.
Стефано

1
Честно говоря, это давняя проблема, и я не помню, что это был за сценарий. Спасибо за интерес, хотя.
Кен Беллоуз

Ответы:


225

Я ответил на этот вопрос в SuperUser, но только после того, как OP проигнорировал бесполезный ответ, который был в то время единственным ответом на вопрос.

Вот правильный способ повышения разрешений в Cygwin, скопированный из моего собственного ответа на SuperUser:

Я нашел ответ в списке рассылки Cygwin . Для запуска commandс повышенными привилегиями в Cygwin, перед командой cygstart --action=runasвведите так:

$ cygstart --action=runas command

Откроется диалоговое окно Windows с запросом пароля администратора и запустите команду, если введен правильный пароль.

Это легко в сценарии, пока ~/binна вашем пути. Создайте файл ~/bin/sudoсо следующим содержанием:

#!/usr/bin/bash
cygstart --action=runas "$@"

Теперь сделайте файл исполняемым:

$ chmod +x ~/bin/sudo

Теперь вы можете запускать команды с реальными повышенными привилегиями :

$ sudo elevatedCommand

Возможно, вам придется добавить ~/binк вашему пути. Вы можете запустить следующую команду в Cygwin CLI или добавить ее в ~/.bashrc:

$ PATH=$HOME/bin:$PATH

Протестировано на 64-битной Windows 8.

Вы также можете вместо вышеуказанных шагов добавить псевдоним для этой команды ~/.bashrc:

# alias to simulate sudo
alias sudo='cygstart --action=runas'

12
Отличный ответ. С некоторыми изменениями в вашем bash-коде (ниже) я смог запустить команду с повышенными правами из командной строки. Вот изменение, которое мне нужно, чтобы ваш код работал: cat << 'EOF' > ~/bin/sudo\n #!/usr/bin/bash\n cygstart --action=runas "$@"\n EOF (я не могу понять, как вставить новые строки в этом комментарии, поэтому я добавил '\ n' в код). Остальное с PATH = ... и далее хорошо ,
josmith42

3
О, я вижу! Если я не ошибаюсь, это ваш способ записи файла на диск вместо открытия текстового редактора. Приятно спасибо! Я не знал, как использовать heredocs в Bash!
dotancohen

8
Проблема в том, что он создает совершенно новое окно терминала (обычно conhost). Выход не встроен в текущий терминал.
CMCDragonkai

1
Единственный способ запустить такие вещи ls- это обернуть их в длительный процесс, такой как mintty, bash или zsh. Но все это появляется в отдельном терминале. Который на данный момент, я мог бы просто открыть его через графический интерфейс с помощью ConEMU.
CMCDragonkai

1
Без кавычек даже аргументы в кавычках снова разделяются на пробелы, @katriel. С кавычками, "$@"расширяется до чего-то вроде "$1" "$2" "$3" ...и без, $@расширяется до $1 $2 $3....
Palec

51

Вам, вероятно, нужно запустить оболочку cygwin с правами администратора. Вы можете щелкнуть правой кнопкой мыши ярлык и выбрать запуск от имени администратора или перейти в свойства ярлыка и проверить его в разделе совместимости. Только остерегайтесь .... root-права могут быть опасными.


1
За три года, прошедшие с тех пор, как этот вопрос был задан без хорошего ответа, в отличие от этого обходного пути, я нашел правильный способ повышения разрешений для одной команды в существующем окне Cygwin в ответе ниже. Таким образом, он работает так же, как sudoв Linux.
dotancohen

Работал у меня на Win10 64. Пришлось сменить владельца файлов, скачанных с сервера с помощью rsync. chown --changes --verbose --recursive [USER] /cygdrive/c/[PATH TO FOLDER]/*, Без этого я не мог получить доступ к rsynced папкам и файлам.
lowtechsun

25

Основываясь на ответе dotancohen, я использую псевдоним:

alias sudo="cygstart --action=runas"

Работает как брелок:

sudo chown User:Group <file>

И если у вас установлен SysInternals, вы даже можете легко запустить командную оболочку как системный пользователь

sudo psexec -i -s -d cmd

9

Я нашел sudo-for-cygwin , возможно, это сработает, это клиент-серверное приложение, использующее скрипт python для порождения дочернего процесса в windows (pty) и связывающее tty пользователя и процесс ввода / вывода.

Требуется python в windows и модули Python greenlet, а также eventlet в Cygwin.


Я использую это некоторое время, и это событие обрабатывает такие интерактивные вещи, как нано, без проблем!
MemphiZ


4

Кажется, что cygstart/runasон не обрабатывает должным образом, "$@"и поэтому команды, которые имеют аргументы, содержащие пробелы (и, возможно, другие метасимволы оболочки - я не проверял), не будут работать правильно.

Я решил просто написать небольшой sudoскрипт, который работает, написав временный скрипт, который правильно выполняет параметры.

#! /bin/bash

# If already admin, just run the command in-line.
# This works on my Win10 machine; dunno about others.
if id -G | grep -q ' 544 '; then
   "$@"
   exit $?
fi

# cygstart/runas doesn't handle arguments with spaces correctly so create
# a script that will do so properly.
tmpfile=$(mktemp /tmp/sudo.XXXXXX)
echo "#! /bin/bash" >>$tmpfile
echo "export PATH=\"$PATH\"" >>$tmpfile
echo "$1 \\" >>$tmpfile
shift
for arg in "$@"; do
  qarg=`echo "$arg" | sed -e "s/'/'\\\\\''/g"`
  echo "  '$qarg' \\" >>$tmpfile
done
echo >>$tmpfile

# cygstart opens a new window which vanishes as soon as the command is complete.
# Give the user a chance to see the output.
echo "echo -ne '\n$0: press <enter> to close window... '" >>$tmpfile
echo "read enter" >>$tmpfile

# Clean up after ourselves.
echo "rm -f $tmpfile" >>$tmpfile

# Do it as Administrator.
cygstart --action=runas /bin/bash $tmpfile

1
Принятый ответ не работал для меня на Win7, но этот ответ работал как шарм. Я смог настроить exim-config с повышенными привилегиями и затем vim-edit файла /etc/exim.conf. Slick.
nanker

2

Этот ответ основан на другом ответе . Прежде всего, убедитесь, что ваша учетная запись находится в группе администраторов.

Затем создайте общий файл «runas-admin.bat» со следующим содержимым:

@if (1==1) @if(1==0) @ELSE
@echo off&SETLOCAL ENABLEEXTENSIONS
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"||(
    cscript //E:JScript //nologo "%~f0" %*
    @goto :EOF
)
FOR %%A IN (%*) DO (
    "%%A"
)
@goto :EOF
@end @ELSE
args = WScript.Arguments;
newargs = "";
for (var i = 0; i < args.length; i++) {
    newargs += "\"" + args(i) + "\" ";
}
ShA=new ActiveXObject("Shell.Application");
ShA.ShellExecute("cmd.exe","/c \""+WScript.ScriptFullName+" "+newargs+"\"","","runas",5);
@end

Затем выполните командный файл следующим образом:

./runas-admin.bat "<command1> [parm1, parm2, ...]" "<command2> [parm1, parm2, ...]"

Например:

./runas-admin.bat "net localgroup newgroup1 /add" "net localgroup newgroup2 /add"

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


2

Новое предложение по улучшению SUDO для CygWin от GitHub в этой теме под названием TOUACExt :

  • Автоматически открывает sudoserver.py.
  • Автоматически закрывает sudoserver.py после тайм-аута (по умолчанию 15 минут).
  • Запросить запрос на повышение прав UAC для пользователей с правами администратора.
  • Запросите имя пользователя / пароль администратора для пользователей без прав администратора.
  • Работает удаленно (SSH) с учетными записями администратора.
  • Создает журнал.

Все еще в Pre-Beta , но, кажется, работает.


1

Я попал сюда через Google, и я действительно считаю, что нашел способ получить полнофункциональный root-запрос в Cygwin.

Вот мои шаги.

Сначала вам нужно переименовать учетную запись администратора Windows в «root». Для этого откройте man start и введите «gpedit.msc».

Измените запись в разделе Политика локального компьютера> Конфигурация компьютера> Параметры Windows> Параметры безопасности> Локальные политики> Параметры безопасности> Учетные записи: переименовать учетную запись администратора

Тогда вам придется включить учетную запись, если она еще не включена. Политика локального компьютера> Конфигурация компьютера> Параметры Windows> Параметры безопасности> Локальные политики> Параметры безопасности> Учетные записи: состояние учетной записи администратора

Теперь выйдите и войдите в учетную запись root.

Теперь установите переменную окружения для cygwin. Чтобы сделать это простым способом: щелкните правой кнопкой мыши Мой компьютер> Свойства

Нажмите (на левой боковой панели) «Расширенные настройки системы»

В нижней части нажмите кнопку «Переменные среды»

В разделе «Системные переменные» нажмите кнопку «Создать ...»

Для названия поставьте «cygwin» без кавычек. В качестве значения введите в корневой каталог cygwin. (Мой был C: \ Cygwin)

Нажмите OK и закройте все это, чтобы вернуться на рабочий стол.

Откройте терминал Cygwin (cygwin.bat)

Отредактируйте файл / etc / passwd и измените строку

Администратор : не используется: 500: 503 : U- MACHINE \ Администратор , S-1-5-21-12345678-1234567890-1234567890- 500: / home / Администратор : / bin / bash

На это (ваши номера и имя машины будут другими, просто убедитесь, что вы изменили выделенные номера на 0!)

root : не используется: 0: 0 : U- MACHINE \ root , S-1-5-21-12345678-1234567890-1234567890- 0: / root : / bin / bash

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

Запустите эту команду в cygwin, чтобы завершить сделку.

mv /bin/su.exe /bin/_su.exe_backup
cat > /bin/su.bat << "EOF"
@ECHO OFF
RUNAS /savecred /user:root %cygwin%\cygwin.bat
EOF
ln -s /bin/su.bat /bin/su
echo ''
echo 'All finished'

Выйдите из учетной записи root и вернитесь в свою обычную учетную запись Windows.

После всего этого, запустите новый su.bat вручную, дважды щелкнув по нему в проводнике. Введите свой пароль и идите вперед и закройте окно.

Теперь попробуйте запустить команду su из cygwin и посмотрите, все ли работает нормально.


1

Будучи недовольным доступным решением, я принял скрипт nu774, чтобы повысить безопасность и упростить его настройку и использование. Проект доступен на Github

Чтобы использовать его, просто скачайте cygwin-sudo.pyи запустите его через python3 cygwin-sudo.py **yourcommand**.

Вы можете настроить псевдоним для удобства:

alias sudo="python3 /path-to-cygwin-sudo/cygwin-sudo.py"

0

Используйте это, чтобы получить окно администратора с запущенным 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

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

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

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

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

и проверил поле,

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

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


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

0

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

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

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

Улучшения:

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

    # Будучи администраторами, вызывайте команду напрямую
    id -G | grep -qw 544 && {
        "$ @"
        выход $?
    }

    # Переменная CYG_SUDO используется для управления вызовом команды
    [-z "$ CYG_SUDO"] && {
        mintty = "$ (который mintty 2> / dev / null)"
        export CYG_SUDO = "$$"
        cygstart --wait --action = runas $ mintty / bin / bash "$ 0" "$ @"
        выход $?
    }

    # Теперь мы можем:
    # - запустить команду
    # - показать сообщение
    # - вернуть код выхода
    "$ @"
    RETVAL = $?

    echo "$ 0: нажмите, чтобы закрыть окно ..."
    читать

    выход $ RETVAL


Как cygstart --wait --action=runas $mintty /bin/bash "$0" "$@"не ломается, если в аргументе есть пробелы? Это всегда было для меня при прохождении таких через cygstart / runas.
Брайан Уайт

0

Основываясь на ответе @ 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")

-1

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

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

Чтобы обойти отсутствие «пользователя root»:

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

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

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

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

su -c "$*"

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

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


-1

Что я обычно делаю, так это помощника реестра «Открыть здесь», чтобы открыть оболочку 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, чтобы запустить его ... или вы можете вручную добавить значения.


-5

Пытаться:

chmod -R ug+rwx <dir>

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


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