Cygwin 中没有“sudo”命令

Cygwin 中没有“sudo”命令

因为没有须藤命令赛格威,我想运行的脚本失败

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

解决这个问题的标准方法是什么?编辑脚本以删除sudo?获取一些sudo适用于 Windows 的类似工具?

答案1

我写了(相当简单)TOUACExt为了CygWin 的 SUDO,一个预测试版的 shell 脚本自动化,接近古典行为 sudo对于 Linux:

  • 自动打开和关闭需要时执行 sudoserver.py。
  • 要求联合航空海拔提示。

安装需要将四个.sh脚本复制到某个路径目录,创建一个别名,并执行线程中详述的几个步骤。

结果:您输入一个单词sudo YourCommand并得到它的输出,而不必担心其余的过程。

答案2

一种方法是创建一个伪造的“sudo”命令,内容如下:

#!/usr/bin/bash

"$@"

这将允许install.sh继续,因为找到了 sudo。

这不会像真正的 sudo 那样提升权限。如果您确实需要提升权限,请从具有管理权限 (XP) 的帐户启动 cygwin shell,或者右键单击 cygwin.bat 并“以管理员身份运行”(Vista、Win7)

答案3

我找到了答案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 上测试。

答案4

适用于 Windows™ 的 Sudo (Elevate)

我在 Windows™ 的命令行上做了很多工作。

我相信,在 Cygwin 中,您可以在 Windows™ 文件系统中运行 root 命令,就像su -c /the/cmdsudo 本身一样,从命令行提升用户的权限,如果您是管理员,这将非常有用。否则,请使用 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;
}

相关内容