จะตรวจสอบว่า cygwin mintty / bash ทำงานเป็นผู้ดูแลระบบได้อย่างไร?


15

คำแถลงปัญหา:วิธีที่ดีที่สุดในการทดสอบว่าmintty bashเซสชันCygwin คือ "Run as adminstrator" คืออะไร?

ทำไมโดยเฉพาะ ปกติฉันมีminttyเทอร์มินัลหลายเครื่องเปิดเมื่อใช้ Windows ( minttyไม่มีแท็บ) สิ่งที่น่าอึดอัดที่สุดคือเมื่อฉันต้องการค้นหาหน้าต่างเทอร์มินัลที่ฉันเริ่มต้นด้วยการคลิกขวาที่ "Run as administrator" เมื่อเช่นฉันต้องการเรียกใช้pingหรือขั้นตอนแบบครั้งเดียวอื่น ๆ ฉันต้องการระบุ "run as administrator" -ness ของเซสชันเทอร์มินัลด้วยภาพ (โดยการเปลี่ยนbashตัวแปร shell prompt PS1ในไฟล์เริ่มต้นของฉัน~/.bashrc)

วิธีแก้ปัญหาที่อาจเกิดขึ้นอย่างรวดเร็ว:

  1. ฉันสามารถเปรียบเทียบค่าของตัวแปรสภาพแวดล้อมบางอย่าง โดยการดูอย่างรวดเร็วของการenvส่งออกมีความแตกต่างค่อนข้างมาก อย่างไรก็ตามเป็นการยากที่จะบอกว่าส่วนใดที่เชื่อถือได้มากที่สุดในแง่ของการพกพาไปยังเครื่อง Windows เครื่องอื่น (อาจใช้ Windows รุ่นอื่น)
  2. idid -Gnแสดงกลุ่มที่แตกต่างกันโดยเฉพาะหากเรียกใช้ในฐานะผู้ดูแลระบบ ในเครื่อง Windows 7 ของฉันฉันมีAdministratorsและrootเพิ่มกลุ่มในรายการ อีกครั้งฉันไม่แน่ใจว่ามันพกพาได้หรือไม่
  3. ฉันสามารถลองเขียนไฟล์ไปยังตำแหน่งที่อาจล้มเหลวในฐานะผู้ใช้ปกติ แต่ฉันไม่ต้องการที่จะเขียนไฟล์ใด ๆ ไปยังสถานที่แปลก ๆ ซึ่งสิ่งนี้อาจเกิดขึ้นได้ในบางสถานการณ์ที่อาจจะเป็นอันตราย (เช่นความล้มเหลวของสื่อเก็บข้อมูล) และสิ่งนี้ดูเหมือนว่าจะไม่ค่อยเหมาะสมกับรสนิยมของฉัน
  4. เรียกใช้โปรแกรม Windows บางตัวที่จะบ่งบอกสถานะการส่งคืนหรือเอาท์พุทหากคำสั่งนั้นรัน "เป็นผู้ดูแลระบบ" ส่วนที่ดีที่สุดควรมีจุดประสงค์คล้ายกับid(1)คำสั่งUNIX (แต่มีอยู่ใน Windows - หรือ Cygwin แต่ไม่มีการแปลแนวคิดของระบบ Windows เป็นแนวคิดที่เลียนแบบ POSIX มากเกินไป)

ข้อเสนอแนะที่ดีกว่าหรือสง่างามมากขึ้น? บางที cygwin มีโปรแกรมอรรถประโยชน์คำสั่งสำหรับวัตถุประสงค์นี้โดยเฉพาะหรือไม่?

อัปเดต: 97% ซ้ำจาก/programming/4051883/batch-script-how-to-check-for-admin-rights/-ความแตกต่างเป็นเพียงการใช้bashWindows แทน (IMHO แปลกและเก่า) cmd.exe. กรุณาตรวจสอบคำตอบและข้อคิดเห็นที่นั่น


ใช้ "เรียกใช้ในฐานะผู้ดูแลระบบ" เว้นแต่คุณจะทำเช่นนั้นกระบวนการจะไม่ได้รับการยกระดับเป็นสิทธิ์ของผู้ดูแลระบบแม้ว่าบัญชีผู้ดูแลระบบจะเริ่มต้นกระบวนการ เพียงสร้างทางลัดเพื่อทำสิ่งนี้เสมอ
Ramhound

1
ผมขอแนะนำให้พยายามConEmu มันมีแท็บสามารถเรียกใช้แท็บตามที่ผู้ดูแลระบบระบุโดยไอคอนที่แตกต่างกันในแท็บบาร์และที่สำคัญที่สุดคือใช้คอนโซลหลังฉากเพื่อให้แอปพลิเคชัน windows ดั้งเดิมทำงานได้อย่างถูกต้อง
Jan Hudec

