Корневой пользователь / эквивалент sudo в Cygwin?


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

Я Must run as root, i.e. sudo ./scriptname ошибки.

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

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

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

16 142

16 ответов:

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

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

Я нашел ответ на список рассылки 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.

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

дом на dotancohen это Я использую псевдоним:

alias sudo="cygstart --action=runas"

работает как шарм:

sudo chown User:Group <file>

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

для этого требуется python в windows и Python модули greenlet, и eventlet в Cygwin.

кажется,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 " \" >>$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: 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

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

далее создать общий "Запуск от имени администратора.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 только один раз, используя этот метод и это процедура была обобщена, так что вы можете использовать любой вид команды.

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

  • автоматически открывается sudoserver.py.
  • автоматически закрывается sudoserver.py после тайм-аута (15 минут по умолчанию).
  • запрос контроля учетных записей, запрос на повышение Прав Да/Нет стиль для пользователей администратора.
  • запрос пользователя/пароля администратора для пользователей, не являющихся администраторами.
  • работает удаленно (SSH) с учетными записями администратора.
  • создает бревно.

еще в Пре-Бета, но, кажется, работает.

или установите пакет syswin, который включает порт su для cygwin:http://sourceforge.net/p/manufacture/wiki/syswin-su/

Я приземлился здесь через google, и я действительно считаю, что нашел способ получить полностью функционирующий корневой promt в cygwin.

вот мои шаги.

сначала вам нужно переименовать учетную запись администратора Windows в " root" Этого Откройте Пуск и введите "команду gpedit.msc"

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

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

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

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

нажмите (на левой боковой панели) "расширенная система настройки"

внизу Нажмите кнопку "Переменные среды"

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

для имени ставим "cygwin" без кавычек. Для этого введите значение в корневой каталог cygwin. ( Мой был C:\cygwin )

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

откройте терминал Cygwin (cygwin.летучая мышь)

редактировать файл / etc / passwd и изменить линия

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

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

root: не используется:0:0и машина\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 и посмотреть, все ли в порядке.

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

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

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

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

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

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

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

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

/Совместимость/Уровень Прав Доступа/

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

"выполнить эту программу от имени администратора"

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

Я встретил эту дискуссию, ища некоторые детали на 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 "" "$@"
        exit $?
    }

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

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

    exit $RETVAL

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

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

чтобы обойти отсутствие пользователя 'root':

  • создайте пользователя на локальной машине windows под названием "root", сделайте его членом группы "администраторы"
  • Марк бин/Баш.exe как "Запуск от имени администратора" для всех пользователей (очевидно, вам придется включить/выключить это, как и когда вам это нужно)
  • удерживая нажатой левую кнопку shift в проводнике windows, щелкните правой кнопкой мыши на Cygwin.bat file
  • выберите "Запуск от имени другого пользователя"
  • Enter .корень \как имя пользователя и пароль.

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

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

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

su -c "$*"

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

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

то, что я обычно делаю, - это помощник реестра "открыть здесь", чтобы открыть оболочку 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: вы можете захватить этот код, скопировать и вставить его и сохранить его в имени.reg-файл, чтобы запустить его... или вы можете вручную добавить значения.

попробуй:

chmod -R ug+rwx <dir>

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