Cygwinでのrootユーザー/ sudoの同等物?


156

Cygwinでbashスクリプトを実行しようとしています。

Must run as root, i.e. sudo ./scriptnameエラーが発生します。

chmod 777 scriptname 助けには何もしません。

Cysuでsudoを模倣する方法、ルートユーザーを追加する方法を探しました。 "su"を呼び出すとエラーが表示されsu: user root does not exist、何も有用で何も見つかりません。

誰か提案がありますか?


こんにちは、KenBさん、what実行しようとしているスクリプトの詳細を教えてください。cygwinシェル内には「sudo」に相当するものはありません-権利はcygwinシェルを起動したwinユーザーからのものであるため、KyleWpppdリンクは「sudo unknown command」などのエラーを回避するのに適しています。あなたの場合、それはあなたが実行したいスクリプトの特定の問題であるように聞こえます。
Stefano

1
正直なところ、これはずっと前の問題であり、実際にスクリプトが何であったか覚えていません。関心をお寄せいただきありがとうございます。
ケンベローズ、2011

回答:


225

私はSuperUserでこの質問に回答しましたが、OPがその質問に対する唯一の回答であった役に立たなかった回答を無視した後にのみ。

これは、Cygwinで権限を昇格させる適切な方法です。これは、SuperUserに関する私の独自の回答からコピーされたものです。

Cygwinメーリングリストで答えを見つけました。commandCygwinで管理者特権で実行するには、コマンドの前に次の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でテスト済み。

上記の手順の代わりに、このコマンドのエイリアスを次のように追加することもできます~/.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 2014年

3
ああなるほど!私が間違っていないのであれば、それはテキストエディタを開く代わりに、ファイルをディスクに書き込む方法です。いいね、ありがとう!Bashでヒアドキュメントを使用する方法がわかりませんでした。
dotancohen 2014年

8
この問題は、まったく新しいターミナルウィンドウ(通常はconhost)を作成することです。出力は現在の端末にインライン化されません。
CMCDragonkai 2016

1
のようなものを実行する唯一の方法lsは、mintty、bash、またはzshのような長時間実行プロセスにラップすることです。しかし、それはすべて別の端末に表示されます。この時点で、ConEMUを使用してGUIでそれを開くことができたはずです。
CMCDragonkai 2016

1
引用符がないと、引用符で囲まれた引数もスペースで分割されます(@katriel)。引用符を"$@"付けると、次のようなもの"$1" "$2" "$3" ...$@拡張され$1 $2 $3...ます。
Palec、2016年

51

おそらく、管理者としてcygwinシェルを実行する必要があります。ショートカットを右クリックして[管理者として実行]をクリックするか、ショートカットのプロパティに移動して、互換性セクションで確認できます。注意してください...ルート権限は危険な場合があります。


1
この回避策とは対照的に、この質問が適切な回答なしで行われてから3年間、私は以下の回答で現存するCygwinウィンドウ単一のコマンドの権限を上げる正しい方法を見つけました。したがって、sudoLinuxとまったく同じように機能します。
dotancohen 2014年

