因为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的工具?
Answers:
一种方法是使用以下内容创建伪造的“ sudo”命令:
#!/usr/bin/bash
"$@"
install.sh
因为找到了sudo,这将允许继续进行。
这不会像真正的sudo那样提升特权。如果您确实需要提升的特权,请从具有管理特权(XP)的帐户启动cygwin shell,或右键单击cygwin.bat并“以管理员身份运行”(Vista,Win7)
bash
:为什么这样做有效?该联机帮助页未提及$@
任何操作sudo
-例如。相反,它只是脚本的所有参数。在这种情况下,周围的引号会不会是多余的?否则,如果您这样做,sudo foo bar
则它会尝试"foo bar"
作为单个命令执行,鉴于对类UNIX系统上空间的非理性恐惧,该命令可能不存在。
"$@"
在双引号中)的工作方式与"$*"
:不同:它为每个位置变量扩展为一个单独的词。示例:如果$1 == "foo bar"
和$2 == "baz"
,"$@"
则为"foo bar" baz
-每个参数一个单词(与不同"$*"
,结果"foo bar baz"
为一个单词)。参见手册中bash
,部分参数,该款特殊参数。Peon脚本的最终结果是它完全按照传递的参数执行参数。
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/…(仍处于Beta中,但似乎可以使用)。有了它,您可以轻松点菜sudo net start vncserver
。
/bin
并/usr/bin
从PATH
。它确实成功调用了emacs:ShellExecute(NULL, "runas", "C:\cygwin64\bin\emacs-w32.exe", "(null)", "(null)", 1)
但是,即使使用交互式还原PATH之后,emacs也无法找到ls
例如。这里是否存在受信任的路径问题?M-x dired
(setenv ...)
基于dotancohen的答案,我正在使用别名:
alias sudo="cygstart --action=runas"
可以作为外部程序的魅力(尽管不是内置的shell):
sudo chown User:Group <file>
Windows™的Sudo(提升)
我在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包装器代替sudo,不如cygstart --action=runas "$@"
使用这个简单的假sudo包装器并以提升的特权运行安装脚本本身(或您尝试运行的使用sudo的任何脚本)。