Cygwin में कोई 'sudo' कमांड नहीं है


41

क्योंकि Cygwin में कोई sudo कमांड नहीं है , जो स्क्रिप्ट मैं चलाना चाहता / चाहती हूं

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

इसके आस-पास होने का मानक तरीका क्या है? स्क्रिप्ट हटाने के लिए संपादन sudo? sudoविंडोज के लिए कुछ समान टूल प्राप्त करना ?


@dotancohen, मुझे आशा है कि मैंने सही उठाया।
जेसन सुंदरम

मेरे लिए एक अच्छा समाधान की तरह लग रहा है! Cygwin समर्थन पिछले पांच वर्षों में बेहतर हो गया है!
dotancohen


@Benj, मुझे आश्चर्य है कि क्यों यह सवाल यहाँ भी माइग्रेट नहीं हुआ।
जेसन सुंदरम

@JasonSundram वास्तव में। मुझे बताएं कि यदि उत्तर स्थानांतरित हो गया है, तो मैं लिंक को अपडेट करूंगा।
बेंज ०

जवाबों:


8

मैंने CygWin के लिए SUDO के लिए (बल्कि सरल) TOUACExt , एक पूर्व-बीटा शेल स्क्रिप्ट स्वचालन लिखा था जो लिनक्स के लिए शास्त्रीय के व्यवहार के लिए दृष्टिकोण sudo:

  • जरूरत पड़ने पर sudoserver.py को स्वचालित रूप से खोलें और बंद करें
  • अनुरोध UAC उन्नयन संकेत

स्थापना को चार .shस्क्रिप्ट्स को कुछ पथ निर्देशिका में कॉपी करने की आवश्यकता है , एक उपनाम बनाने और थ्रेड में विस्तृत कुछ और कदम।

परिणाम : आप एक एकल टाइप करते हैं sudo YourCommandऔर आपको इसका उत्पादन मिलता है, बाकी प्रक्रिया के बारे में चिंता किए बिना।


35

निम्न सामग्री के साथ एक नकली "sudo" कमांड बनाने का एक तरीका है:

#!/usr/bin/bash

"$@"

यह install.shजारी रखने की अनुमति देगा , क्योंकि सूडो पाया जाता है।

यह वास्तविक sudo की तरह विशेषाधिकारों को नहीं बढ़ाता है। अगर आपको वास्तव में उच्चीकृत विशेषाधिकार की आवश्यकता है, तो प्रशासनिक विशेषाधिकार (XP) या साइबरगन पर r-click करें और "एडमिनिस्ट्रेटर के रूप में चलाएं" (Vista, Win7) के साथ एक खाते से cygwin खोल शुरू करें


5
किसी ऐसे व्यक्ति की जिज्ञासा से बाहर जो धाराप्रवाह नहीं बोलता bash: यह काम क्यों करता है? मैनपेज के बारे में कुछ नहीं कहा $@कुछ भी करने sudoकी तरह। इसके बजाय यह स्क्रिप्ट के सभी तर्क हैं। और इसके आस-पास के उद्धरण उस मामले में बहुत अधिक नहीं होंगे? अन्यथा यदि आप ऐसा करते हैं sudo foo barतो यह "foo bar"एकल कमांड के रूप में क्रियान्वित होने की कोशिश करता है जो संभवतः मौजूद नहीं है जो UNIX- जैसी प्रणालियों पर रिक्त स्थान का तर्कहीन भय है।
जोए

7
@ जोहान्स: "$@"(जब डबल-कोट्स) अलग तरीके से काम करता है "$*": यह हर पॉजिटिव वेरिएबल के लिए एक अलग शब्द में फैलता है । उदाहरण: यदि $1 == "foo bar"और $2 == "baz", तो "$@"है "foo bar" baz- प्रत्येक पैरामीटर के लिए एक शब्द (विपरीत "$*", में जो परिणाम "foo bar baz"एक के रूप में शब्द)। bash, मैनुअल पैरामीटर्स , उपधारा विशेष मापदंडों के मैनुअल देखें । चपरासी की स्क्रिप्ट का अंतिम परिणाम यह है कि यह अपने तर्कों को ठीक उसी तरह निष्पादित करता है जैसे वे पारित किए गए थे।
ग्रेविटी

