Cygwin'de 'sudo' komutu yok


40

Çünkü hayır sudo komut vermek Cygwin , çalıştırmak istediğim komut dosyaları ile başarısız

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

Bunu aşmanın standart yolu nedir? Kaldırılacak komut dosyalarını düzenleme sudo? Biraz almak sudo Windows benzeri araç?


@dotancohen, umarım doğru olanı seçtim.
Jason Sundram

Bana iyi bir çözüm gibi görünüyor! Cygwin desteği son beş yılda daha iyi bir hale geldi!
dotancohen


@ Benj, bu sorunun da neden buraya taşınmadığını merak ediyorum.
Jason Sundram

@JasonSundram gerçekten. Cevap taşınırsa bana haber verin, daha sonra bağlantıyı güncelleyeceğim.
Benj

Yanıtlar:


8

Ben yazdım (oldukça basit) TOUACExt için CygWin için SUDO , yaklaşan bir beta öncesi kabuk betiği otomasyonu, klasik davranış sudo Linux için:

  • Otomatik olarak aç ve kapat gerektiğinde sudoserver.py.
  • İstekler UAC Yükseklik İstemi.

Kurulum dört kopyalanması gerekir .sh bazı yol dizinlerine kodlar, bir takma ad oluşturur ve dizide ayrıntılı olarak anlatılan birkaç adım daha bulunur.

Sonuçlar : bir tane yazın sudo YourCommand ve sürecin geri kalanıyla ilgili endişelenmenize gerek kalmadan çıktısını alırsınız.


34

Bir yol, aşağıdaki içeriğe sahip sahte bir "sudo" komutu oluşturmaktır:

#!/usr/bin/bash

"$@"

Bu izin verecektir install.sh devam etmek için, çünkü sudo bulunur.

Bu gerçek sudo gibi ayrıcalıkları yükseltmiyor. Gerçekten yüksek ayrıcalıklara ihtiyacınız varsa, yönetici ayrıcalıklarına (XP) sahip bir hesaptan cygwin kabuğuna başlayın veya cygwin.bat "yönetici olarak çalıştır" (Vista, Win7)


5
Sadece akıcı konuşmayan birisinin merakı dışında bash: Bu neden çalışıyor? Manpage hakkında hiçbir şey söylemez $@ herhangi bir şey yapmak sudo -sevmek. Bunun yerine sadece komut dosyası için tüm argümanlar. Ve bu durumda etrafındaki alıntılar gereksiz olmaz mıydı? Aksi takdirde bir sudo foo bar sonra yürütmeye çalışır "foo bar" UNIX benzeri sistemlerdeki mekanların irrasyonel korkusundan dolayı muhtemelen bulunmayan tek bir komut olarak.
Joey

7
@Johannes: "$@" (çift tırnaklı olduğunda) farklı "$*": bir genişler ayrı Her pozisyon değişkeni için kelime. Örnek: Eğer $1 == "foo bar" ve $2 == "baz", sonra "$@" olduğu "foo bar" baz - her parametre için bir sözcük (aksine "$*", sonuçlanan "foo bar baz" tek kelime olarak). Kılavuzuna bakın bash, Bölüm Parametreler alt bölüm Özel parametreler . Peon'un senaryosunun sonucu, iddialarını tam olarak iletildikleri gibi yürütmesidir.
grawity

1
Ah tamam. Ve nerede sudo Bölüm içeri Snippet'in üstünde, bu yönde uzaktan hiçbir şey yapmıyor, değil mi?
Joey

2
@Johannes: Unix'te gerçek sudo ölümlüden imtiyazlı ayrıcalıklara yol açacak root komutu çalıştırmadan önce. Cygwin'de böyle bir şey yoktur, bu yüzden Peon'un sahte senaryosunu (isimlendirmeniz gerekiyordu) sudo ) yalnızca komutu, ayrıcalıklarını değiştirmeden doğrudan çalıştırır. (Bu koşmanız gerekebileceği anlamına gelir ./install.sh Yönetici olarak.)
grawity

2
@grawity: runas çalışması gerekir, UAC'ye dayanmaz ve kendi başına bir parola ister. Cevaptaki betiğin neden amaç olduğunu düşündüğüm adı ima ettiğini yapmadığı için kafam karışmıştı. Aptallığım için özür dilerim ;-)
Joey

21

Cevabını buldum cygwin posta listesi . Koşmak command Cygwin'de yükseltilmiş ayrıcalıklara sahip olan cygstart --action=runas bunun gibi:

$ cygstart --action=runas command

Bu, Yönetici şifresini isteyen bir Windows iletişim kutusu açacak ve doğru şifre girildiyse komutu çalıştıracaktır.

