問題の説明:Cygwin mintty
bash
セッションが「次のように実行」であるかどうかをテストするための最もエレガントで堅牢な方法は何ですか。管理者」?
なぜ、具体的には?Windowsを使用しているときに、通常、いくつかのmintty
端末を開いています(mintty
にはタブがありません)。最も厄介なのは、たとえばping
または他の1回限りの手順を実行したいときに、[管理者として実行]を右クリックして開始したターミナルウィンドウを見つける必要がある場合です。ターミナルセッションの "管理者として実行"性を視覚的に示したいと思います(スタートアップファイル_PS1
_のbash
シェルプロンプト変数_~/.bashrc
_を変更して)。
いくつかの迅速な解決策:
env
の出力をざっと見てみると、かなり多くの違いがあります。ただし、別のWindowsマシン(おそらく異なるバージョンのWindowsを実行している)への移植性の観点から、どれが最も信頼できるかを判断するのは困難です。id
、より具体的には_id -Gn
_は、管理者として実行された場合に異なるグループを表示します。私のWindows7マシンでは、Administrators
グループとroot
グループがリストに追加されています。繰り返しますが、これがポータブルかどうかはわかりません。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
を使用することです。そこで回答と解説を確認してください。
同じ理由でこの関数を書いたところです。どのシェルに管理者権限があるのかわかりません。
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ステータスを返します。
プロンプトを変更するか、タイトルバーの色を変更する必要があります。
この質問に対する決定的な答えは 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をグループ化するだけです。
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 "
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\] '
管理者だけが実行できることを実行し、成功または失敗をテストします。-
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
Windows上のMsysでこれを試してください(受け入れられた回答がMsysで機能しないことがわかりました)
at &> /dev/null && echo "Running as admin" || echo "NOT running as admin"
これは、adminとして実行している場合にのみ、at
の戻りコードがゼロであることを前提としています。