Làm cách nào để kiểm tra xem cygwin mintty / bash có được chạy với tư cách quản trị viên không?


15

Báo cáo sự cố: Cách thanh lịch và mạnh mẽ nhất để kiểm tra nếu mintty bashphiên Cygwin là "Chạy với tư cách quản trị viên"?

Tại sao, cụ thể? Tôi thường có một số minttythiết bị đầu cuối mở khi sử dụng Windows ( minttykhông có tab). Khó xử nhất là khi tôi cần tìm một cửa sổ đầu cuối mà tôi đã bắt đầu bằng cách nhấp chuột phải vào "Chạy với tư cách quản trị viên" khi tôi muốn chạy pinghoặc làm thủ tục một lần khác. Tôi muốn chỉ ra mức độ "chạy như quản trị viên" của phiên cuối cùng một cách trực quan (bằng cách thay đổi bashbiến dấu nhắc shell PS1trong tệp khởi động của tôi ~/.bashrc).

Một số giải pháp tiềm năng nhanh chóng:

  1. Tôi có thể so sánh giá trị của một số biến môi trường. Nhìn nhanh envra sản phẩm có khá nhiều điểm khác biệt. Tuy nhiên, thật khó để nói cái nào đáng tin cậy nhất về tính di động đối với một máy Windows khác (có lẽ đang chạy phiên bản Windows khác nhau).
  2. id, cụ thể hơn id -Gnhiển thị các nhóm khác nhau nếu chạy với tư cách quản trị viên. Trong máy Windows 7 của tôi, tôi có Administratorsrootcác nhóm được thêm vào danh sách. Một lần nữa, tôi không chắc chắn nếu điều này là di động.
  3. Tôi có thể cố gắng viết một tập tin đến một vị trí sẽ thất bại như người dùng bình thường. Nhưng tôi không muốn ghi bất kỳ tập tin nào vào những nơi xa lạ - điều này có thể trong một số tình huống tưởng tượng có khả năng phá hủy (ví dụ như không lưu trữ phương tiện lưu trữ) và điều này dường như hoàn toàn không phù hợp với sở thích của tôi.
  4. Chạy một số chương trình Windows sẽ cho biết bằng trạng thái trả về hoặc đầu ra nếu lệnh được chạy "với tư cách quản trị viên". Tốt nhất là một số mục đích tương tự như id(1)lệnh UNIX (nhưng thực chất tồn tại trong Windows - hoặc Cygwin, nhưng không có quá nhiều bản dịch của các khái niệm hệ thống Windows sang các khái niệm mô phỏng POSIX).

Bất kỳ đề nghị tốt hơn hoặc thanh lịch hơn? Có lẽ cygwin cung cấp một tiện ích lệnh dành riêng cho mục đích này?

Cập nhật: 97% trùng lặp /programming/4051883/batch-script-how-to-check-for-admin-rights/ - sự khác biệt chỉ ở đây khi sử dụng bashthay vì (IMHO kỳ lạ và cổ xưa) Windows cmd.exe. Xin vui lòng kiểm tra câu trả lời và bình luận ở đó.


sử dụng "chạy với tư cách Quản trị viên" trừ khi bạn thực hiện việc này sau đó quy trình không được nâng lên thành quyền của Quản trị viên ngay cả khi tài khoản Quản trị viên bắt đầu quy trình. Chỉ cần tạo một phím tắt để điều này luôn luôn được thực hiện.
Ramhound

1
Tôi khuyên bạn nên thử ConEmu . Nó có các tab, có thể chạy tab như quản trị viên được biểu thị bằng các biểu tượng khác nhau trong thanh tab và quan trọng nhất là sử dụng bảng điều khiển phía sau hậu trường để các ứng dụng windows gốc hoạt động chính xác không giống như trên mintty.
Jan Hudec

2
@Ramhound Bạn đúng rằng vấn đề ban đầu của tôi (phân biệt cửa sổ thiết bị đầu cuối quản trị viên) mà tôi đã thu hẹp vào câu hỏi này có thể được giải quyết bằng cách cắt ngắn cho mintty1. chạy với tư cách quản trị viên, 2. sử dụng tệp cấu hình khác nhau với màu khác nhau cài đặt và 3. sử dụng một biểu tượng thay thế. Nếu bạn mô tả cho công chúng biết cách tạo ra điều này, tôi sẽ cung cấp cho bạn một upvote (trừ khi bạn nói trong câu trả lời của mình rằng nó không thể được thực hiện trong một tập lệnh :-).
FooF

