web-dev-qa-db-ja.com

Cygwinには「sudo」コマンドはありません

Cygwin には Sudo コマンドがないため、実行したいスクリプトが失敗します

./install.sh: line N: Sudo: command not found

これを回避するための標準的な方法は何ですか?スクリプトを編集してSudoを削除しますか? Windows用のSudo- likeツールを入手していますか?

43
Jason Sundram

私は(かなり単純な) TOUACExt for Sudo for CygWin を作成しました。これは、プレベータシェルスクリプトオートメーションで古典的な動作Sudo for Linux:

  • 自動的に開いて閉じる必要に応じてsudoserver.py。
  • リクエスト[〜#〜] uac [〜#〜]高度プロンプト。

インストールは、4つの.shスクリプトをいくつかのパスディレクトリにコピーし、エイリアスを作成して、スレッドで詳しく説明されているいくつかの手順を実行するだけです。

結果:単一のSudo YourCommandを入力すると、残りのプロセスを気にすることなく、その出力を取得できます。

1つの方法は、次の内容で偽の「Sudo」コマンドを作成することです。

#!/usr/bin/bash

"$@"

これにより、install.sh続行します。Sudoが見つかったためです。

これは、実際のSudoのように特権を昇格することはありません。昇格された特権が本当に必要な場合は、管理者特権(XP)のアカウントからcygwin Shellを起動するか、cygwin.batをクリックして"管理者として実行"(Vista、Win7)

35
Peon

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でテスト済み。

23
dotancohen

dotancohenの答えに基づいて 私はエイリアスを使用しています:

alias Sudo="cygstart --action=runas"

外部プログラムの魅力として機能します(ただし、シェル組み込みではありません)。

Sudo chown User:Group <file>
5
thoni56

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;
}
3
tao

Peonの偽のSudoスクリプトのわずかな改善:

#!/bin/sh
# Drop any option arguments.
while [[ $# -ge 0 && $1 = -* ]]; do
  shift
done

"$@"

このスクリプトは、Sudoに渡されたオプションをサイレントにドロップし、コマンドを実行します(実際に特権を昇格することはありません)。オプションを削除すると、互換性が多少向上します。より完全なラッパースクリプトは、実際にはSudoと同じ方法でオプションを解析する必要があります。

Sudoをcygstart --action=runas "$@"を実行するラッパーで置き換えるのではなく、この単純な偽のSudoラッパーを使用して、インストールスクリプト自体(またはSudoを使用して実行しようとしているもの)を実行します。昇格された特権。

2
Gene Pavlovsky