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

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

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

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

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

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

Ответ 1

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

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

Я нашел ответ на список рассылки cygwin. Чтобы запустить command с повышенными привилегиями в Cygwin, перед командой cygstart --action=runas выполните следующие действия:

$ cygstart --action=runas command

Это откроет диалоговое окно Windows с запросом пароля администратора и запустит команду, если введен правильный пароль.

Это легко выполнить сценарий, если ~/bin находится на вашем пути. Создайте файл ~/bin/sudo со следующим содержимым:

#!/usr/bin/bash
cygstart --action=runas "[email protected]"

Теперь сделайте исполняемый файл:

$ chmod +x ~/bin/sudo

Теперь вы можете запускать команды с реальными повышенными привилегиями:

$ sudo elevatedCommand

Вам может потребоваться добавить ~/bin к вашему пути. Вы можете запустить следующую команду в CLI Cygwin или добавить ее в ~/.bashrc:

$ PATH=$HOME/bin:$PATH

Протестировано на 64-битной Windows 8.

Ответ 2

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

Ответ 3

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

alias sudo="cygstart --action=runas"

Работает как брелок:

sudo chown User:Group <file>

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

sudo psexec -i -s -d cmd

Ответ 4

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

Для этого требуется python в окнах, а также в пакетах модулей Python и eventlet в Cygwin.

Ответ 5

Кажется, что cygstart/runas неправильно обрабатывает "[email protected]", и поэтому команды, содержащие аргументы, содержащие пробелы (и, возможно, другие метасимволы оболочки - я не проверял), будут работать неправильно.

Я решил написать небольшой sudo script, который работает, написав временный script, который правильно выполняет параметры.

#! /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
   "[email protected]"
   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 "[email protected]"; 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

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 9

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

Вот мои шаги.

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

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

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

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

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

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

Рядом с нижним нажмите кнопку "Переменные среды"

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

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

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

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

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

Администратор: неиспользованный: 500: 503: U- МАШИНА\Администратор S-1-5-21-12345678-1234567890- 1234567890- 500:/Главная/Администратор:/bin/bash

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

корень: неиспользованный: 0: 0: U- МАШИНА\корень S-1-5-21-12345678-1234567890- 1234567890- 0:/корень:/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 и посмотреть, все ли в порядке.

Ответ 10

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

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

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

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

Ответ 11

Используйте это, чтобы получить окно администратора с помощью bash или cmd, из любого контекста контекста каталогов. Просто щелкните правой кнопкой мыши по имени каталога и выберите запись или нажмите кнопку с подсветкой.

Это основано на инструменте chere и, к сожалению, не работает ответ (для меня) из link_boy. Он отлично работает для меня, используя Windows 8,

Побочным эффектом является другой цвет в окне cmd admin. Чтобы использовать это в bash, вы можете изменить файл .bashrc для пользователя admin.

Я не могу получить "фоновый" вариант (щелкнуть правой кнопкой мыши в открытом каталоге) для запуска. Не стесняйтесь добавлять его.

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\""

Ответ 12

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

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

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

/Совместимость/Уровень привилегий /

и отметьте флажок,

"Запустите эту программу как администратор"

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

Ответ 13

Я встретился с этим обсуждением в поисках некоторых деталей о реализации sudo в разных операционных системах. Прочитав его, я обнаружил, что решение @brian-white (fooobar.com/questions/46883/...) полезно, но его можно немного улучшить. Я избегал создания временного файла и реализовал все для выполнения одним скриптом.

Также я исследовал следующий шаг улучшения вывода в одном окне/консоли. К сожалению, безуспешно. Я попытался использовать именованные каналы для захвата STDOUT/STDERR и печати в главном окне. Но дочерний процесс не записывал в именованные каналы. Однако запись в обычный файл работает хорошо.

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

Улучшения:

  • нет временного файла
  • нет разбора и восстановления параметров командной строки
  • подождите повышенную команду
  • используйте mintty или bash, если первый не найден
  • вернуть код завершения команды
    #!/bin/bash

    # Being Administrators, invoke the command directly
    id -G | grep -qw 544 && {
        "[email protected]"
        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 "$0" "[email protected]"
        exit $?
    }

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

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

    exit $RETVAL

Ответ 14

Основываясь на ответе @mat-khor, я взял syswin su.exe, сохранил его как manufacture-syswin-su.exe и написал этот скрипт-обертку. Он обрабатывает перенаправление команд stdout и stderr, поэтому его можно использовать в конвейере и т.д. Кроме того, сценарий завершается со статусом данной команды.

Ограничения:

  • Параметры syswin-su в настоящее время жестко заданы для использования текущим пользователем. Предшествующий env USERNAME=... к вызову сценария отменяет его. Если бы потребовались другие параметры, сценарий должен был бы различать syswin-su и аргументы команды, например, разделение в первом --.
  • Если запрос UAC отменен или отклонен, сценарий зависает.

,

#!/bin/bash
set -e

# join command [email protected] into a single string with quoting (required for syswin-su)
cmd=$( ( set -x; set -- "[email protected]"; ) 2>&1 | perl -nle 'print $1 if /\bset -- (.*)/' )

tmpDir=$(mktemp -t -d -- "$(basename "$0")_$(date '+%Y%m%dT%H%M%S')_XXX")
mkfifo -- "$tmpDir/out"
mkfifo -- "$tmpDir/err"

cat >> "$tmpDir/script" <<-SCRIPT
    #!/bin/env bash
    $cmd > '$tmpDir/out' 2> '$tmpDir/err'
    echo \$? > '$tmpDir/status'
SCRIPT

chmod 700 -- "$tmpDir/script"

manufacture-syswin-su -s bash -u "$USERNAME" -m -c "cygstart --showminimized bash -c '$tmpDir/script'" > /dev/null &
cat -- "$tmpDir/err" >&2 &
cat -- "$tmpDir/out"
wait $!
exit $(<"$tmpDir/status")

Ответ 15

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

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

Чтобы обойти отсутствие пользователя root,

  • Создайте пользователя на локальном компьютере Windows с именем "root", сделайте его членом группы "Администраторы"
  • Отметьте bin/ bash.exe как "Запуск от имени администратора" для всех пользователей (очевидно, вам нужно будет включить или выключить его по мере необходимости)
  • Удерживайте левую кнопку сдвига в проводнике Windows, щелкая правой кнопкой мыши по файлу Cygwin.bat.
  • Выберите "Выполнить как другой пользователь"
  • Введите. \root как имя пользователя, а затем пароль.

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

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

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

su -c "$*"

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

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

Ответ 16

То, что я обычно делаю, это иметь помощник реестра "Открыть здесь", чтобы открыть оболочку cygwin с правами администратора довольно легко из любого места на моем компьютере.

Имейте в виду, что вы должны установить пакет cygwin "chere", сначала используйте "chere -i -m" из повышенной кигинированной оболочки.

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

Ответ 17

Попробуйте:

chmod -R ug+rwx <dir>

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