1
आह अच्छा। और sudoभाग कहाँ आता है? ऊपर स्निपेट उस दिशा में दूर से कुछ भी नहीं करता है, है ना?
जॉय

2
@ जोहान्स: यूनिक्स में, एक वास्तविक कमांड चलाने sudoसे rootपहले नश्वर से विशेषाधिकारों को बढ़ाएगा । साइग्विन में, ऐसी कोई चीज नहीं है, इसलिए चपरासी की नकली स्क्रिप्ट (जिसे आप नाम देना चाहते हैं sudo) सिर्फ अपने विशेषाधिकार को बदले बिना सीधे कमांड चलाता है। (इसका मतलब है कि आपको ./install.shप्रशासक के रूप में दौड़ने की आवश्यकता हो सकती है ।)
grawity

2
@ शुद्धता: runasकाम करना चाहिए, यह UAC पर निर्भर नहीं करता है और पासवर्ड के लिए संकेत देता है। मैं सिर्फ इस उलझन में था कि उत्तर में स्क्रिप्ट ने जाहिरा तौर पर ऐसा क्यों नहीं किया, जिसका नाम निहित था जो मैंने माना था वह लक्ष्य था। मेरी मूर्खता के लिए खेद है ;-)
जॉय

21

मुझे इसका जवाब साइबर मेलिंग सूची में मिलाcommandसाइग्विन में उन्नत विशेषाधिकारों के साथ चलने के लिए , cygstart --action=runasइस तरह से कमांड को पूर्ववर्ती करें:

$ cygstart --action=runas command

यह व्यवस्थापक पासवर्ड के लिए पूछते हुए एक विंडोज डायलॉग बॉक्स खोलेगा और यदि उचित पासवर्ड दर्ज किया गया है तो कमांड चलाएगा।

यह आसानी से स्क्रिप्टेड है, जब तक ~/binआपके रास्ते में है:

$ cat ~/bin/sudo
#!/usr/bin/bash
cygstart --action=runas "$@"

$ PATH=$HOME/bin:$PATH
$ chmod +x ~/bin/sudo
$ sudo elevatedCommand

64-बिट विंडोज 8 पर परीक्षण किया गया।


5
cygstartविधि के साथ समस्या यह है कि यह केवल विंडोज कमांड / प्रोग्राम के लिए काम करता है। आप नहीं कर सकते sudo ls। CygWin के लिए SUDO नीट है, लेकिन फिर भी इसमें कुछ अच्छे sudoकमांड का अभाव है।
शोपाजो डे एरियेरेज़

शुक्रिया, सोजाजोडे। sudo lsसिगविन में आपको किस स्थिति में उपयोग करने की आवश्यकता है?
डॉटनचेन १oh

3
ओह, नहीं, @ डोटानोहेन, यह सिर्फ एक उदाहरण था। आप sudoकिसी भी Windows या CygWin कमांड को चलाने के लिए CygWin का उपयोग कर सकते हैं । यह मेरे लिए बहुत उपयोगी है। लेकिन जितना अधिक व्यावहारिक तरीका मुझे मिला है वह साइग्विन के लिए SUDO के लिए यह स्क्रिप्ट आवरण है जिसे मैंने विकसित किया: superuser.com/questions/741345/… (अभी भी बीटा में, लेकिन काम करने लगता है)। इसके साथ आप आराम से चीजों को ऑर्डर कर सकते हैं sudo net start vncserver
सिल्पाजो डे एरियेरेज़

@ गोपालजोदरात्रि: यह बिल्कुल भयानक है! पोस्ट और लिंक के लिए धन्यवाद।
१२:१४

उत्सुकता से, यह /binऔर बाहर /usr/binसे स्ट्रिप्स PATH। यह सफलतापूर्वक emacs आह्वान करता है: ShellExecute(NULL, "runas", "C:\cygwin64\bin\emacs-w32.exe", "(null)", "(null)", 1)लेकिन फिर emacs lsउदाहरण के M-x diredलिए पाथ को बहाल करने के बाद भी, जैसे कि पा सकते हैं (setenv ...)। क्या यहां एक विश्वसनीय मार्ग मुद्दा है?
बेसजेन

