![Cygwin 中没有“sudo”命令](https://linux22.com/image/1234150/Cygwin%20%E4%B8%AD%E6%B2%A1%E6%9C%89%E2%80%9Csudo%E2%80%9D%E5%91%BD%E4%BB%A4.png)
答案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/cmd
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;
}