Cygwinでbashスクリプトを実行しようとしています。
Must run as root, i.e. sudo ./scriptname
エラーが発生します。
chmod 777 scriptname
助けには何もしません。
Cysuでsudoを模倣する方法、ルートユーザーを追加する方法を探しました。 "su"を呼び出すとエラーが表示されsu: user root does not exist
、何も有用で何も見つかりません。
誰か提案がありますか?
Cygwinでbashスクリプトを実行しようとしています。
Must run as root, i.e. sudo ./scriptname
エラーが発生します。
chmod 777 scriptname
助けには何もしません。
Cysuでsudoを模倣する方法、ルートユーザーを追加する方法を探しました。 "su"を呼び出すとエラーが表示されsu: user root does not exist
、何も有用で何も見つかりません。
誰か提案がありますか?
回答:
私はSuperUserでこの質問に回答しましたが、OPがその質問に対する唯一の回答であった役に立たなかった回答を無視した後にのみ。
これは、Cygwinで権限を昇格させる適切な方法です。これは、SuperUserに関する私の独自の回答からコピーされたものです。
Cygwinメーリングリストで答えを見つけました。command
Cygwinで管理者特権で実行するには、コマンドの前に次の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でテスト済み。
上記の手順の代わりに、このコマンドのエイリアスを次のように追加することもできます~/.bashrc
。
# alias to simulate sudo
alias sudo='cygstart --action=runas'
cat << 'EOF' > ~/bin/sudo\n #!/usr/bin/bash\n cygstart --action=runas "$@"\n EOF
(このコメントに改行を挿入する方法がわからないため、コードに「\ n」を追加しました)PATH = ...以降の部分は問題ありません。
ls
は、mintty、bash、またはzshのような長時間実行プロセスにラップすることです。しかし、それはすべて別の端末に表示されます。この時点で、ConEMUを使用してGUIでそれを開くことができたはずです。
"$@"
付けると、次のようなもの"$1" "$2" "$3" ...
に$@
拡張され$1 $2 $3...
ます。
おそらく、管理者としてcygwinシェルを実行する必要があります。ショートカットを右クリックして[管理者として実行]をクリックするか、ショートカットのプロパティに移動して、互換性セクションで確認できます。注意してください...ルート権限は危険な場合があります。
sudo
Linuxとまったく同じように機能します。
chown --changes --verbose --recursive [USER] /cygdrive/c/[PATH TO FOLDER]/*
。それがなければ、rsyncされたフォルダーとファイルにアクセスできませんでした。
上に構築さdotancohenの答え私は、エイリアスを使用しています:
alias sudo="cygstart --action=runas"
魅力として働く:
sudo chown User:Group <file>
SysInternalsがインストールされている場合は、システムユーザーとしてコマンドシェルを簡単に起動することもできます。
sudo psexec -i -s -d cmd
私はsudo-for-cygwinを見つけました、多分これはうまくいくでしょう、それはpythonスクリプトを使用してウィンドウ(pty)で子プロセスを生成し、ユーザーのttyとプロセスI / Oをブリッジするクライアント/サーバーアプリケーションです。
WindowsのpythonとPythonモジュールのgreenlet、およびCygwinのイベントレットが必要です。
またはcygwinのためのsuのポートを備えてsyswinパッケージを、インストールします。http://sourceforge.net/p/manufacture/wiki/syswin-su/
それはそう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
この回答は別の回答に基づいています。まず、アカウントがAdministratorsグループに属していることを確認してください。
次に、次の内容の一般的な「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プロンプトが表示されるのは一度だけであり、この手順は一般化されているため、あらゆる種類のコマンドを使用できます。
このスレッドでGitHubからCygWinのSUDOを拡張する新しい提案(TOUACExt という名前):
まだプレベータ版ですが、動作しているようです。
私はグーグルを通じてここに上陸し、cygwinで完全に機能するルートプロンプトを取得する方法を見つけたと私は実際に信じています。
これが私のステップです。
まず、Windows管理者アカウントの名前を「root」に変更する必要があります。これを行うには、start manuを開き、「gpedit.msc」と入力します。
[ローカルコンピュータポリシー]> [コンピュータの構成]> [Windows設定]> [セキュリティ設定]> [ローカルポリシー]> [セキュリティオプション]> [アカウント]の下のエントリを編集します。管理者アカウントの名前を変更します
次に、アカウントがまだ有効になっていない場合は、有効にする必要があります。ローカルコンピュータポリシー>コンピュータの構成> Windows設定>セキュリティ設定>ローカルポリシー>セキュリティオプション>アカウント:管理者アカウントのステータス
ログアウトして、rootアカウントにログインします。
次に、cygwinの環境変数を設定します。簡単な方法で行うには:[マイコンピュータ]> [プロパティ]を右クリックします。
(左側のサイドバーにある)[システムの詳細設定]をクリックします
下部にある[環境変数]ボタンをクリックします
「システム変数」の下の「新規...」ボタンをクリックします
名前については、引用符なしで「cygwin」を入れてください。値として、cygwinルートディレクトリに入力します。(私はC:\ cygwinでした)
[OK]を押してすべて閉じ、デスクトップに戻ります。
Cygwinターミナル(cygwin.bat)を開きます。
ファイル/ etc / passwdを編集して、行を変更します
管理者:未使用:500:503:U- MACHINE \ Administrator、S-1-5-21-12345678-1234567890-1234567890- 500:/ home / Administrator:/ bin / bash
これに(あなたの番号とマシン名は異なります、ハイライトされた番号を0に変更してください!)
root:unused: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コマンドを実行してみて、すべてが正常に機能するかどうかを確認します。
利用可能なソリューションに不満があるので、nu774のスクリプトを採用してセキュリティを追加し、セットアップと使用を簡単にしました。プロジェクトが利用可能です Github
使用するには、ダウンロードcygwin-sudo.py
して実行するだけですpython3 cygwin-sudo.py **yourcommand**
ます。
便宜上、エイリアスを設定できます。
alias sudo="python3 /path-to-cygwin-sudo/cygwin-sudo.py"
これを使用して、任意のディレクトリのコンテキストメニューから、bashまたはcmdが実行されている管理ウィンドウを取得します。ディレクトリ名を右クリックして、エントリを選択するか、強調表示されたボタンをクリックします。
これはchereツールと、link_boyからの(私にとっては)残念ながら機能しない回答に基づいています。Windows 8を使用している場合は問題なく動作します
副作用は、admin cmdウィンドウの異なる色です。これを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\""
cygwinシェルと対応するサブシェルを管理者権限で操作する非常に簡単な方法は、初期シェルを開くリンクのプロパティを変更することです。
以下はWindows 7以降で有効です(おそらく以前のバージョンでも同様ですが、確認していません)。
私は通常、最初にcygwinリンクからcygwinシェルを起動しますボタン(またはデスクトップ)のます。次に、タブでcygwin-linkのプロパティを変更しました
/互換性/特権レベル/
チェックボックスをオンにしました
「このプログラムを管理者として実行します」
これにより、cygwinシェルは、管理者特権と対応するサブシェルでも開くことができます。
sudo
さまざまなオペレーティングシステムでの実装の詳細を探すためにこのディスカッションに会いました。それを読んで私は@ brian-white(https://stackoverflow.com/a/42956057/3627676による解決策を見つけました)は有用ですが、少し改善できることが。一時ファイルの作成を避け、すべてを単一のスクリプトで実行するように実装しました。
また、単一のウィンドウ/コンソール内に出力するための改善の次のステップを調査しました。残念ながら、成功していません。名前付きパイプを使用してSTDOUT / STDERRをキャプチャし、メインウィンドウに印刷しようとしました。しかし、子プロセスは名前付きパイプに書き込みませんでした。ただし、通常のファイルへの書き込みはうまく機能します。
根本的な原因を見つけるための試みはすべて中止し、現在の解決策はそのままにしました。私の投稿も役立つことを願っています。
改善点:
mintty
またはを使用しbash
、最初のものが見つからない場合#!/ bin / bash #管理者であるため、コマンドを直接呼び出す id -G | grep -qw 544 && { 「$ @」 $を終了しますか? } #CYG_SUDO変数は、コマンドの呼び出しを制御するために使用されます [-z "$ CYG_SUDO"] && { mintty = "$(which mintty 2> / dev / null)" CYG_SUDO = "$$"をエクスポート cygstart --wait --action = runas $ mintty / bin / bash "$ 0" "$ @" $を終了しますか? } #これで、次のことができるようになりました。 #-コマンドを起動します #-メッセージを表示する #-終了コードを返す 「$ @」 RETVAL = $? echo "$ 0:Press to close window ..." 読んだ $ RETVALを終了
cygstart --wait --action=runas $mintty /bin/bash "$0" "$@"
引数にスペースがある場合、どのように壊れませんか?cygstart / runasを介して渡すとき、それは私のために常にしました。
@ 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")
これを自分で完全にテストすることはできません。試すための適切なスクリプトがないので、私はLinuxの専門家ではありませんが、十分に近いものをハックできるかもしれません。
私はこれらのステップを試してみましたが、それらはうまくいくようですが、それがあなたのニーズに十分であるかどうかわかりません。
「root」ユーザーの不足を回避するには:
これにより、cygwinで「root」というユーザーとして実行されます。bash.exeファイルの「管理者として実行」と組み合わせれば十分な場合があります。
ただし、まだsudoが必要です。
/ binに「sudo」というファイルを作成し、代わりにこのコマンドラインを使用してコマンドをsuに送信することにより、これを偽装しました(Linuxの知識が豊富な人は、おそらくそれをよりよく偽造できます)。
su -c "$*"
コマンドライン「sudo vim」などは私には問題なく動作するようですので、試してみてください。
これがあなたのニーズに合っているかどうか知りたいと思ってください。
私が通常行うことは、コンピューターのどこからでも非常に簡単な管理者権限でcygwinシェルを開くためのレジストリ「ここを開く」ヘルパーを持っていることです。
cygwin "chere"パッケージをインストールする必要があることに注意してくださいchere -i -m
。最初に昇格したcygwinシェルから" "を使用してください。
cygwinインストールがC:\ cygwinにあると仮定します...
レジストリコードは次のとおりです。
Windows Registry Editor Version 5.00
[-HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash]
[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash]
@="Open Cygwin Here as Root"
"HasLUAShield"=""
[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash\command]
@="c:\\cygwin\\bin\\mintty.exe -i /Cygwin-Terminal.ico -e /bin/xhere /bin/bash.exe"
[-HKEY_CLASSES_ROOT\Directory\Background\shell\cygwin_bash]
[HKEY_CLASSES_ROOT\Directory\Background\shell\cygwin_bash]
@="Open Cygwin Here as Root"
"HasLUAShield"=""
[HKEY_CLASSES_ROOT\Directory\Background\shell\cygwin_bash\command]
@="c:\\cygwin\\bin\\mintty.exe -i /Cygwin-Terminal.ico -e /bin/xhere /bin/bash.exe"
[-HKEY_CLASSES_ROOT\Drive\shell\cygwin_bash]
[HKEY_CLASSES_ROOT\Drive\shell\cygwin_bash]
@="Open Cygwin Here as Root"
"HasLUAShield"=""
[HKEY_CLASSES_ROOT\Drive\shell\cygwin_bash\command]
@="c:\\cygwin\\bin\\mintty.exe -i /Cygwin-Terminal.ico -e /bin/xhere /bin/bash.exe"
お役に立てれば。それがあなたのために働くかどうか私に知らせてください。ありがとう。
PS:このコードを取得し、コピーして貼り付け、name.regファイルに保存して実行するか、手動で値を追加できます。
試してください:
chmod -R ug+rwx <dir>
どこ<dir>
あなたがアクセス権を変更するディレクトリです。
what
実行しようとしているスクリプトの詳細を教えてください。cygwinシェル内には「sudo」に相当するものはありません-権利はcygwinシェルを起動したwinユーザーからのものであるため、KyleWpppdリンクは「sudo unknown command」などのエラーを回避するのに適しています。あなたの場合、それはあなたが実行したいスクリプトの特定の問題であるように聞こえます。