Пользователь root / эквивалент sudo в Cygwin? - PullRequest
151 голосов
/ 03 ноября 2010

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

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

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

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

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

Ответы [ 17 ]

209 голосов
/ 09 января 2014

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

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

47 голосов
/ 03 ноября 2010

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

21 голосов
/ 16 января 2016

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

alias sudo="cygstart --action=runas"

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

sudo chown User:Group <file>

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

sudo psexec -i -s -d cmd
9 голосов
/ 06 августа 2012

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

Требуется Python в Windows и Greenlet для модулей Python, а также Eventlet в Cygwin.

3 голосов
/ 22 марта 2017

Кажется, что 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
2 голосов
/ 17 декабря 2014

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

2 голосов
/ 14 апреля 2014

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

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

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

2 голосов
/ 14 августа 2013

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

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

1 голос
/ 23 января 2018

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

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

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

alias sudo="python3 /path-to-cygwin-sudo/cygwin-sudo.py"
1 голос
/ 29 марта 2013

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

Вот мои шаги.

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

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

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

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

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

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

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

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

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

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

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

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

Администратор : неиспользованный: 500: 503 : U- MACHINE \ Administrator , S-1-5-21-12345678-1234567890-1234567890- 500: / Главная / Администратор : / бен / Баш

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

корень : неиспользованный: 0: 0 : U- MACHINE \ корень , S-1-5-21-12345678-1234567890-1234567890- 0: / корень : / бен / Баш

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

...