2
@Ramhound คุณถูกต้องว่าปัญหาเดิมของฉัน (แยกความแตกต่างระหว่างหน้าต่าง Terminal ของผู้ดูแลระบบ) ที่ฉันได้แคบลงในคำถามนี้สามารถแก้ไขได้โดยการตัดสั้น ๆ สำหรับmintty1. เรียกใช้ในฐานะผู้ดูแลระบบ 2. ใช้ไฟล์การตั้งค่าที่แตกต่างกัน การตั้งค่าและ 3. ใช้ไอคอนทางเลือก หากคุณอธิบายให้สาธารณชนทั่วไปทราบเกี่ยวกับวิธีการสร้างสิ่งนี้ฉันจะให้ upvote (เว้นแต่คุณจะตอบในคำตอบของคุณว่าไม่สามารถทำได้ภายในสคริปต์ :-)
FooF

1
@FooF - เพียงเพราะคุณเรียกใช้กระบวนการที่มีผู้ใช้ระดับผู้ดูแลระบบไม่ได้หมายความว่ากระบวนการนั้นได้รับการยกระดับแล้ว Windows โดยค่าเริ่มต้นจะรวมกระบวนการเท่านั้นหากผู้ใช้อนุมัติการกระทำดังกล่าวดังนั้นคุณลักษณะ "run as Administrator" ใน Windows คุณยังสามารถให้สิทธิ์ทั้งหมดในกลุ่มใดก็ได้ที่คุณต้องการแม้กระทั่งFooกลุ่มผู้ใช้หากคุณต้องการ
Ramhound

1
@FooF - แค่คิดว่าเป็นsudoสิ่งที่จำเป็นแม้ว่าคุณจะทำงานในฐานะผู้ใช้รูท
Ramhound

คำตอบ:


9

ฉันเพิ่งเขียนฟังก์ชันนี้ด้วยเหตุผลเดียวกัน ฉันไม่เคยรู้เลยว่าเชลล์ตัวไหนมีสิทธิ์ผู้ดูแลระบบ

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

มันดัดแปลงมาจากคำตอบนี้/programming//a/11995662/307968สำหรับ windows cmd shell Net เซสชันคืนค่าสถานะ 0 ถ้าคุณเป็นผู้ดูแล

ตอนนี้ฉันแค่ต้องการเปลี่ยนข้อความหรืออาจจะเป็นสีของแถบหัวเรื่อง ....


ยินดีที่ได้พบ แม้ว่าจะมีกรณีขอบซึ่งกรณีนี้ล้มเหลวเช่นกันหากคุณตรวจสอบความคิดเห็นสแต็คโอเวอร์โฟลว์
FooF

อย่างไรก็ตามฉันยอมรับคำตอบนี้เพราะชี้ไปที่การอภิปรายที่ครอบคลุมมาก (คำถาม stackoverflow และคำตอบที่ยอมรับได้ในปัจจุบันมีคะแนน 147 และ 255 ตามลำดับ)
FooF

ขอบคุณ! ฉันใช้ตัวเลือกนี้เพื่อเลือกสีชื่อผู้ใช้ในพรอมต์ของฉัน หากการขายได้รับการยกระดับฉันจะใช้สีแดงหรือเขียว มีประโยชน์ในการติดตามว่าเชลล์ใดที่มีการยกระดับหากคุณเปิดหน้าต่างเทอร์มินัลจำนวนมาก
HelloGoodbye

16

คำตอบที่ชัดเจนกับคำถามนี้มาจากCygwin รายชื่อผู้รับจดหมาย กระบวนการทำงานโดยใช้สิทธิ์ผู้ดูแลระบบหากผู้ใช้ที่เริ่มต้นเป็นส่วนหนึ่งของกลุ่ม 544 (ผู้ดูแลระบบ) นอกจากนี้จากความคิดเห็นด้านล่างโดย Cromax ดูเหมือนว่ากลุ่ม 114 (บัญชีท้องถิ่นและสมาชิกของกลุ่มผู้ดูแลระบบ) บางครั้งก็มีอยู่ การทดสอบสำหรับสองกลุ่มนี้คือ

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

ตัวอย่างเช่น,

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

ในอดีตคุณต้องตรวจสอบกลุ่ม 0 ซึ่งเป็นกลุ่มรูทใน / etc / group แต่ / etc / group จะไม่ได้รับการติดตั้งใน Cygwin อีกต่อไปและควรลบออกหากมีอยู่ดังนั้นจึงไม่แนะนำให้ตรวจสอบกลุ่ม 0 อีกต่อไป เพียงแค่กลุ่ม 544


1
ขอบคุณที่สอบถามในรายชื่อผู้รับจดหมาย Cygwin :-) ดีใจที่ได้ทราบว่า id กลุ่ม (จำลอง / แปล) ยังคงไม่เปลี่ยนแปลงระหว่างระบบ
FooF

