ผู้ใช้รูท / เทียบเท่า sudo ใน Cygwin?


156

ฉันพยายามเรียกใช้สคริปต์ทุบตีใน Cygwin

ฉันได้รับMust run as root, i.e. sudo ./scriptnameข้อผิดพลาด

chmod 777 scriptname ไม่ทำอะไรเลยที่จะช่วย

ฉันได้ค้นหาวิธีเลียนแบบ sudo บน Cygwin เพื่อเพิ่มผู้ใช้รูทตั้งแต่การเรียก "su" ทำให้เกิดข้อผิดพลาดsu: user root does not existสิ่งที่มีประโยชน์และไม่พบอะไรเลย

ใครมีข้อเสนอแนะ?


สวัสดี KenB คุณช่วยให้รายละเอียดเพิ่มเติมเกี่ยวกับwhatสคริปต์ที่คุณพยายามเรียกใช้ได้หรือไม่ ไม่มีอะไรเทียบเท่าได้กับ 'sudo' ในเชลล์ cygwin - สิทธิ์คือสิทธิ์จากผู้ใช้ที่ชนะซึ่งเปิดใช้เชลล์ cygwin ดังนั้นลิงก์ KyleWpppd จึงเป็นสิ่งที่ดีเพื่อหลีกเลี่ยงข้อผิดพลาดเช่น "sudo unknown command" ในกรณีของคุณดูเหมือนจะเป็นปัญหาเฉพาะกับสคริปต์ที่คุณต้องการดำเนินการ
Stefano

1
ความจริงแล้วนี่เป็นปัญหาที่ยาวนานมาแล้วและฉันก็จำไม่ได้ว่าสคริปท์คืออะไร ขอบคุณที่ให้ความสนใจ
Ken Bellows

คำถามที่เกี่ยวข้องที่นี่: superuser.com/questions/122418/theres-no-sudo-command-in-cygwinและที่นี่: stackoverflow.com/questions/22527668/ …
Benj

คำตอบ:


225

ฉันตอบคำถามนี้ในSuperUserแต่หลังจาก OP ไม่สนใจคำตอบที่ไม่ช่วยเหลือซึ่งเป็นคำตอบสำหรับคำถามเท่านั้น

นี่คือวิธีที่เหมาะสมในการยกระดับสิทธิ์ใน Cygwin คัดลอกมาจากคำตอบของฉันเองใน SuperUser:

ผมพบคำตอบในCygwin รายชื่อผู้รับจดหมาย ในการรันcommandด้วยสิทธิ์ยกระดับใน Cygwin ให้ทำหน้าคำสั่งด้วยcygstart --action=runasวิธีนี้:

$ cygstart --action=runas command

นี่จะเป็นการเปิดกล่องโต้ตอบ Windows เพื่อขอรหัสผ่านผู้ดูแลระบบและเรียกใช้คำสั่งหากป้อนรหัสผ่านที่เหมาะสม

นี่เป็นสคริปต์ได้อย่างง่ายดายตราบใดที่~/binอยู่ในเส้นทางของคุณ สร้างไฟล์ที่~/bin/sudoมีเนื้อหาดังต่อไปนี้:

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

ตอนนี้ทำให้ไฟล์ปฏิบัติการ:

$ chmod +x ~/bin/sudo

ตอนนี้คุณสามารถรันคำสั่งด้วยสิทธิ์ยกระดับจริง :

$ sudo elevatedCommand

คุณอาจต้องเพิ่ม~/binเส้นทางของคุณ คุณสามารถเรียกใช้คำสั่งต่อไปนี้บน Cygwin CLI หรือเพิ่มลงใน~/.bashrc:

$ PATH=$HOME/bin:$PATH

ทดสอบกับ Windows 8 64 บิต

คุณสามารถเพิ่มขั้นตอนแทนนามแฝงสำหรับคำสั่งนี้ใน~/.bashrc:

