Cygwinにはsudoコマンドがないため、実行したいスクリプトは失敗します
./install.sh: line N: sudo: command not found
これを回避するための標準的な方法は何ですか?削除するスクリプトを編集しsudo
ますか?sudo
Windows向けのツールを入手しますか?
Cygwinにはsudoコマンドがないため、実行したいスクリプトは失敗します
./install.sh: line N: sudo: command not found
これを回避するための標準的な方法は何ですか?削除するスクリプトを編集しsudo
ますか?sudo
Windows向けのツールを入手しますか?
回答:
1つの方法は、次の内容で偽の「sudo」コマンドを作成することです。
#!/usr/bin/bash
"$@"
install.sh
sudoが見つかったため、これにより続行できます。
これは、実際のsudoのように特権を昇格しません。昇格された特権が本当に必要な場合は、管理特権(XP)を持つアカウントからcygwinシェルを起動するか、cygwin.batをrクリックして「管理者として実行」(Vista、Win7)
bash
なぜこれが機能するのですか?マンページには、何かをすることについて$@
何も言われていない-のsudo
ように。代わりに、スクリプトに対するすべての引数のみです。そして、その場合の引用符はその場合には不必要ではないでしょうか?そうしないと、UNIXのようなシステム上のスペースに対する不合理な恐怖を考えると、おそらく存在しない単一のコマンドとしてsudo foo bar
実行しようとし"foo bar"
ます。
"$@"
二重引用符で囲まれている場合)とは動作が異なります。位置変数ごとに個別の単語に"$*"
展開されます。例:場合とは、次にある-各パラメータの1つのワード(とは異なり、その結果で、一つの単語として)。マニュアルのセクションパラメータ、サブセクション特殊パラメータを参照してください。Peonのスクリプトの最終結果は、渡されたとおりに引数を実行することです。$1 == "foo bar"
$2 == "baz"
"$@"
"foo bar" baz
"$*"
"foo bar baz"
bash
sudo
部品はどこから来ますか?上記のスニペットは、その方向にリモートでは何もしませんよね?
sudo
特権root
はコマンドを実行する前に人間から特権に昇格します。Cygwinにはそのようなものはないので、Peonの偽のスクリプト(名前を付けますsudo
)は、特権を変更せずにコマンドを直接実行するだけです。(これは./install.sh
、管理者として実行する必要がある場合があることを意味します。)
runas
はずです。UACに依存せず、単独でパスワードを要求します。答えのスクリプトが、私が目的だと思っていた名前が暗示していることを明らかにしなかった理由を私はただ混乱させました。私の愚かさでごめんなさい;
cygwinメーリングリストで答えを見つけました。command
Cygwinで昇格された特権で実行するには、コマンドの前に次のcygstart --action=runas
ようにします。
$ cygstart --action=runas command
これにより、Windowsのダイアログボックスが開き、管理者パスワードを求められ、適切なパスワードが入力された場合にコマンドが実行されます。
~/bin
あなたのパスにある限り、これは簡単にスクリプト化されます:
$ cat ~/bin/sudo
#!/usr/bin/bash
cygstart --action=runas "$@"
$ PATH=$HOME/bin:$PATH
$ chmod +x ~/bin/sudo
$ sudo elevatedCommand
64ビットWindows 8でテスト済み。
cygstart
メソッドの問題は、Windowsコマンド/プログラムでのみ機能することです。できませんsudo ls
。CygWinのSUDOはすっきりしていますが、まだ良いsudo
コマンドがありません。
sudo ls
Cygwinで使用する必要がある状況は何ですか?
sudo
CygWinを使用して、WindowsまたはCygWinコマンドを実行できます。それは私にとって非常に便利です。しかし、私が見つけたより実際的な方法は、私が開発したCygWin用SUDOのスクリプトラッパーです:superuser.com/questions/741345/…(まだベータ版ですが、動作しているようです)。それを使用すると、のようなものを快適に注文することができますsudo net start vncserver
。
/bin
や/usr/bin
からPATH
。それはemacsを正常に呼び出します:ShellExecute(NULL, "runas", "C:\cygwin64\bin\emacs-w32.exe", "(null)", "(null)", 1)
しかし、emacsはls
、例えばM-x dired
を使用してPATHをインタラクティブに復元した後でも見つけることができません(setenv ...)
。ここに信頼できるパスの問題はありますか?
上に構築さdotancohenの答え私は、エイリアスを使用しています:
alias sudo="cygstart --action=runas"
外部プログラムの魅力として機能します(ただし、シェル組み込みではありません):
sudo chown User:Group <file>
Windows™のSudo(Elevate)
Windows™のコマンドラインで多くの作業を行っています。
Cygwin自体では、su -c /the/cmd
Windows™ファイルシステム内でsudo自体に関してrootコマンドを実行でき、コマンドラインからユーザーの権限を引き上げることができると考えています。管理者の場合、これはうまく機能します。それ以外の場合は、runasを使用して管理者のパスを取得してください;)。
今、このコードをどこで入手したか思い出せませんが、ここにあります。役に立てば幸いです。
ところで、これをコンパイルするために使用するパッケージはでしたgcc-mingw32
。
$ i586-mingw32msvc-gcc sudo.c -o sudo.exe
# Put sudo.exe in /usr/bin or in your windows path (%homedrive%\windows)
#example:
$ sudo vi /cygdrive/c/windows/system32/drivers/etc/hosts
/**
* (sudo for Windows™)
* @filename sudo.c
*/
#ifndef UNICODE
#define UNICODE
#endif
#include <windows.h>
#include <shellapi.h>
#include <wchar.h>
LPWSTR *mergestrings(LPWSTR *left, LPCWSTR right)
{
size_t size = ( 1 + lstrlen(*left) + lstrlen(right) ) * sizeof(LPWSTR*);
if ( *left ) {
LPWSTR leftcopy = _wcsdup(*left);
*left = (LPWSTR)realloc(*left, size);
*left = lstrcpy(*left, leftcopy);
*left = lstrcat(*left, right);
free( leftcopy );
}
else
*left = _wcsdup(right);
return left;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance, LPSTR lpcommand, int nShowCmd)
{
DWORD result = 0x2a;
LPWSTR *argv = NULL;
int argc = 0;
if ( argv = CommandLineToArgvW(GetCommandLineW(), &argc) ) {
if ( argc < 2 ) {
LPWSTR usagemsg = NULL;
usagemsg = *mergestrings(&usagemsg, argv[0]);
usagemsg = *mergestrings(&usagemsg, TEXT(" <command_to_run> [arguments]"));
MessageBox(NULL, usagemsg, TEXT("Usage:"), MB_OK | MB_ICONEXCLAMATION );
LocalFree( argv );
free( usagemsg );
return ERROR_BAD_ARGUMENTS;
}
else {
LPWSTR command = argv[1];
LPWSTR arguments = NULL;
int c;
for ( c = 2; c < argc; c++ ) {
arguments = *mergestrings(&arguments, argv[c]);
arguments = *mergestrings(&arguments, TEXT(" "));
}
result = (DWORD)ShellExecute(NULL, TEXT("runas"), command, arguments, NULL, SW_SHOWNORMAL);
LocalFree( argv );
if ( arguments )
free( arguments );
switch ( result )
{
case 0:
result = ERROR_OUTOFMEMORY;
break;
case 27:
case 31:
result = ERROR_NO_ASSOCIATION;
break;
case 28:
case 29:
case 30:
result = ERROR_DDE_FAIL;
break;
case 32:
result = ERROR_DLL_NOT_FOUND;
break;
default:
if ( result > 32 )
result = 0x2a;
}
}
}
else
result = GetLastError();
if (result != 0x2a) {
LPWSTR errormsg = NULL;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL, result, 0, (LPWSTR)&errormsg, 0, NULL);
MessageBox(NULL, errormsg, TEXT("Error:"), MB_OK | MB_ICONERROR);
LocalFree( errormsg );
return result;
}
else
return NO_ERROR;
}
Peonの偽sudoスクリプトのわずかな改善:
#!/bin/sh
# Drop any option arguments.
while [[ $# -ge 0 && $1 = -* ]]; do
shift
done
"$@"
このスクリプトは、sudoに渡されたオプションをサイレントモードでドロップし、コマンドを実行します(実際に特権を昇格することはありません)。オプションを削除すると、互換性が多少向上します。より完全なラッパースクリプトは、sudoと同じ方法でオプションを実際に解析する必要があります。
sudoをラッパーで置き換えるのではなく、cygstart --action=runas "$@"
この単純な偽のsudoラッパーを使用し、インストールスクリプト自体(またはsudoを使用して実行しようとしているもの)を昇格した特権で実行します。