แน่นอนว่า ... ฉันอยากจะรู้ว่าตัวเองและผู้คนที่นั่นรู้
Andrew Schulman

1
น่าเสียดายที่นี่ไม่ทำงานใน Mingw / Msys คำตอบของ Steven นั้นทำได้เฉพาะใน Windows 7 เท่านั้น
กระจอก

1
ฉันเพิ่งลองที่ (ใน W7) และมันใช้งานไม่ได้ แต่ฉันสังเกตเห็นว่าถ้าผู้ใช้ของ Window ถูกบันทึกว่าเป็นผู้ดูแลระบบแล้วเมื่อ Cygwin ถูกเรียกใช้ในฐานะผู้ดูแลระบบจะมีกลุ่มอื่นที่ ปรากฏขึ้นในการidส่งออกของคือ 114 (บัญชีท้องถิ่นและสมาชิกของกลุ่มผู้ดูแลระบบ) ดังนั้นควรอัพเดท regexp เป็น:id -G | grep -qE '\<(114|544)\>' && echo admin || echo user
Cromax

ขอบคุณ ฉันไม่ได้เห็นตัวเอง แต่ฉันเห็นว่ากลุ่ม 114 ดูเหมือนจะเป็นกลุ่มผู้ดูแลระบบดังนั้นจึงมีเหตุผลที่จะตรวจสอบด้วยเช่นกัน ฉันแก้ไขคำตอบ
Andrew Schulman

7

atผมใช้ค่าตอบแทนของตัวโปรแกรม Windows ฉันยังสร้างฟังก์ชันการทำงานของตัวละครพิเศษ\$ใหม่อีกครั้ง

# 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 "

ตัวอย่าง


สมมติว่าไม่มีidคำสั่งUNIX เทียบเท่าใน Windows ฉันยอมรับว่านี่เป็นคำตอบที่ถูกต้อง atคำสั่งที่รันอย่างน้อยโดยไม่มีข้อโต้แย้งใด ๆ ดูเหมือนจะไม่มีผลข้างเคียงใด ๆ ฉันจะใช้วิธีนี้ใน.bashrcไฟล์ของฉันนับจากนี้ไป! ขอบคุณสำหรับการแฮ็ค
FooF

1
ดูเหมือนจะไม่ทำงานบน windows8.1
zzapper

1
@zzapper โปรดเจาะจงยิ่งขึ้น เกิดอะไรขึ้น / ไม่เกิดขึ้น? ข้อความผิดพลาด?
Steven

4
id ส่งคืนค่าเดิมที่ไม่สนับสนุนให้ใช้ schtasks.exe แทน แต่จะใช้งานได้หรือไม่
zzapper

2

id -G | grep -qE '\<(544|0)\>'ดูเหมือนจะไม่ได้ผลสำหรับฉันเนื่องจากผลลัพธ์ของฉันไม่มี <> หรือ 544 แม้เมื่อยกระดับ อย่างไรก็ตามเนื่องจากความสูงจำเป็นสำหรับการเขียน%WINDIR%\system32ฉันใช้เพื่อทดสอบระดับความสูงด้วยฟังก์ชั่นเชลล์:

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

เมื่อนำไปใช้กับแนวคิดที่ยอดเยี่ยมของสตีเว่นเกี่ยวกับตัวละครแฮชสีแดง:

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

1

ทำสิ่งที่ผู้ดูแลระบบสามารถทำได้และทดสอบเพื่อความสำเร็จหรือล้มเหลว: -

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

หรือ

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

หรือ

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

หรือ

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

1

ใน Msys บน Windows ลองนี้ (ฉันพบว่าคำตอบที่ยอมรับไม่ทำงานใน Msys)

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

สิ่งนี้ต้องอาศัยรหัสส่งคืนของatการเป็นศูนย์เฉพาะเมื่อทำงานในฐานะผู้ดูแลระบบ


1
นี่ดูเหมือนว่าวิธีการเดียวกับ @Steven ที่ให้ไว้ในคำตอบก่อนหน้า (ซึ่งดูเหมือนว่าจะไม่ทำงานบน Windows 8.1 ตามความคิดเห็น - เว้นแต่ว่า MSYS "at" เป็นอย่างใด) ในขณะที่คำถามเกี่ยวกับ Cygwin เป็นที่น่าสนใจที่จะเปรียบเทียบกับ MSYS ที่คล้ายกัน ขอบคุณสำหรับการบริจาค
FooF

คล้ายกันมากใช่ อย่างไรก็ตามฉันลงเอยกับคำถามนี้พยายามที่จะใช้เพื่อตรวจสอบในสคริปต์ (Win7, Msys) แทนที่จะตั้งค่าสไตล์ bash prompt ดังนั้นฉันคิดว่านี่อาจเป็นประโยชน์กับคนอื่นที่ทำแบบเดียวกัน
กระจอก

ฉันเห็นด้วยกับประโยชน์
FooF
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.