Користувач / еквівалент sudo в Cygwin?


156

Я намагаюся запустити сценарій bash в Cygwin.

Я отримую Must run as root, i.e. sudo ./scriptnameпомилки.

chmod 777 scriptname нічого не допомагає.

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

У когось є якісь пропозиції?


привіт, КенБ, ти можеш дати нам детальніше про whatсценарій, який ти намагаєшся запустити? Всередині оболонки cygwin немає еквівалента "sudo" - права належать користувачеві win, який запустив оболонку cygwin, тому посилання KyleWpppd добре уникати помилок, таких як "команда sudo unknown". У вашому випадку звучить так, що це певна проблема зі сценарієм, який ви хочете виконати.
Стефано

1
Чесно кажучи, це давно минуле питання, і я насправді не пам'ятаю, яким був сценарій. Дякую за інтерес, хоча.
Кен Беллоуз

Відповіді:


225

Я відповів на це запитання на 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до свого шляху. Ви можете запустити таку команду в CLI Cygwin або додати її до ~/.bashrc:

$ PATH=$HOME/bin:$PATH

Тестується на 64-розрядної Windows 8.

Ви також можете замість вищезазначених кроків додати псевдонім для цієї команди для ~/.bashrc:

# alias to simulate sudo
alias sudo='cygstart --action=runas'

12
Відмінна відповідь. З деякими налаштуваннями вашого bash-коду (нижче) я зміг запустити підвищену команду з командного рядка. Ось зміни, які мені знадобилися, щоб ваш код працював: cat << 'EOF' > ~/bin/sudo\n #!/usr/bin/bash\n cygstart --action=runas "$@"\n EOF (Я не можу зрозуміти, як вставити нові рядки в цей коментар, тому я додав до коду '\ n'). Решта від PATH = ... далі добре .
josmith42

3
О Я бачу! Якщо я не помиляюся, це ваш спосіб запису файлу на диск, а не відкриття текстового редактора. Приємно, дякую! Я не знав, як використовувати гередоки в Баші!
dotancohen

8
Проблема в цьому полягає в тому, що він створює абсолютно нове вікно терміналу (як правило, конгост). Вихід не вкладений в поточний термінал.
CMCDragonkai

1
Єдиний спосіб запускати такі речі - lsце загорнути їх у тривалий процес, наприклад, м'ята, башш або також zsh. Але все це з’являється в окремому терміналі. Що в цей момент я міг би просто відкрити його через GUI за допомогою ConEMU.
CMCDragonkai

1
Без лапок, навіть цитовані аргументи знову розділяються пробілами, @katriel. З цитатами "$@"розширюється на щось на кшталт "$1" "$2" "$3" ...і без, $@розширюється на $1 $2 $3....
Палець

51

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


1
За три роки, відколи це питання було задано без гарної відповіді, на відміну від цього вирішення, я знайшов правильний спосіб збільшити дозволи для однієї команди у існуючому вікні Cygwin у відповіді нижче. Таким чином, він працює точно так само, як і sudoв Linux.
dotancohen