# alias to simulate sudo
alias sudo='cygstart --action=runas'

12
คำตอบที่ยอดเยี่ยม ด้วยการปรับแต่งรหัสทุบตีของคุณ (ด้านล่าง) ฉันสามารถเรียกใช้คำสั่งยกระดับจากบรรทัดคำสั่ง นี่คือการเปลี่ยนแปลงที่ฉันต้องการเพื่อให้โค้ดของคุณใช้งานได้: cat << 'EOF' > ~/bin/sudo\n #!/usr/bin/bash\n cygstart --action=runas "$@"\n EOF (ฉันไม่สามารถหาวิธีแทรกบรรทัดใหม่ในความคิดเห็นนี้ได้ดังนั้นฉันจึงเพิ่ม '\ n's ในรหัส) ส่วนที่เหลือจาก PATH = ... เป็นต้นไปนั้นใช้ได้ .
josmith42

3
อ้อเข้าใจแล้ว! หากฉันไม่เข้าใจผิดนั่นเป็นวิธีการเขียนไฟล์ไปยังดิสก์แทนที่จะเปิดโปรแกรมแก้ไขข้อความ ดีมากขอบคุณ! ฉันไม่รู้วิธีใช้ heredocs ใน Bash!
dotancohen

8
ปัญหานี้คือมันจะสร้างหน้าต่างเทอร์มินัลใหม่ทั้งหมด (โดยปกติจะเป็นโฮสต์) เอาท์พุทไม่ได้ inlined เข้าไปในสถานีปัจจุบัน
CMCDragonkai

1
วิธีเดียวที่จะเรียกใช้สิ่งต่าง ๆ เช่นlsการห่อในกระบวนการที่ใช้เวลานานเช่น mintty หรือ bash หรือ zsh ด้วย แต่ทุกอย่างจะปรากฏในสถานีแยกต่างหาก ซึ่ง ณ จุดนี้ฉันสามารถเปิดมันผ่าน GUI โดยใช้ ConEMU
CMCDragonkai

1
หากไม่มีเครื่องหมายอัญประกาศอาร์กิวเมนต์ที่ยกมาจะถูกแบ่งในช่องว่างอีกครั้ง @katriel ด้วยคำพูดที่"$@"จะขยายสิ่งที่ชอบ"$1" "$2" "$3" ...และโดยไม่ต้องขยายไป$@ $1 $2 $3...
Palec

51

คุณอาจต้องเรียกใช้ cygwin shell ในฐานะผู้ดูแลระบบ คุณสามารถคลิกขวาที่ทางลัดแล้วคลิกเรียกใช้ในฐานะผู้ดูแลระบบหรือไปที่คุณสมบัติของทางลัดแล้วตรวจสอบในส่วนที่เข้ากันได้ เพียงแค่ระวัง .... การอนุญาตรูทอาจเป็นอันตรายได้


1
ในช่วงสามปีที่ผ่านมาเนื่องจากคำถามนี้ถูกถามโดยไม่มีคำตอบที่ดีซึ่งตรงข้ามกับวิธีแก้ปัญหานี้ฉันพบวิธีที่ถูกต้องในการเพิ่มการอนุญาตสำหรับคำสั่งเดียวในหน้าต่าง Cygwin ที่ยังหลงเหลืออยู่ในคำตอบด้านล่าง ดังนั้นมันจึงทำงานเหมือนกับsudoใน Linux
dotancohen