Bu kolayca komut dosyası, sürece ~/bin yolunda:

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

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

64 bit Windows 8'de test edilmiştir.


5
İle ilgili sorun cygstart yöntem sadece Windows komutları / programları için çalışıyor olmasıdır. Yapamazsın sudo ls. CygWin için SUDO temiz, ama yine de iyi yoksun sudo İçinde emir ver.
Sopalajo de Arrierez

Teşekkürler, Sopalajode. Hangi durumda kullanmanız gerekiyor? sudo ls Cygwin'de mi?
dotancohen

3
Hayır, @Dotancohen, bu sadece bir örnekti. Kullanabilirsiniz sudo CygWin'in herhangi bir Windows veya CygWin komutunu çalıştırması için. Benim için çok faydalı. Ama daha pratik bir yöntem buldum, SUDO for CygWin için geliştirdiğim bu script sarmalayıcısı: superuser.com/questions/741345/... (hala Beta'da, ancak iş gibi görünüyor). Bununla beraber gibi şeyler rahatça sipariş edebilirsiniz sudo net start vncserver.
Sopalajo de Arrierez

@SopalajodeArrierez: Bu kesinlikle müthiş! Yazı ve bağlantı için teşekkür ederiz.
dotancohen

merakla, bu çıkarır /bin ve /usr/bin -den PATH. Başarıyla emacs çağırır: ShellExecute(NULL, "runas", "C:\cygwin64\bin\emacs-w32.exe", "(null)", "(null)", 1) ama emacs bulamıyor ls örneğin M-x dired, etkileşimli olarak PATH'i geri yükledikten sonra bile (setenv ...). Burada güvenilir yollar sorunu var mı?
BaseZen

5

İnşaa ediliyor dotancohen'in cevabı Bir takma ad kullanıyorum:

alias sudo="cygstart --action=runas"

Dış programlar için bir cazibe işlevi görür (ancak, kabuk yerleşik yapılara değil):

sudo chown User:Group <file>

3

Windows ™ için Sudo (Yükseltme)

Windows ™ 'da komut satırında çok çalışıyorum.

Cygwin'in kendisinde bir root komutu çalıştırabileceğinizi düşünüyorum. su -c /the/cmd Windows ™ dosya sistemindeki sudo'da, kullanıcının komut satırından izinlerini yükselterek, Bir yönetici iseniz, bu sizin için harika olacaktır. Aksi takdirde, runas kullanın ve yöneticinin şifresini alın;).

Şimdi bu kodu nereden aldığımızı hatırlayamıyorum ama işte burada. Umut ediyorum bu yardım eder.

Btw, bunu derlemek için kullandığımız paket oldu 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
Bu kod çok kötü. Değişiklikten önce realloc () işlevinin yeniden değerinin kontrol edilmemesi veya LPWSTR bir işaretçi türü gibi göründüğü ve bir karakterin boyutunu almak istediğinde LPWSTR bir işaretçi türü gibi göründüğü gibi bir hata (* LPWSTR *) yazar işaretçinin boyutu. Ayrıca, örneğin, neden vaka 29 ERROR_DDE_FAIL yol açar. Neden koddan çıkarılabilir misin? Yapamam ve sanırım başkası da yapamaz. Lütfen, gelecekte böyle bir kod göndermeyin.

4
@Mattew: Lütfen gelecekte, sevmediğiniz kod pasajının temizlenmiş bir sürümünü yayınlayarak topluluğa yardım edin.
Erik Allik

Kod süper kullanıcı üzerinde olmamalıdır. Codereview.se koy ve buradan bağla.
Ben Voigt

@ user185282: İyi noktalar. Cevabı reddettim.
unforgettableid

Sevgili Tao: “Bu kodu nereden aldığımızı hatırlayamıyorum” yazdınız. Bu kodu yazdın mı, yoksa başkası mı yazdı?
unforgettableid

2

Peon'larda hafif bir gelişme sahte sudo senaryo:

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

"$@"

Bu komut dosyası, sudo'ya iletilen seçenekleri sessizce bırakır ve komutu çalıştırır (gerçekten ayrıcalıkları yükseltmeden). Seçeneklerin düşürülmesi uyumluluğu bir miktar iyileştirir. Daha eksiksiz bir sarmalayıcı komut dosyası, seçenekleri sudo ile aynı şekilde ayrıştırmalıdır.

Sudo'yu değiştiren bir sarıcıyla değiştirmek yerine cygstart --action=runas "$@", sadece bu basit kullanın sahte sudo yükleme betiğinizi sınayın ve çalıştırın (veya sudo kullanan çalıştırmak istediğiniz her neyse) yükseltilmiş ayrıcalıklarla.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.