Win10 64で私のために働きました。rsyncを使用してサーバーからダウンロードしたファイルの所有権を変更する必要がありました。chown --changes --verbose --recursive [USER] /cygdrive/c/[PATH TO FOLDER]/*。それがなければ、rsyncされたフォルダーとファイルにアクセスできませんでした。
lowtechsun 2018

25

上に構築さdotancohenの答え私は、エイリアスを使用しています:

alias sudo="cygstart --action=runas"

魅力として働く:

sudo chown User:Group <file>

SysInternalsがインストールされている場合は、システムユーザーとしてコマンドシェルを簡単に起動することもできます。

sudo psexec -i -s -d cmd

9

私はsudo-for-cygwinを見つけました、多分これはうまくいくでしょう、それはpythonスクリプトを使用してウィンドウ(pty)で子プロセスを生成し、ユーザーのttyとプロセスI / Oをブリッジするクライアント/サーバーアプリケーションです。

WindowsのpythonとPythonモジュールのgreenlet、およびCygwinのイベントレットが必要です。


私はこれをしばらく使用していますが、イベントはnanoのようなインタラクティブなものを問題なく処理します!
MemphiZ 2016


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を設定し、その後/etc/exim.confファイルをvim編集できました。スリック。
ナンカー、

2

この回答は別の回答に基づいています。まず、アカウントがAdministratorsグループに属していることを確認してください。

次に、次の内容の一般的な「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プロンプトが表示されるのは一度だけであり、この手順は一般化されているため、あらゆる種類のコマンドを使用できます。


2

このスレッドでGitHubからCygWinのSUDOを拡張する新しい提案(TOUACExt という名前

  • sudoserver.pyを自動的に開きます。
  • タイムアウト後にsudoserver.pyを自動的に閉じます(デフォルトは15分)。
  • UAC昇格プロンプトを要求するはい/いいえ、管理者ユーザー向けのスタイルです。
  • 非管理者ユーザーの管理者ユーザー/パスワードを要求します。
  • 管理者アカウントでリモートで動作します(SSH)。
  • ログを作成します。

まだプレベータ版ですが、動作しているようです。


1

私はグーグルを通じてここに上陸し、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:/ home / Administrator:/ bin / bash

これに(あなたの番号とマシン名は異なります、ハイライトされた番号を0に変更してください!)

root:unused:0:0:U- MACHINE \ 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」をダブルクリックして手動で実行します。パスワードを入力して、ウィンドウを閉じてください。

次に、cygwinからsuコマンドを実行してみて、すべてが正常に機能するかどうかを確認します。


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を使用している場合は問題なく動作します

副作用は、admin cmdウィンドウの異なる色です。これをbashで使用するには、adminユーザーの.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-linkのプロパティを変更しました

/互換性/特権レベル/

チェックボックスをオンにしました

「このプログラムを管理者として実行します」

これにより、cygwinシェルは、管理者特権と対応するサブシェルでも開くことができます。


マイナーな唯一の問題は、それが管理者として開かれているかどうかがわからないことです。
エドウィンプラット

0

sudoさまざまなオペレーティングシステムでの実装の詳細を探すためにこのディスカッションに会いました。それを読んで私は@ brian-white(https://stackoverflow.com/a/42956057/3627676による解決策を見つけました)は有用ですが、少し改善できることが。一時ファイルの作成を避け、すべてを単一のスクリプトで実行するように実装しました。

また、単一のウィンドウ/コンソール内に出力するための改善の次のステップを調査しました。残念ながら、成功していません。名前付きパイプを使用してSTDOUT / STDERRをキャプチャし、メインウィンドウに印刷しようとしました。しかし、子プロセスは名前付きパイプに書き込みませんでした。ただし、通常のファイルへの書き込みはうまく機能します。

根本的な原因を見つけるための試みはすべて中止し、現在の解決策はそのままにしました。私の投稿も役立つことを願っています。

改善点:

  • 一時ファイルなし
  • コマンドラインオプションを解析および再構築しない
  • 昇格したコマンドを待つ
  • minttyまたはを使用しbash、最初のものが見つからない場合
  • コマンドの終了コードを返す
    #!/ bin / bash

    #管理者であるため、コマンドを直接呼び出す
    id -G | grep -qw 544 && {
        「$ @」
        $を終了しますか?
    }

    #CYG_SUDO変数は、コマンドの呼び出しを制御するために使用されます
    [-z "$ CYG_SUDO"] && {
        mintty = "$(which mintty 2> / dev / null)"
        CYG_SUDO = "$$"をエクスポート
        cygstart --wait --action = runas $ mintty / bin / bash "$ 0" "$ @"
        $を終了しますか?
    }

    #これで、次のことができるようになりました。
    #-コマンドを起動します
    #-メッセージを表示する
    #-終了コードを返す
    「$ @」
    RETVAL = $?

    echo "$ 0:Press to close window ..."
    読んだ

    $ 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」ユーザーの不足を回避するには:

  • 「root」というローカルWindowsマシンでユーザーを作成し、「Administrators」グループのメンバーにします
  • すべてのユーザーに対してbin / bash.exeを「管理者として実行」としてマークします(明らかに、必要に応じてこれをオン/オフにする必要があります)
  • Cygwin.batファイルを右クリックしながら、Windowsエクスプローラーの左シフトボタンを押したままにします。
  • 「別のユーザーとして実行」を選択します
  • ユーザー名として。\ rootを入力し、次にパスワードを入力します。

これにより、cygwinで「root」というユーザーとして実行されます。bash.exeファイルの「管理者として実行」と組み合わせれば十分な場合があります。

ただし、まだsudoが必要です。

/ binに「sudo」というファイルを作成し、代わりにこのコマンドラインを使用してコマンドをsuに送信することにより、これを偽装しました(Linuxの知識が豊富な人は、おそらくそれをよりよく偽造できます)。

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 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.