Корневой пользователь / эквивалент 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 ответов


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

вот правильный способ повысить разрешения в 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

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

затем создайте общий " 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, ...]"

для exaxmple:

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

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


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

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

еще в Pre-Beta, но, похоже, работает.


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


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

вот мои шаги.

сначала вам нужно переименовать учетную запись администратора Windows в " root" Сделайте это, открыв start manu и набрав "gpedit.msc"

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

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

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

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

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

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

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

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

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

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

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

администратор:неиспользованный:500:503: U -машина\администратор, S-1-5-21-12345678-1234567890-1234567890- 500: / главная / администратор:/bin / bash

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

root:неиспользованный:0:0: U - машина\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 это!--5--> чтобы добавить безопасность и упростить настройку и использование. Проект доступен на 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 в старт кнопка (или рабочий стол). Затем я изменил свойства cygwin-link в tabs

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

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

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

Это позволяет оболочке 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 файл
  • выберите "Запуск от имени другого пользователя"
  • 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> - каталог, в котором вы хотите изменить разрешения.