ทำงานให้ฉันใน Win10 64 ต้องเปลี่ยนความเป็นเจ้าของไฟล์ที่ดาวน์โหลดจากเซิร์ฟเวอร์ด้วย rsync chown --changes --verbose --recursive [USER] /cygdrive/c/[PATH TO FOLDER]/*. ถ้าไม่มีมันฉันไม่สามารถเข้าถึงโฟลเดอร์และไฟล์ rsynced ได้
lowtechsun

25

สร้างคำตอบของ dotancohenฉันใช้นามแฝง:

alias sudo="cygstart --action=runas"

ทำงานเป็นเสน่ห์:

sudo chown User:Group <file>

และถ้าคุณติดตั้ง SysInternals คุณสามารถเริ่มเชลล์คำสั่งในฐานะผู้ใช้ระบบได้อย่างง่ายดาย

sudo psexec -i -s -d cmd

9

ฉันพบsudo-for-cygwinอาจจะใช้งานได้มันเป็นแอปพลิเคชันไคลเอนต์ / เซิร์ฟเวอร์ที่ใช้สคริปต์ python เพื่อวางกระบวนการเด็กใน windows (pty) และเชื่อมโยง tty ของผู้ใช้กับกระบวนการ I / O

มันต้องใช้หลามใน windows และโมดูลหลามกรีนเล็ตและเหตุการณ์ใน Cygwin


ฉันใช้สิ่งนี้มาระยะหนึ่งแล้วและมันจัดการกับเหตุการณ์แบบอินเทอร์แอคทีฟอย่างนาโนโดยไม่มีปัญหาใด ๆ !
MemphiZ


4

ดูเหมือนว่าcygstart/runasไม่สามารถจัดการได้อย่างถูกต้อง"$@"ดังนั้นคำสั่งที่มีอาร์กิวเมนต์ที่มีช่องว่าง (และอาจเป็นอักขระอื่น ๆ ของ meta-shell - ฉันไม่ได้ตรวจสอบ) จะทำงานไม่ถูกต้อง

ฉันตัดสินใจที่จะเขียนsudoสคริปต์ขนาดเล็กที่ทำงานได้โดยการเขียนสคริปต์ชั่วคราวที่ทำพารามิเตอร์อย่างถูกต้อง

#! /bin/bash

# If already admin, just run the command in-line.
# This works on my Win10 machine; dunno about others.
if id -G | grep -q ' 544 '; then
   "$@"
   exit $?
fi

# cygstart/runas doesn't handle arguments with spaces correctly so create
# a script that will do so properly.
tmpfile=$(mktemp /tmp/sudo.XXXXXX)
echo "#! /bin/bash" >>$tmpfile
echo "export PATH=\"$PATH\"" >>$tmpfile
echo "$1 \\" >>$tmpfile
shift
for arg in "$@"; do
  qarg=`echo "$arg" | sed -e "s/'/'\\\\\''/g"`
  echo "  '$qarg' \\" >>$tmpfile
done
echo >>$tmpfile

# cygstart opens a new window which vanishes as soon as the command is complete.
# Give the user a chance to see the output.
echo "echo -ne '\n$0: press <enter> to close window... '" >>$tmpfile
echo "read enter" >>$tmpfile

# Clean up after ourselves.
echo "rm -f $tmpfile" >>$tmpfile

# Do it as Administrator.
cygstart --action=runas /bin/bash $tmpfile

1
คำตอบที่ได้รับการยอมรับไม่ได้ผลสำหรับฉันใน Win7 แต่คำตอบนี้ใช้งานได้ดี ฉันสามารถตั้งค่า exim-config ด้วย privs ที่ยกระดับแล้ว vim- แก้ไขไฟล์ /etc/exim.conf หลังจากนั้น เนียน.
nanker

2

คำตอบนี้จะตามออกคำตอบอื่น ก่อนอื่นตรวจสอบให้แน่ใจว่าบัญชีของคุณอยู่ในกลุ่มผู้ดูแลระบบ

ถัดไปสร้างไฟล์ "runas-admin.bat" ทั่วไปที่มีเนื้อหาต่อไปนี้:

@if (1==1) @if(1==0) @ELSE
@echo off&SETLOCAL ENABLEEXTENSIONS
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"||(
    cscript //E:JScript //nologo "%~f0" %*
    @goto :EOF
)
FOR %%A IN (%*) DO (
    "%%A"
)
@goto :EOF
@end @ELSE
args = WScript.Arguments;
newargs = "";
for (var i = 0; i < args.length; i++) {
    newargs += "\"" + args(i) + "\" ";
}
ShA=new ActiveXObject("Shell.Application");
ShA.ShellExecute("cmd.exe","/c \""+WScript.ScriptFullName+" "+newargs+"\"","","runas",5);
@end

จากนั้นรันไฟล์แบตช์ดังนี้:

./runas-admin.bat "<command1> [parm1, parm2, ...]" "<command2> [parm1, parm2, ...]"

สำหรับ exaxmple:

./runas-admin.bat "net localgroup newgroup1 /add" "net localgroup newgroup2 /add"

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


2

ข้อเสนอใหม่เพื่อปรับปรุง SUDO สำหรับ CygWin จาก GitHub ในหัวข้อนี้ชื่อTOUACExt :

  • เปิด sudoserver.py โดยอัตโนมัติ
  • ปิด sudoserver.py โดยอัตโนมัติหลังจากหมดเวลาใช้งาน (ค่าเริ่มต้น 15 นาที)
  • ร้องขอการยกระดับพรอมต์ UAC ใช่ / ไม่ใช่สไตล์สำหรับผู้ใช้ที่เป็นผู้ดูแลระบบ
  • ขอชื่อผู้ใช้ / รหัสผ่านของผู้ดูแลระบบสำหรับผู้ใช้ที่ไม่ใช่ผู้ดูแลระบบ
  • ทำงานจากระยะไกล (SSH) ด้วยบัญชีผู้ดูแลระบบ
  • สร้างบันทึก

ยังอยู่ในPre-Betaแต่ดูเหมือนว่าจะใช้งานได้


1

ฉันลงจอดที่นี่ผ่าน google และจริง ๆ แล้วฉันเชื่อว่าฉันได้พบวิธีที่จะได้รับราก promt ที่ทำงานได้อย่างสมบูรณ์ใน cygwin

นี่คือขั้นตอนของฉัน

ก่อนอื่นคุณต้องเปลี่ยนชื่อบัญชีผู้ดูแลระบบ Windows เป็น "root" ทำสิ่งนี้โดยเปิด start มนูและพิมพ์ "gpedit.msc"

แก้ไขรายการภายใต้นโยบายคอมพิวเตอร์เฉพาะที่> การกำหนดค่าคอมพิวเตอร์> การตั้งค่า Windows> การตั้งค่าความปลอดภัย> นโยบายท้องถิ่น> ตัวเลือกความปลอดภัย> บัญชี: เปลี่ยนชื่อบัญชีผู้ดูแลระบบ

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

ตอนนี้ออกจากระบบและเข้าสู่บัญชีรูท

ตอนนี้ตั้งค่าตัวแปรสภาพแวดล้อมสำหรับ cygwin ในการทำเช่นนั้นวิธีง่ายๆ: คลิกขวาที่ My Computer> Properties

คลิก (ที่แถบด้านข้างซ้าย) "การตั้งค่าระบบขั้นสูง"

ใกล้กับด้านล่างคลิกปุ่ม "ตัวแปรสภาพแวดล้อม"

ใต้ "ตัวแปรระบบ" คลิกปุ่ม "ใหม่ ... "

สำหรับชื่อให้ใส่ "cygwin" โดยไม่มีเครื่องหมายอัญประกาศ สำหรับค่าให้ป้อนในไดเรกทอรีราก cygwin ของคุณ (ของฉันคือ C: \ cygwin)

กดตกลงและปิดทั้งหมดเพื่อกลับไปที่เดสก์ท็อป

เปิดเทอร์มินัล Cygwin (cygwin.bat)

แก้ไขไฟล์ / etc / passwd และเปลี่ยนบรรทัด

ผู้ดูแลระบบ : ไม่ได้ใช้: 500: 503 : U- MACHINE \ Administrator , S-1-5-21-12345678-1234567890-1234567890- 500: / home / ผู้ดูแลระบบ : / bin / bash

สำหรับสิ่งนี้ (หมายเลขของคุณและชื่อเครื่องจะแตกต่างกันเพียงตรวจสอบให้แน่ใจว่าคุณเปลี่ยนหมายเลขที่เน้นเป็น 0!)

root : ไม่ได้ใช้: 0: 0 : U- MACHINE \ root , S-1-5-21-12345678-1234567890-1234567890- 0: / root : / bin / bash

ตอนนี้สิ่งที่เสร็จสิ้นแล้วบิตถัดไปนี้จะทำให้คำสั่ง "su" ทำงาน (ไม่สมบูรณ์ แต่มันจะทำงานได้ดีพอที่จะใช้ฉันไม่คิดว่าสคริปต์จะทำงานได้อย่างถูกต้อง แต่เดี๋ยวก่อนคุณมาไกลขนาดนี้บางทีคุณอาจหาวิธีได้และแบ่งปันให้)

เรียกใช้คำสั่งนี้ใน cygwin เพื่อจบการจัดการ

mv /bin/su.exe /bin/_su.exe_backup
cat > /bin/su.bat << "EOF"
@ECHO OFF
RUNAS /savecred /user:root %cygwin%\cygwin.bat
EOF
ln -s /bin/su.bat /bin/su
echo ''
echo 'All finished'

ออกจากระบบบัญชีรูทและกลับสู่บัญชีผู้ใช้ windows ปกติของคุณ

หลังจากนั้นให้รัน "su.bat" ใหม่ด้วยตนเองโดยดับเบิลคลิกที่ explorer ป้อนรหัสผ่านของคุณและไปข้างหน้าและปิดหน้าต่าง

ตอนนี้ลองรันคำสั่ง su จาก cygwin และดูว่าทุกอย่างเรียบร้อยดีไหม


1

ด้วยความยินดีกับโซลูชันที่มีอยู่ฉันจึงใช้สคริปต์ของ nu774เพื่อเพิ่มความปลอดภัยและทำให้ติดตั้งและใช้งานได้ง่ายขึ้น โครงการพร้อมใช้งานบน Github

ที่จะใช้มันเพียงแค่ดาวน์โหลดและเรียกใช้ผ่านทางcygwin-sudo.pypython3 cygwin-sudo.py **yourcommand**

คุณสามารถตั้งค่านามแฝงเพื่อความสะดวก:

alias sudo="python3 /path-to-cygwin-sudo/cygwin-sudo.py"

0

ใช้สิ่งนี้เพื่อรับหน้าต่างผู้ดูแลระบบที่มี bash หรือ cmd กำลังรันอยู่จากไดเรกทอรีบริบทใด ๆ เพียงคลิกขวาที่ชื่อไดเรกทอรีและเลือกรายการหรือกดปุ่ม highlited

สิ่งนี้ขึ้นอยู่กับเครื่องมือ chere และคำตอบที่ไม่ได้ผล (สำหรับฉัน) จาก link_boy มันใช้งานได้ดีสำหรับฉันโดยใช้ Windows 8

ผลข้างเคียงคือสีที่แตกต่างในหน้าต่าง admin cmd ในการใช้สิ่งนี้กับ bash คุณสามารถเปลี่ยนไฟล์. bashrc ของผู้ใช้งาน admin

ฉันไม่ได้รับรุ่น "พื้นหลัง" (คลิกขวาในไดเรกทอรีเปิด) เพื่อเรียกใช้ รู้สึกฟรีเพื่อเพิ่ม

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash]
@="&Bash Prompt Here"
"Icon"="C:\\cygwin\\Cygwin.ico"

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash\command]
@="C:\\cygwin\\bin\\bash -c \"/bin/xhere /bin/bash.exe '%L'\""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash_root]
@="&Root Bash Prompt Here"
"Icon"="C:\\cygwin\\Cygwin.ico"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash_root\command]
@="runas /savecred /user:administrator \"C:\\cygwin\\bin\\bash -c \\\"/bin/xhere /bin/bash.exe '%L'\\\"\""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_cmd]
@="&Command Prompt Here"

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_cmd\command]
@="cmd.exe /k cd %L"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_cmd_root]
@="Roo&t Command Prompt Here"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_cmd_root\command]
@="runas /savecred /user:administrator \"cmd.exe /t:1E /k cd %L\""

0

วิธีที่ง่ายมากในการมี cygwin shell และ subshells ที่เกี่ยวข้องเพื่อทำงานด้วยสิทธิ์ผู้ดูแลระบบคือการเปลี่ยนคุณสมบัติของลิงค์ที่เปิดเชลล์เริ่มต้น

ต่อไปนี้ถูกต้องสำหรับ Windows 7+ (อาจเป็นรุ่นก่อนหน้าด้วย แต่ฉันไม่ได้ตรวจสอบ)

ฉันมักจะเริ่มเปลือก cygwin จากลิงค์ cygwin ในปุ่มเริ่มต้น (หรือเดสก์ท็อป) จากนั้นฉันเปลี่ยนคุณสมบัติของ cygwin-link ในแท็บ

/ ความเข้ากันได้ / ระดับสิทธิ์ /

และตรวจสอบกล่อง

"เรียกใช้โปรแกรมนี้ในฐานะผู้ดูแลระบบ"

สิ่งนี้ทำให้เชลล์ cygwin สามารถเปิดด้วยสิทธิ์ผู้ดูแลระบบและ subshells ที่เกี่ยวข้องด้วย


ปัญหาเล็กน้อยเพียงอย่างเดียวคือคุณไม่สามารถบอกได้ว่าเปิดในฐานะผู้ดูแลระบบหรือไม่
Edwin Pratt

0

ฉันได้พบกับการสนทนานี้เพื่อค้นหารายละเอียดบางอย่างเกี่ยวกับการsudoใช้งานในระบบปฏิบัติการที่แตกต่างกัน อ่านแล้วฉันพบว่าวิธีแก้ปัญหาโดย @ brian-white ( https://stackoverflow.com/a/42956057/3627676 ) มีประโยชน์ แต่สามารถปรับปรุงได้เล็กน้อย ฉันหลีกเลี่ยงการสร้างไฟล์ชั่วคราวและนำไปใช้เพื่อดำเนินการทุกอย่างด้วยสคริปต์เดียว

ฉันยังตรวจสอบขั้นตอนต่อไปของการปรับปรุงเพื่อส่งออกภายในหน้าต่าง / คอนโซลเดียว น่าเสียดายที่ไม่ประสบความสำเร็จ ฉันพยายามใช้ชื่อ pipes เพื่อจับภาพ STDOUT / STDERR และพิมพ์ในหน้าต่างหลัก แต่กระบวนการลูกไม่ได้เขียนไปที่ชื่อ pipes อย่างไรก็ตามการเขียนไปยังไฟล์ปกติทำงานได้ดี

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

การปรับปรุง:

  • ไม่มีไฟล์ชั่วคราว
  • ไม่มีการแยกวิเคราะห์และสร้างตัวเลือกบรรทัดคำสั่งใหม่
  • รอคำสั่งยกระดับ
  • ใช้minttyหรือbashถ้าไม่พบคนแรก
  • ส่งคืนรหัสออกจากคำสั่ง
    #! / bin / ทุบตี

    # เป็นผู้ดูแลระบบให้เรียกใช้คำสั่งโดยตรง
    id -G | grep -qw 544 && {
        "$ @"
        ออกจาก $ หรือไม่
    }

    # ตัวแปร CYG_SUDO ใช้เพื่อควบคุมการเรียกใช้คำสั่ง
    [-z "$ CYG_SUDO"] && {
        mintty = "$ (ซึ่ง mintty 2> / dev / null)"
        ส่งออก CYG_SUDO = "$$"
        cygstart - รอ - ปฏิกิริยา = runas $ mintty / bin / bash "$ 0" "$ @"
        ออกจาก $ หรือไม่
    }

    # ตอนนี้เราสามารถ:
    # - เปิดใช้คำสั่ง
    # - แสดงข้อความ
    # - ส่งคืนรหัสออก
    "$ @"
    RetVal = $?

    echo "$ 0: กดเพื่อปิดหน้าต่าง ... "
    อ่าน

    ออกจาก $ RETVAL


จะcygstart --wait --action=runas $mintty /bin/bash "$0" "$@"ไม่แตกถ้ามีช่องว่างในการโต้แย้งได้อย่างไร มันทำเพื่อฉันเสมอเมื่อผ่านเช่น cygstart / runas
Brian White

0

จากคำตอบของ @ mat-khor ฉันใช้ syswin su.exeบันทึกเป็นmanufacture-syswin-su.exeและเขียนสคริปต์ตัวห่อนี้ มันจัดการการเปลี่ยนเส้นทางของคำสั่ง stdout และ stderr ดังนั้นจึงสามารถนำมาใช้ในไพพ์ ฯลฯ นอกจากนี้สคริปต์ออกจากสถานะของคำสั่งที่กำหนด

ข้อ จำกัด :

  • ตัวเลือก syswin-su ปัจจุบันฮาร์ดโค้ดเพื่อใช้ผู้ใช้ปัจจุบัน prepending env USERNAME=...การภาวนาสคริปต์แทนที่มัน ถ้ามีตัวเลือกอื่น ๆ ที่มีความจำเป็นสคริปต์จะต้องแยกแยะระหว่าง syswin-su --และข้อโต้แย้งคำสั่งเช่นแยกในครั้งแรก
  • หากพรอมต์ UAC ถูกยกเลิกหรือปฏิเสธสคริปต์จะหยุดทำงาน

.

#!/bin/bash
set -e

# join command $@ into a single string with quoting (required for syswin-su)
cmd=$( ( set -x; set -- "$@"; ) 2>&1 | perl -nle 'print $1 if /\bset -- (.*)/' )

tmpDir=$(mktemp -t -d -- "$(basename "$0")_$(date '+%Y%m%dT%H%M%S')_XXX")
mkfifo -- "$tmpDir/out"
mkfifo -- "$tmpDir/err"

cat >> "$tmpDir/script" <<-SCRIPT
    #!/bin/env bash
    $cmd > '$tmpDir/out' 2> '$tmpDir/err'
    echo \$? > '$tmpDir/status'
SCRIPT

chmod 700 -- "$tmpDir/script"

manufacture-syswin-su -s bash -u "$USERNAME" -m -c "cygstart --showminimized bash -c '$tmpDir/script'" > /dev/null &
cat -- "$tmpDir/err" >&2 &
cat -- "$tmpDir/out"
wait $!
exit $(<"$tmpDir/status")

-1

ไม่สามารถทดสอบได้ด้วยตัวเองอย่างสมบูรณ์ฉันไม่มีสคริปต์ที่เหมาะสมที่จะลองใช้และฉันไม่มีผู้เชี่ยวชาญ Linux แต่คุณอาจแฮ็คสิ่งที่ใกล้พอ

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

หากต้องการหลีกเลี่ยงการใช้ผู้ใช้ "รูท":

  • สร้างผู้ใช้บนเครื่อง LOCAL windows ที่เรียกว่า 'root' ทำให้เป็นสมาชิกของกลุ่ม 'Administrators'
  • ทำเครื่องหมาย bin / bash.exe เป็น 'Run as administrator' สำหรับผู้ใช้ทั้งหมด (เห็นได้ชัดว่าคุณจะต้องเปิด / ปิดเป็นและเมื่อคุณต้องการ)
  • กดปุ่ม Shift ซ้ายค้างใน windows explorer ในขณะที่คลิกขวาที่ไฟล์ Cygwin.bat
  • เลือก 'เรียกใช้เป็นผู้ใช้อื่น'
  • ป้อน. \ root เป็นชื่อผู้ใช้และรหัสผ่านของคุณ

สิ่งนี้จะทำให้คุณเป็นผู้ใช้ที่เรียกว่า 'root' ใน cygwin ซึ่งประกอบกับ 'Run as administrator' ในไฟล์ bash.exe อาจเพียงพอ

อย่างไรก็ตามคุณยังต้องใช้ sudo

ฉันแกล้งนี้ (และคนอื่นที่มีความรู้ลินุกซ์มากขึ้นอาจปลอมได้ดีกว่า) โดยการสร้างไฟล์ที่เรียกว่า 'sudo' ใน / bin และใช้บรรทัดคำสั่งนี้เพื่อส่งคำสั่งไป su แทน:

su -c "$*"

บรรทัดคำสั่ง 'sudo vim' และคนอื่น ๆ ดูเหมือนว่าใช้ได้สำหรับฉันดังนั้นคุณอาจต้องการลองใช้

สนใจที่จะรู้ว่าสิ่งนี้เหมาะกับความต้องการของคุณหรือไม่


-1

สิ่งที่ฉันมักจะทำคือมีรีจิสตรี "Open Here" เพื่อเปิดเปลือก cygwin ที่มีสิทธิ์ระดับผู้ดูแลระบบค่อนข้างง่ายจากทุกที่ในคอมพิวเตอร์ของฉัน

ระวังให้ดีคุณต้องติดตั้งแพคเกจ "chere" cygwin ใช้ " chere -i -m" จากเชลล์ cygwin ที่ยกระดับก่อน

สมมติว่าการติดตั้ง cygwin ของคุณอยู่ในC: \ cygwin ...

นี่คือรหัสรีจิสทรี:

Windows Registry Editor Version 5.00

[-HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash]

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash]
@="Open Cygwin Here as Root"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash\command]
@="c:\\cygwin\\bin\\mintty.exe -i /Cygwin-Terminal.ico -e /bin/xhere /bin/bash.exe"

[-HKEY_CLASSES_ROOT\Directory\Background\shell\cygwin_bash]

[HKEY_CLASSES_ROOT\Directory\Background\shell\cygwin_bash]
@="Open Cygwin Here as Root"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\Background\shell\cygwin_bash\command]
@="c:\\cygwin\\bin\\mintty.exe -i /Cygwin-Terminal.ico -e /bin/xhere /bin/bash.exe"

[-HKEY_CLASSES_ROOT\Drive\shell\cygwin_bash]

[HKEY_CLASSES_ROOT\Drive\shell\cygwin_bash]
@="Open Cygwin Here as Root"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Drive\shell\cygwin_bash\command]
@="c:\\cygwin\\bin\\mintty.exe -i /Cygwin-Terminal.ico -e /bin/xhere /bin/bash.exe"

หวังว่านี่จะช่วยได้ แจ้งให้เราทราบว่าเหมาะกับคุณหรือไม่ ขอบคุณ

PS: คุณสามารถคว้ารหัสนี้คัดลอกและวางและบันทึกในไฟล์ name.reg เพื่อเรียกใช้ ... หรือคุณสามารถเพิ่มค่าด้วยตนเอง


-5

ลอง:

chmod -R ug+rwx <dir>

โดยที่<dir>เป็นไดเร็กตอรี่ที่คุณต้องการเปลี่ยนการอนุญาต


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