Cygwin には Sudo コマンドがないため、実行したいスクリプトが失敗します
./install.sh: line N: Sudo: command not found
これを回避するための標準的な方法は何ですか?スクリプトを編集してSudo
を削除しますか? Windows用のSudo
- likeツールを入手していますか?
私は(かなり単純な) TOUACExt for Sudo for CygWin を作成しました。これは、プレベータシェルスクリプトオートメーションで古典的な動作Sudo
for Linux:
インストールは、4つの.sh
スクリプトをいくつかのパスディレクトリにコピーし、エイリアスを作成して、スレッドで詳しく説明されているいくつかの手順を実行するだけです。
結果:単一のSudo YourCommand
を入力すると、残りのプロセスを気にすることなく、その出力を取得できます。
1つの方法は、次の内容で偽の「Sudo」コマンドを作成することです。
#!/usr/bin/bash
"$@"
これにより、install.sh
続行します。Sudoが見つかったためです。
これは、実際のSudoのように特権を昇格することはありません。昇格された特権が本当に必要な場合は、管理者特権(XP)のアカウントからcygwin Shellを起動するか、cygwin.batをクリックして"管理者として実行"(Vista、Win7)
cygwinメーリングリスト で答えを見つけました。 Cygwinで管理者特権でcommand
を実行するには、次のようにコマンドの前に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でテスト済み。
dotancohenの答えに基づいて 私はエイリアスを使用しています:
alias Sudo="cygstart --action=runas"
外部プログラムの魅力として機能します(ただし、シェル組み込みではありません)。
Sudo chown User:Group <file>
Windows™のSudo(昇格)
Windows™のコマンドラインで多くの作業を行います。
Cygwin自体では、su -c /the/cmd
を使用してrootコマンドを実行し、Windows™ファイルシステム内でSudo自体を実行できるため、コマンドラインからユーザーの権限を昇格できます。管理者であれば、これはうまく機能します。それ以外の場合は、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を使用して実行しようとしているもの)を実行します。昇格された特権。