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