web-dev-qa-db-ja.com

cygwin mintty / bashが管理者として実行されているかどうかを確認するにはどうすればよいですか?

問題の説明:Cygwin minttybashセッションが「次のように実行」であるかどうかをテストするための最もエレガントで堅牢な方法は何ですか。管理者」?

なぜ、具体的には?Windowsを使用しているときに、通常、いくつかのmintty端末を開いています(minttyにはタブがありません)。最も厄介なのは、たとえばpingまたは他の1回限りの手順を実行したいときに、[管理者として実行]を右クリックして開始したターミナルウィンドウを見つける必要がある場合です。ターミナルセッションの "管理者として実行"性を視覚的に示したいと思います(スタートアップファイル_PS1_のbashシェルプロンプト変数_~/.bashrc_を変更して)。

いくつかの迅速な解決策:

  1. いくつかの環境変数の値を比較できます。 envの出力をざっと見てみると、かなり多くの違いがあります。ただし、別のWindowsマシン(おそらく異なるバージョンのWindowsを実行している)への移植性の観点から、どれが最も信頼できるかを判断するのは困難です。
  2. id、より具体的には_id -Gn_は、管理者として実行された場合に異なるグループを表示します。私のWindows7マシンでは、Administratorsグループとrootグループがリストに追加されています。繰り返しますが、これがポータブルかどうかはわかりません。
  3. 通常のユーザーとしては失敗する場所にファイルを書き込もうとする可能性があります。 しかし、私は奇妙な場所にファイルを書きたくありません-これはいくつかの想像されるシナリオでは潜在的に破壊的である可能性があり(たとえば、ストレージメディアの障害)、これは私の好みにはまったく関係がないようです
  4. コマンドが「管理者として」実行された場合に、戻り状況または出力によって示されるいくつかのWindowsプログラムを実行します。 UNIXの目的に類似した目的を持つものが最適です id(1) コマンド(ただし、Windowsにネイティブに存在します-またはCygwinですが、Windowsシステムの概念からPOSIXエミュレートされた概念への翻訳はあまり取得されていません)。

より良いまたはよりエレガントな提案はありますか?おそらくcygwinはこの目的専用のコマンドユーティリティを提供していますか?

更新:97%重複 https://stackoverflow.com/questions/4051883/batch-script-how-to-check- for-admin-rights / -違いは、ここで(IMHO奇妙で古風な)Windows _cmd.exe_の代わりにbashを使用することです。そこで回答と解説を確認してください。

16
FooF

同じ理由でこの関数を書いたところです。どのシェルに管理者権限があるのか​​わかりません。

function isadmin()
{
    net session > /dev/null 2>&1
    if [ $? -eq 0 ]; then echo "admin"
    else echo "user"; fi
}

これは、この回答から適応しました https://stackoverflow.com/a/11995662/307968 Windowscmdシェル用。管理者の場合、ネットセッションは0ステータスを返します。

プロンプトを変更するか、タイトルバーの色を変更する必要があります。

10
Darrel Lee

この質問に対する決定的な答えは Cygwinメーリングリスト から来ています。プロセスを開始したユーザーがグループ544(管理者)の一部である場合、そのプロセスは管理者権限で実行されています。また、Cromaxによる以下のコメントから、グループ114(ローカルアカウントと管理者グループのメンバー)も時々存在するようです。これら2つのグループのテストは

id -G | grep -qE '\<(114|544)\>'

例えば、

id -G | grep -qE '\<(114|544)\>' && echo admin || echo user

以前は、/ etc/groupのルートグループであるグループ0も確認する必要がありました。ただし、/ etc/groupはCygwinにインストールされなくなり、通常は存在する場合は削除する必要があるため、グループ0もチェックするのは 推奨されなくなりました です。 544をグループ化するだけです。

16
Andrew Schulman

Windowsプログラムの戻り値atを使用します。また、PROMPTING特殊文字\$の機能を再現しました。

# Set a white $ initially
eStyle='\[\e[0m\]$'

# If 'at' succeeds, use a red # instead
at &> /dev/null && eStyle='\[\e[0;31m\]#\[\e[0m\]'  # Use # in red

PS1='\n\[\e[0;32m\]\u@\h \[\e[0;33m\]\w\[\e[0m\]\n'"$eStyle "

Examples

7
Steven

id -G | grep -qE '\<(544|0)\>'は、昇格しても出力に<>も544もなかったため、機能しなかったようです。ただし、%WINDIR%\system32への書き込みには標高が必要なため、これを使用してシェル関数で標高をテストしました。

is_elevated() { 
   [[ $(uname -o) -eq "Cygwin" ]] || return 1
   touch $WINDIR/system32/.cyg_elevated &> /dev/null
}

スティーブンの赤いハッシュ文字の優れたアイデアに適用すると、次のようになります。

is_elevated && PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\[\e[0;31m\]#\[\e[0m\] '
2
Josh

管理者だけが実行できることを実行し、成功または失敗をテストします。-

if touch c:/Users/.x ; then  echo 'ok'  ; fi

または

touch c:/Users/.x && echo ok

または

touch c:/Users/.x && \rm c:/Users/.x && echo ok

または

touch c:/Users/.x  &> /dev/null && \rm c:/Users/.x && echo you are admin
1
zzapper

Windows上のMsysでこれを試してください(受け入れられた回答がMsysで機能しないことがわかりました)

at &> /dev/null && echo "Running as admin" || echo "NOT running as admin"

これは、adminとして実行している場合にのみ、atの戻りコードがゼロであることを前提としています。

1
sparrowt