Cygwin で bash スクリプトを実行しようとしています。
Must run as root, i.e. sudo ./scriptname
エラー が発生します。
chmod 777 scriptname
何も助けません。
「su」を呼び出すとエラーが表示されるため、Cygwinでsudoを模倣してルートユーザーを追加する方法を探しましたがsu: user root does not exist
、何も見つかりませんでした。
誰にも提案はありますか?
おそらく、管理者として cygwin シェルを実行する必要があります。ショートカットを右クリックして管理者として実行をクリックするか、ショートカットのプロパティに移動して互換性セクションで確認できます。注意してください....ルート権限は危険な場合があります。
dotancohenの答えに基づいて、エイリアスを使用しています:
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 モジュール greenlet と 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
または、cygwin 用の su ポートを含む syswin パッケージをインストールします: http://sourceforge.net/p/manufacture/wiki/syswin-su/
この回答は別の回答に基づいています。まず、アカウントが管理者グループに属していることを確認してください。
次に、次の内容で汎用の「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 プロンプトが表示されるのは 1 回だけです。この手順は一般化されているため、あらゆる種類のコマンドを使用できます。
TOUACExtという名前のこのスレッドのGitHub からの CygWin の SUDO を強化する新しい提案:
まだプレベータ版ですが、動作しているようです。
私はグーグル経由でここにたどり着きました.cygwinで完全に機能するルートプロンプトを取得する方法を見つけたと実際に信じています.
これが私の手順です。
最初に、Windows 管理者アカウントの名前を「root」に変更する必要があります。これを行うには、スタート メニューを開いて「gpedit.msc」と入力します。
[ローカル コンピューター ポリシー] > [コンピューターの構成] > [Windows の設定] > [セキュリティの設定] > [ローカル ポリシー] > [セキュリティ オプション] > [アカウント] のエントリを編集します。管理者アカウントの名前を変更します。
アカウントがまだ有効になっていない場合は、アカウントを有効にする必要があります。ローカル コンピューター ポリシー > コンピューターの構成 > Windows の設定 > セキュリティの設定 > ローカル ポリシー > セキュリティ オプション > アカウント: 管理者アカウントの状態
ここで、ログアウトして root アカウントにログインします。
cygwin の環境変数を設定します。これを簡単に行うには、[マイ コンピュータ] を右クリックし、[プロパティ] をクリックします。
(左側のサイドバーで)「システムの詳細設定」をクリックします
下部にある [環境変数] ボタンをクリックします。
「システム変数」の下にある「新規...」ボタンをクリックします。
名前は、引用符なしで「cygwin」と入力します。値には、cygwin ルート ディレクトリに入力します。(私は C:\cygwin でした)
[OK] を押してすべてを閉じて、デスクトップに戻ります。
Cygwin ターミナル (cygwin.bat) を開きます。
ファイル /etc/passwd を編集して行を変更します
管理者:未使用: 500:503 :U- MACHINE\管理者、S-1-5-21-12345678-1234567890-1234567890-500 :/home/管理者:/bin/bash
これに (番号とマシン名は異なります。強調表示された番号を 0 に変更してください!)
root :未使用: 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 コマンドを実行して、すべてがうまくいくかどうかを確認します。
cygwin シェルと対応するサブシェルを管理者権限で動作させる非常に簡単な方法は、最初のシェルを開くリンクのプロパティを変更することです。
以下はWindows 7以降で有効です(おそらく以前のバージョンでも有効ですが、確認していません)
私は通常、スタートボタン (またはデスクトップ)の cygwin リンクから cygwin シェルを起動します。次に、タブのcygwin-linkのプロパティを変更しました
/互換性/特権レベル/
チェックボックスをオンにすると、
「このプログラムを管理者として実行してください」
これにより、cygwin シェルを管理者権限で開くことができ、対応するサブシェルも開くことができます。
@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")
受け入れられた回答を単純化するだけで、Cygwin ターミナルで以下をコピーすれば完了です。
cat <<EOF >> /bin/sudo
#!/usr/bin/bash
cygstart --action=runas "\$@"
EOF
chmod +X /bin/sudo
sudo
さまざまなオペレーティング システムでの実装に関する詳細を探して、このディスカッションに出会いました。それを読んで、@ brian-white ( https://stackoverflow.com/a/42956057/3627676 ) によるソリューションは便利ですが、少し改善できることがわかりました。一時ファイルの作成を避け、単一のスクリプトですべてを実行するように実装しました。
また、単一のウィンドウ/コンソール内で出力するための改善の次のステップを調査しました。残念ながら、何の成功もありません。名前付きパイプを使用して STDOUT/STDERR をキャプチャし、メイン ウィンドウに出力しようとしました。しかし、子プロセスは名前付きパイプに書き込みませんでした。ただし、通常のファイルへの書き込みはうまく機能します。
根本的な原因を見つける試みをすべて中止し、現在の解決策をそのまま残しました。私の投稿も役立つことを願っています。
改良点:
mintty
またはを使用しますbash
#!/ビン/バッシュ # 管理者として、コマンドを直接呼び出す id -G | grep -qw 544 && { 「$@」 $ を終了しますか? } # CYG_SUDO 変数は、コマンドの呼び出しを制御するために使用されます [ -z "$CYG_SUDO" ] && { mintty="$( どの mintty 2>/dev/null )" export CYG_SUDO="$$" cygstart --wait --action=runas $mintty /bin/bash "$0" "$@" $ を終了しますか? } # これで、次のことができるようになりました: # -- コマンドを起動します # -- メッセージを表示する # -- 終了コードを返す 「$@」 RETVAL=$? echo "$0: 押すとウィンドウを閉じます..." 読んだ $RETVAL を出る
試す:
chmod -R ug+rwx <dir>
where<dir>
は、権限を変更するディレクトリです。