web-dev-qa-db-ja.com

Cygwinでのルートユーザー/ Sudoの同等物

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

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

chmod 777 scriptnameは何の助けにもなりません。

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

誰か提案がありますか?

150
Ken Bellows

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

Cygwinで権限を昇格させる適切な方法は、SuperUserの自分の回答からコピーしたものです:

cygwinメーリングリスト で答えを見つけました。 Cygwinで昇格された特権でcommandを実行するには、次のようにコマンドの前に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でテスト済み。

206
dotancohen

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

47
Matt Williamson

dotancohen's answer に基づいて、エイリアスを使用しています:

alias Sudo="cygstart --action=runas"

魅力として機能します:

Sudo chown User:Group <file>

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

Sudo psexec -i -s -d cmd
20
thoni56

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

Windowsではpython、グリーンPythonモジュール、およびCygwinではeventletが必要です。

9
AdamTheWebMan

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
3
Brian White

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

次に、次のコンテンツを含む汎用の「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プロンプトを取得できるのは1回だけで、この手順は一般化されているため、あらゆる種類のコマンドを使用できます。

2
user2618594

または、cygwin用のsuのポートを含むsyswinパッケージをインストールします。 http://sourceforge.net/p/manufacture/wiki/syswin-su/

2
Mat Khor

このスレッド 、名前付きTOUACExtのGitHubからCygWinのSudoを拡張する新しい提案:

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

まだPre-Betaですが、動作しているようです。

私はグーグルを介してここに着陸しました。実際、cygwinで完全に機能するルートプロンプトを取得する方法を見つけたと思います。

ここに私の手順があります。

まず、Windows管理者アカウントの名前を「root」に変更する必要があります。これを行うには、開始manuを開き、「gpedit.msc」と入力します。

[ローカルコンピューターポリシー]> [コンピューターの構成]> [Windowsの設定]> [セキュリティの設定]> [ローカルポリシー]> [セキュリティオプション]> [アカウント:管理者アカウントの名前を変更]でエントリを編集します

その後、まだ有効になっていない場合は、アカウントを有効にする必要があります。ローカルコンピューターポリシー>コンピューターの構成> Windowsの設定>セキュリティの設定>ローカルポリシー>セキュリティオプション>アカウント:管理者アカウントの状態

ログアウトして、rootアカウントにログインします。

次に、cygwinの環境変数を設定します。それを簡単に行うには:[マイコンピュータ]> [プロパティ]を右クリックします。

(左側のサイドバーの)[システムの詳細設定]をクリックします

下部近くにある「環境変数」ボタンをクリックします

「システム変数」の下の「新規...」ボタンをクリックします

名前には、引用符なしで「cygwin」を入れます。値については、cygwinルートディレクトリに入力します。 (私のものはC:\ cygwinでした)

[OK]を押してすべてを閉じ、デスクトップに戻ります。

Cygwinターミナル(cygwin.bat)を開きます

ファイル/ etc/passwdを編集して、行を変更します

管理者:unused:500:5:U -MACHINE\Administrator、S-1-5-21-12345678-1234567890-1234567890-- 500:/ home/Administrator:/ bin/bash

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

root:unused::U -MACHINE\root、S-1-5-21-12345678-1234567890-1234567890-- :/ 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'

ルートアカウントからログアウトし、通常のWindowsユーザーアカウントに戻ります。

その後、エクスプローラで新しい「su.bat」をダブルクリックして手動で実行します。パスワードを入力して、ウィンドウを閉じます。

ここで、cygwinからsuコマンドを実行して、すべてがうまくいくかどうかを確認してください。

1
Hydranix

利用可能なソリューションに不満があるため、セキュリティを追加し、セットアップと使用を簡単にするために nu774のスクリプト を採用しました。プロジェクトは利用可能です Githubで

使用するには、 cygwin-Sudo.py をダウンロードして、python3 cygwin-Sudo.py **yourcommand**で実行します。

便宜上、エイリアスを設定できます。

alias Sudo="python3 /path-to-cygwin-Sudo/cygwin-Sudo.py"
1
Chronial

Cygwinシェルと対応するサブシェルを管理者権限で操作する非常に簡単な方法は、初期シェルを開くlinkのプロパティを変更することです。

以下はWindows 7以降で有効です(おそらく以前のバージョンでも有効ですが、チェックしていません)

通常、startボタン(またはデスクトップ)のcygwin-linkからcygwinシェルを起動します。次に、タブでcygwin-linkのプロパティを変更しました

/互換性/特権レベル/

そしてボックスをチェックし、

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

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

0
DMH

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

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

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

改善点:

  • 一時ファイルなし
  • コマンドラインオプションの解析と再構築はありません
  • 昇格したコマンドを待つ
  • 最初の変数が見つからない場合は、minttyまたはbashを使用します
  • コマンド終了コードを返します
 
#!/ bin/bash 
 
#管理者になり、コマンドを直接呼び出します
 id -G | grep -qw 544 && {
 "$ @" 
 exit $?
} 
 
#CYG_Sudo変数は、コマンド呼び出しを制御するために使用されます
 [-z "$ CYG_Sudo"] && {
 mintty = "$(which mintty 2>/dev/null)" 
 export CYG_Sudo = "$$" 
 cygstart --wait --action = runas $ mintty/bin/bash "$ 0" "$ @" 
 exit $?
} 
 
#今すぐ
#-コマンドを起動します
#-メッセージを表示します
#-終了コードを返します
 "$ @" 
 RETVAL = $?
 
 echo "$ 0:押してウィンドウを閉じます..." 
 read 
 
 exit $ RETVAL 
 
0
jsxt

@ 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")
0
EndlosSchleife

これを使用して、任意のディレクトリコンテキストメニューからbashまたはcmdのいずれかが実行されている管理ウィンドウを取得します。ディレクトリ名を右クリックして、エントリを選択するか、ハイライトされたボタンを押すだけです。

これはchereツールと、残念ながらlink_boyからの(私にとっては)うまくいかない答えに基づいています。私はWindows 8を使用してうまく動作します

副作用は、管理コマンドウィンドウの色が異なることです。これを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
user2988447