Cygwinでbashスクリプトを実行しようとしています。
Must run as root, i.e. Sudo ./scriptname
エラーが発生します。
chmod 777 scriptname
は何の助けにもなりません。
「su」を呼び出すとエラーsu: user root does not exist
が表示されるため、ルートユーザーを追加するために、CygwinでSudoを模倣する方法を探しましたが、何も見つかりませんでした。
誰か提案がありますか?
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でテスト済み。
おそらく、cygwin Shellを管理者として実行する必要があります。ショートカットを右クリックして[管理者として実行]をクリックするか、ショートカットのプロパティに移動して互換性セクションで確認します。ただ注意してください.... root権限は危険な場合があります。
dotancohen's answer に基づいて、エイリアスを使用しています:
alias Sudo="cygstart --action=runas"
魅力として機能します:
Sudo chown User:Group <file>
また、SysInternalsがインストールされている場合は、システムユーザーとしてコマンドシェルを非常に簡単に起動することもできます。
Sudo psexec -i -s -d cmd
私は Sudo-for-cygwin を見つけました。多分これは動作するでしょう、それはpythonスクリプトを使用してWindows(pty)とブリッジで子プロセスを生成するクライアント/サーバーアプリケーションですユーザーのttyとプロセスI/O。
Windowsではpython、グリーンPythonモジュール、およびCygwinではeventletが必要です。
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
この回答は、 別の回答 に基づいています。まず、アカウントが管理者グループに属していることを確認してください。
次に、次のコンテンツを含む汎用の「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回だけで、この手順は一般化されているため、あらゆる種類のコマンドを使用できます。
または、cygwin用のsuのポートを含むsyswinパッケージをインストールします。 http://sourceforge.net/p/manufacture/wiki/syswin-su/
このスレッド 、名前付きTOUACExtのGitHubからCygWinのSudoを拡張する新しい提案:
まだ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コマンドを実行して、すべてがうまくいくかどうかを確認してください。
利用可能なソリューションに不満があるため、セキュリティを追加し、セットアップと使用を簡単にするために nu774のスクリプト を採用しました。プロジェクトは利用可能です Githubで
使用するには、 cygwin-Sudo.py
をダウンロードして、python3 cygwin-Sudo.py **yourcommand**
で実行します。
便宜上、エイリアスを設定できます。
alias Sudo="python3 /path-to-cygwin-Sudo/cygwin-Sudo.py"
Cygwinシェルと対応するサブシェルを管理者権限で操作する非常に簡単な方法は、初期シェルを開くlinkのプロパティを変更することです。
以下はWindows 7以降で有効です(おそらく以前のバージョンでも有効ですが、チェックしていません)
通常、startボタン(またはデスクトップ)のcygwin-linkからcygwinシェルを起動します。次に、タブでcygwin-linkのプロパティを変更しました
/互換性/特権レベル/
そしてボックスをチェックし、
「管理者としてこのプログラムを実行する」
これにより、cygwin Shellを管理者権限と対応するサブシェルで開くことができます。
さまざまなオペレーティングシステムでの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
@ mat-khorの回答に基づいて、syswin su.exe
を取得し、manufacture-syswin-su.exe
として保存し、このラッパースクリプトを作成しました。コマンドのstdoutおよびstderrのリダイレクトを処理するため、パイプなどで使用できます。また、スクリプトは指定されたコマンドのステータスで終了します。
制限事項:
env USERNAME=...
を追加すると、それがオーバーライドされます。他のオプションが必要な場合、スクリプトはsyswin-suとコマンド引数を区別する必要があります。最初の--
で分割します。。
#!/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")
これを使用して、任意のディレクトリコンテキストメニューから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\""