1
@FooF - Chỉ vì bạn chạy một quy trình với người dùng cấp Quản trị viên không có nghĩa là quá trình này đã được leo thang. Windows theo mặc định sẽ chỉ tiết lộ một quy trình nếu người dùng chấp thuận hành động đó do đó tính năng "chạy với tư cách Quản trị viên" trong Windows. Bạn cũng có thể cung cấp TẤT CẢ quyền cho bất kỳ nhóm nào bạn muốn ngay cả Foonhóm người dùng nếu bạn muốn.
Ramhound

1
@FooF - Chỉ cần nghĩ rằng nó sudolà bắt buộc ngay cả khi bạn đang chạy như một người dùng root.
Ramhound

Câu trả lời:


9

Tôi chỉ viết chức năng này cho cùng một lý do. Tôi không bao giờ biết shell nào có đặc quyền admin.

function isadmin()
{
    net session > /dev/null 2>&1
    if [ $? -eq 0 ]; then echo "admin"
    else echo "user"; fi
}

Nó được điều chỉnh từ câu trả lời này /programming//a/11995662/307968 cho windows cmd shell. Phiên Net trả về 0 trạng thái nếu bạn là quản trị viên.

Bây giờ tôi chỉ cần thay đổi lời nhắc của mình, hoặc có thể là màu thanh tiêu đề ....


Đẹp tìm thấy. Mặc dù dường như có trường hợp cạnh mà điều này quá thất bại, nếu bạn kiểm tra các bình luận stackoverflow.
FooF

Tuy nhiên, tôi đã chấp nhận câu trả lời này vì nó chỉ ra một cuộc thảo luận toàn diện (câu hỏi stackoverflow và câu trả lời được chấp nhận hiện có điểm số lần lượt là 147 và 255).
FooF

Cảm ơn! Tôi sử dụng điều này để chọn lọc màu tên người dùng trong lời nhắc của tôi. Nếu giá bán tăng, tôi tô màu đỏ, nếu không thì màu xanh lá cây. Hữu ích để theo dõi những cái vỏ nào được nâng lên nếu bạn có nhiều cửa sổ đầu cuối mở.
HelloGoodbye

16

Câu trả lời dứt khoát cho câu hỏi này đến từ danh sách gửi thư của Cygwin . Một quy trình đang chạy với quyền Quản trị viên nếu người dùng đã khởi động nó là một phần của nhóm 544 (Quản trị viên). Cũng từ nhận xét dưới đây của Cromax, có vẻ như nhóm 114 (Tài khoản cục bộ và thành viên của nhóm Quản trị viên) đôi khi cũng có mặt. Bài kiểm tra cho hai nhóm này là

id -G | grep -qE '\<(114|544)\>'

Ví dụ,

id -G | grep -qE '\<(114|544)\>' && echo admin || echo user

Trước đây bạn cũng cần kiểm tra nhóm 0, nhóm gốc trong / etc / group. Nhưng / etc / group không còn được cài đặt trong Cygwin và thường nên được gỡ bỏ nếu có, vì vậy không nên kiểm tra nhóm 0 nữa. Chỉ cần nhóm 544.


1
Cảm ơn bạn đã hỏi trong danh sách gửi thư của Cygwin. :-) Rất vui khi biết rằng id nhóm (giả lập / dịch) không đổi giữa các hệ thống.
FooF

Chắc chắn ... tôi muốn biết bản thân mình, và những người ở đó biết .
Andrew Schulman

1
Thật không may, điều này không hoạt động trong Mingw / Msys. Câu trả lời của Steven có, mặc dù chỉ có trên Windows 7.
sparrowt 14/03/2016

