Корневой пользователь/эквивалент 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-Betastrong > , но, похоже, работает.
Ответ 8
Или установите пакет syswin, который включает порт su для cygwin: http://sourceforge.net/p/manufacture/wiki/syswin-su/
Ответ 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>
- это каталог, на котором вы
хотите изменить разрешения.