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