5

Dotancohen के उत्तर पर निर्माण मैं एक उपनाम का उपयोग कर रहा हूं:

alias sudo="cygstart --action=runas"

बाहरी कार्यक्रमों के लिए एक आकर्षण के रूप में काम करता है (शेल निर्मित नहीं है, हालांकि):

sudo chown User:Group <file>

3

विंडोज ™ के लिए सूडो (एलिवेट)

मैं विंडोज ™ में कमांड लाइन पर बहुत काम करता हूं।

Cygwin में ही मेरा मानना ​​है कि आप su -c /the/cmdकमांड लाइन से उपयोगकर्ता की अनुमति को बढ़ाते हुए Windows ™ फ़ाइल-सिस्टम के भीतर sudo के लिए एक रूट कमांड चला सकते हैं , यदि आप एक व्यवस्थापक हैं, तो यह आपके लिए बहुत अच्छा काम करेगा। अन्यथा, रनस का उपयोग करें और व्यवस्थापक का पास प्राप्त करें;)।

अब मुझे याद नहीं आ रहा है कि हमें यह कोड कहां मिला है लेकिन यहां यह है। मुझे उम्मीद है यह मदद करेगा।

BTW, जिस पैकेज को हम संकलित करने के लिए उपयोग करते हैं वह था 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;
}

5
यह कोड भयानक है। यह त्रुटियों से भरा है जैसे कि डायरफ्रेंसिंग या राइटिंग साइफ़ (एलपीडब्ल्यूएसटीआर) से पहले साइज़लॉफ़ (* एलपीडब्ल्यूएसटीआर) के बजाय रियललोक () के रिटर्न वैल्यू की जांच नहीं करना जहां एलपीडब्ल्यूटीएस एक पॉइंटर प्रकार लगता है और कोई एक वर्ण का आकार प्राप्त करना चाहता है, न कि सूचक का आकार। इसके अलावा, यह पूरी तरह से स्पष्ट नहीं है कि उदाहरण के लिए मामला 29 ERROR_DDE_FAIL की ओर क्यों जाता है। क्या आप कोड से निष्कर्ष निकाल सकते हैं क्यों? मैं नहीं कर सकता और मुझे लगता है कि कोई और भी नहीं कर सकता। कृपया, भविष्य में ऐसे कोड को पोस्ट न करें।

4
@Mattew: कृपया भविष्य में आप जिस कोड को नापसंद करते हैं, उस कोड के साफ किए गए संस्करण को पोस्ट करके समुदाय की मदद करें।
एरिक एलिक

कोड सुपरयुसर पर नहीं होना चाहिए इसे codereview.se पर डालें, और बस इसे यहाँ से लिंक करें।
बेन वोइगट

@ user185282: अच्छे अंक। मैंने उत्तर को नीचे कर दिया है।
अविस्मरणीय

प्रिय ताओ: आपने लिखा है, "मुझे याद नहीं है कि हमें यह कोड कहाँ मिला है"। क्या आपने यह कोड लिखा था, या किसी और ने इसे लिखा था?
अविस्मरणीय

2

चपरासी की नकली सूद लिपि पर थोड़ा सुधार :

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

"$@"

यह स्क्रिप्ट चुपचाप सूडो को दिए गए किसी भी विकल्प को छोड़ देती है और कमांड को निष्पादित करती है (वास्तव में विशेषाधिकार को बढ़ाए बिना)। विकल्पों को छोड़ने से संगतता में कुछ हद तक सुधार होता है। एक अधिक संपूर्ण आवरण लिपि को वास्तव में उसी तरह विकल्पों को पार्स करना चाहिए जिस तरह से सूडो करता है।

सुडो को एक रैपर के साथ बदलने की कोशिश करने के बजाय cygstart --action=runas "$@", बस इस सरल नकली सूदो रैपर का उपयोग करें और अपनी इंस्टॉल स्क्रिप्ट को स्वयं चलाएं (या जो भी आप सुडो का उपयोग करने की कोशिश कर रहे हैं) को उन्नत विशेषाधिकार के साथ चलाएं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.