1
Tôi đã thử điều đó (trên W7) và nó không hoạt động, nhưng tôi nhận thấy rằng nếu người dùng của Window được đăng nhập cũng là quản trị viên, thì khi Cygwin được điều hành với tư cách quản trị viên, có một nhóm khác xuất hiện trong idđầu ra, cụ thể là 114 (Tài khoản cục bộ và thành viên của nhóm Quản trị viên). Vì vậy, id -G | grep -qE '\<(114|544)\>' && echo admin || echo user
regrec

Cảm ơn. Bản thân tôi chưa thấy điều đó, nhưng tôi thấy nhóm 114 dường như là một nhóm Quản trị viên, vì vậy có vẻ hợp lý để kiểm tra nó. Tôi sửa lại câu trả lời.
Andrew Schulman

7

Tôi sử dụng giá trị trả về của chương trình Windows at. Tôi cũng đã tạo lại chức năng của nhân vật đặc biệt KHUYẾN MÃI \$.

# Set a white $ initially
eStyle='\[\e[0m\]$'

# If 'at' succeeds, use a red # instead
at &> /dev/null && eStyle='\[\e[0;31m\]#\[\e[0m\]'  # Use # in red

PS1='\n\[\e[0;32m\]\u@\h \[\e[0;33m\]\w\[\e[0m\]\n'"$eStyle "

Ví dụ


Giả sử không có idlệnh UNIX tương đương trong Windows, tôi chấp nhận đây là câu trả lời đúng. Ít nhất là chạy atlệnh mà không có bất kỳ đối số dường như không có bất kỳ tác dụng phụ. Tôi sẽ sử dụng phương pháp này trong .bashrctập tin của tôi từ bây giờ! Cảm ơn đã hack.
FooF

1
dường như không hoạt động trên windows8.1
zzapper

1
@zzapper Xin hãy cụ thể hơn. Điều gì xảy ra / không xảy ra? Thông báo lỗi?
Steven

4
id trả về cùng một giá trị, thay vào đó, không sử dụng
scht task.exe,

2

id -G | grep -qE '\<(544|0)\>'dường như không làm việc cho tôi, vì sản lượng của tôi không có <> hoặc 544 ngay cả khi tăng. Tuy nhiên, vì độ cao là cần thiết để ghi vào %WINDIR%\system32, tôi đã sử dụng nó để kiểm tra độ cao với hàm shell:

is_elevated() { 
   [[ $(uname -o) -eq "Cygwin" ]] || return 1
   touch $WINDIR/system32/.cyg_elevated &> /dev/null
}

Khi áp dụng cho ý tưởng tuyệt vời của Steven về một nhân vật băm đỏ:

is_elevated && PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\[\e[0;31m\]#\[\e[0m\] '

1

Làm điều gì đó mà chỉ quản trị viên mới có thể làm và kiểm tra thành công hay thất bại: -

if touch c:/Users/.x ; then  echo 'ok'  ; fi

hoặc là

touch c:/Users/.x && echo ok

hoặc là

touch c:/Users/.x && \rm c:/Users/.x && echo ok

hoặc là

touch c:/Users/.x  &> /dev/null && \rm c:/Users/.x && echo you are admin

1

Trong Msys trên Windows hãy thử điều này (tôi thấy câu trả lời được chấp nhận không hoạt động trong Msys)

at &> /dev/null && echo "Running as admin" || echo "NOT running as admin"

Điều này phụ thuộc vào mã trả về atbằng 0 chỉ khi chạy với tư cách quản trị viên.


1
Đây có vẻ là phương pháp tương tự như @Steven đã đưa ra câu trả lời trước đó (dường như không hoạt động trên Windows 8.1 theo một nhận xét - trừ khi MSYS "tại" bằng cách nào đó). Trong khi câu hỏi là về Cygwin, thật thú vị khi so sánh với MSYS tương tự. Cảm ơn sự đóng góp.
FooF

Rất giống nhau Tuy nhiên, tôi đã kết thúc câu hỏi này khi cố gắng sử dụng nó để kiểm tra tập lệnh (Win7, Msys) thay vì đặt kiểu dấu nhắc bash, vì vậy tôi nghĩ rằng điều này có thể được sử dụng cho người khác làm điều tương tự
sparrowt

Tôi đồng ý về sự hữu ích.
FooF
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.