Працював для мене на Win10 64. Довелося змінити право власності на файли, завантажені з сервера з rsync. chown --changes --verbose --recursive [USER] /cygdrive/c/[PATH TO FOLDER]/*. Без нього я не міг отримати доступ до rsynced папок і файлів.
lowtechsun

25

Спираючись на відповідь dotancohen, я використовую псевдонім:

alias sudo="cygstart --action=runas"

Працює як шарм:

sudo chown User:Group <file>

І якщо у вас встановлений SysInternals, ви навіть можете легко запустити командну оболонку як користувач системи дуже легко

sudo psexec -i -s -d cmd

9

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

Для цього потрібні python у windows та модулі Python greenlet та eventlet у Cygwin.


Я використовую це деякий час зараз, і подія без проблем обробляє інтерактивні речі, такі як nano!
MemphiZ


4

Здається, що 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

1
прийнята відповідь не працювала для мене на Win7, але ця відповідь спрацювала як шарм. Мені вдалося встановити exim-config з підвищеними privs і потім vim-редагувати файл /etc/exim.conf. Гладкий.
nanker

2

Ця відповідь заснована на іншій відповіді . Перш за все, переконайтеся, що ваш обліковий запис у групі Адміністратори.

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


2

Нова пропозиція щодо вдосконалення SUDO для CygWin від GitHub у цій темі під назвою TOUACExt :

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

Ще в Pre-Beta , але, здається, працює.


1

Я приземлився сюди через Google, і я фактично вважаю, що знайшов спосіб отримати повністю функціонуючу кореневу промову в cygwin.

Ось мої кроки.

Спочатку потрібно перейменувати обліковий запис адміністратора Windows у "root". Зробіть це, відкривши start manu і ввівши "gpedit.msc"

Відредагуйте запис у розділі Локальна комп’ютерна політика> Конфігурація комп'ютера> Налаштування Windows> Налаштування безпеки> Локальна політика> Параметри безпеки> Облікові записи: Перейменуйте обліковий запис адміністратора

Тоді вам доведеться ввімкнути обліковий запис, якщо він ще не ввімкнено. Локальна комп’ютерна політика> Конфігурація комп'ютера> Налаштування Windows> Налаштування безпеки> Локальна політика> Параметри безпеки> Облікові записи: стан облікового запису адміністратора

Тепер вийдіть та увійдіть у кореневий рахунок.

Тепер встановіть змінну середовища для cygwin. Для цього простий спосіб: Клацніть правою кнопкою миші Мій комп'ютер> Властивості

Клацніть (на лівій бічній панелі) "Розширені налаштування системи"

Унизу натисніть кнопку "Змінні середовища"

У розділі "Змінні системи" натисніть кнопку "Створити ..."

Для назви поставте "cygwin" без лапок. Для значення введіть у свою кореневу директорію cygwin. (Моя була С: \ cygwin)

Натисніть OK і закрийте все це, щоб повернутися на робочий стіл.

Відкрийте термінал Cygwin (cygwin.bat)

Відредагуйте файл / etc / passwd та змініть рядок

Адміністратор : невикористаний: 500: 503 : U- MACHINE \ Administrator , S-1-5-21-12345678-1234567890-1234567890- 500: / home / Administrator : / bin / bash

До цього (ваші номери та назва машини будуть різними, просто переконайтеся, що ви помітили виділені цифри на 0!)

корінь : невикористаний: 0: 0 : U- МАШИНА \ корінь , S-1-5-21-12345678-1234567890-1234567890- 0: / root : / bin / bash

Тепер, коли все закінчено, цей наступний біт змусить команду "су" працювати. (Не ідеально, але він буде достатньо функціонувати. Я не думаю, що сценарії будуть функціонувати коректно, але ей, це ви далеко отримали, можливо, ви зможете знайти спосіб. І будь ласка, поділіться)

Виконайте цю команду в 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'

Вийдіть із кореневого облікового запису та поверніться у звичайний обліковий запис користувача Windows.

Після всього цього, запустіть новий "su.bat" вручну, двічі клацнувши його в провіднику. Введіть свій пароль та йдіть уперед та закрийте вікно.

Тепер спробуйте запустити команду su від cygwin і подивіться, чи все спрацювало добре.


1

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

Щоб використовувати його, просто завантажте cygwin-sudo.pyта запустіть його через python3 cygwin-sudo.py **yourcommand**.

Ви можете налаштувати псевдонім для зручності:

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

0

Використовуйте це, щоб отримати вікно адміністратора з запущеним 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\""

0

Дуже простий спосіб мати оболонку cygwin та відповідні підрозділи для роботи з правами адміністратора - це змінити властивості посилання, що відкриває початкову оболонку.

Наступне дійсне для Windows 7+ (можливо, і для попередніх версій, але я не перевіряв)

Зазвичай я запускаю оболонку cygwin із cygwin-посилання у кнопці пуску (або на робочому столі). Потім я змінив властивості cygwin-ланки на вкладках

/ Сумісність / Рівень привілеїв /

і встановив прапорець,

"Запустити цю програму як адміністратор"

Це дозволяє оболонці cygwin відкриватися також з правами адміністратора та відповідними підрозділами.


Єдина незначна проблема полягає в тому, що ви не можете сказати, чи він відкритий як адміністратор.
Едвін Пратт

0

Я зустрів цю дискусію, шукаючи деякі деталі щодо sudoвпровадження в різних операційних системах. Читаючи це, я виявив, що рішення @ brian-white ( https://stackoverflow.com/a/42956057/3627676 ) корисне, але його можна трохи покращити. Я уникав створювати тимчасовий файл і реалізовувався для виконання всього за допомогою одного сценарію.

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

Я відмовився від будь-яких спроб знайти першопричину і залишив поточне рішення таким, яким є. Сподіваюся, моя публікація також може бути корисною.

Покращення:

  • немає тимчасового файлу
  • немає розбору та відновлення параметрів командного рядка
  • дочекайтеся підвищеної команди
  • використовувати minttyабо bash, якщо першого не знайдено
  • повернути код виходу команди
    #! / бін / баш

    # Будучи адміністраторами, викликайте команду безпосередньо
    id -G | grep -qw 544 && {
        "$ @"
        вихід $?
    }

    # Змінна CYG_SUDO використовується для управління викликом команд
    [-z "$ CYG_SUDO"] && {
        mintty = "$ (яка м'ята 2> / dev / null)"
        export CYG_SUDO = "$$"
        cygstart --wait --action = runas $ mintty / bin / bash "$ 0" "$ @"
        вихід $?
    }

    # Тепер ми можемо:
    # - запустити команду
    # - відобразити повідомлення
    # - повернути код виходу
    "$ @"
    RETVAL = $?

    echo "$ 0: Натисніть, щоб закрити вікно ..."
    читати

    вихід $ RETVAL


Як cygstart --wait --action=runas $mintty /bin/bash "$0" "$@"не порушується, якщо в аргументі є пробіли? Це завжди робилося для мене при проходженні таких через cygstart / runas.
Брайан Уайт

0

На основі відповіді @ mat-khor я взяв syswin su.exe, зберег його як manufacture-syswin-su.exeі написав цей сценарій обгортки. Він обробляє перенаправлення stdout та stderr команди, тому його можна використовувати в трубі тощо. Також сценарій виходить зі статусом даної команди.

Обмеження:

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

.

#!/bin/bash
set -e

# join command $@ into a single string with quoting (required for syswin-su)
cmd=$( ( set -x; set -- "$@"; ) 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")

-1

Я не можу повністю перевірити це сам, у мене немає відповідного сценарію, щоб його випробувати, і я не є експертом Linux, але ви, можливо, зможете зламати щось досить близько.

Я спробував ці кроки, і вони, здається, спрацюють, але не знаю, чи вистачить це для ваших потреб.

Щоб подолати відсутність користувача «root»:

  • Створіть користувача на машині LOCAL Windows під назвою «root», зробіть його членом групи «Адміністратори»
  • Позначте bin / bash.exe як "Запустити як адміністратор" для всіх користувачів (очевидно, вам доведеться це вмикати / вимикати як і коли це потрібно)
  • Утримуючи ліву кнопку зсуву в Провіднику Windows, клацнувши правою кнопкою миші на файл Cygwin.bat
  • Виберіть "Запустити як інший користувач"
  • Введіть. \ Root як ім'я користувача, а потім свій пароль.

Потім це запускає вас як користувача, який називається 'root' у cygwin, що в поєднанні з 'Запустити як адміністратор' у файлі bash.exe може бути достатньо.

Однак ви все ще потребуєте судо.

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

su -c "$*"

Командний рядок 'sudo vim' та інші, здається, спрацюють нормально для мене, тому ви можете спробувати його випробувати.

Будьте зацікавлені, щоб дізнатися, чи працює це для ваших потреб чи ні.


-1

Зазвичай я - це помічник реєстру "Відкрити тут", щоб відкрити оболонку 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: Ви можете захопити цей код, скопіювати та вставити його та зберегти його у файлі name.reg, щоб запустити його ... або ви можете вручну додати значення.


-5

Спробуйте:

chmod -R ug+rwx <dir>

де <dir>каталог, в якому потрібно змінити дозволи.


5
Як це зробить його корінням, як він запитує?
Nikana Reklawyks
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.