sudo ด้วยรหัสผ่านในหนึ่งบรรทัดคำสั่ง?


115

ในวันที่ยุ่งฉันก็อยากวิ่ง

$ ./configure && make && sudo make install && halt

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


คุณต้องhaltเรียกใช้เป็นรูท
Keith Thompson

1
ไม่มีsudoการหมดเวลา 15 นาทีใช่หรือไม่ คุณไม่สามารถเรียกใช้พูดsudo lsหรือสิ่งที่คล้ายกันป้อนรหัสผ่านของคุณแล้วเรียกใช้คำสั่งดังกล่าวมีsudoสิทธิ์ยังคงใช้งานอยู่? (ฉันไม่สามารถทดสอบได้ในตอนนี้ไม่เช่นนั้นฉันจะโพสต์สิ่งนี้เป็นคำตอบ)
แมตต์

1
หมดเวลาในsudoการกำหนดค่า คนที่ใส่ใจเรื่องความปลอดภัย (aka หวาดระแวงเช่นฉัน) ตั้งค่าเป็นศูนย์ ... :-)
dda

คำตอบ:


173

ใช่ใช้-Sสวิตช์ที่อ่านรหัสผ่านจาก STDIN:

$echo <password> | sudo -S <command>

ดังนั้นสำหรับกรณีของคุณมันจะมีลักษณะเช่นนี้:

$./configure && make && echo <password> | sudo -S make install && halt

แน่นอนแทนที่<password>ด้วยรหัสผ่านของคุณ


42
เห็นได้ชัดว่าไม่มีใครต้องการเรียกใช้งานสิ่งนี้หากมีบุคคลอื่นเห็นรหัสผ่านในประวัติเชลล์
เบร็ทแดเนียล

กำลังมองหาวิธีที่รวดเร็วในการเรียกใช้คำสั่งพิเศษบนรีโมตโฮสต์
nelaaro

13
หากคุณตัดสินใจใช้ 'echo <password> | ตัวเลือก sudo -S 'เพื่อหลีกเลี่ยงการเปิดเผยรหัสผ่านในประวัติคำสั่งให้เริ่มต้นคำสั่งด้วยอักขระ SPACE แน่นอนตัวเลือกที่ดีที่สุดคือการไพพ์รหัสผ่านจากไฟล์ที่ปลอดภัย
Shannon Haworth

คุณอาจต้องการที่จะใช้ว่าถ้าคุณมีรหัสผ่านใน $ ตัวแปร (ที่คุณอาจจะมีการให้มีระเบียบวิธีปฏิบัติงานเป็นต้น)
Natim

9 ปีต่อมาและยังคงใช้งานได้อย่างมีเสน่ห์ :)
WinEunuuchs2Unix

10

คุณสามารถแทนที่บรรทัดคำสั่งของคุณด้วยสิ่งนี้:

$sudo su

$./configure && make && make install && halt

คุณจะได้รับแจ้งให้ใส่รหัสผ่านของคุณทันทีจากนั้นคำสั่งที่เหลือจะทำงานเป็น superuser


8
รุ่นอื่น (และอาจต้องการ) รุ่นนี้:sudo sh -c "./configure && make && make install && halt"
quack quixote

2
แต่ไฟล์คอมไพล์ที่สร้างขึ้นจะไม่มีสิทธิ์ superuser ใช่ไหม สิ่งนี้จะป้องกันคุณไม่ให้ทำงาน. / กำหนดค่า && ให้เป็นผู้ใช้ปกติในภายหลัง
user45909

ใช่ผู้ใช้ 45909 คุณพูดถูก ฉันเองไม่เคยทำการรันซ้ำ. / กำหนดค่า && ทำการยกเว้นหลังจากดาวน์โหลดอัปเดตของแพ็คเกจหลักแล้ว แต่ฉันอาจไม่ได้เป็นแบบปกติ
CarlF

10

โซลูชันอื่น ๆ จำนวนมากมีข้อเสียที่รันโดยไม่จำเป็น./configureและmakeเป็นรูท

นี่ค่อนข้างซับซ้อน แต่ควรใช้งานได้:

sudo sh -c "su $USER -c ./configure && su $USER -c make && make install && halt"

สังเกตการใช้เครื่องหมายคำพูดคู่เพื่ออนุญาตให้$USERขยายโดยเชลล์ (ที่ไม่ใช่รูท)

ฉันอาจเพิ่มคำสั่งsleep 60ก่อนหน้า haltบางครั้งฉันทำสิ่งนี้โดยคาดว่าคำสั่งจะทำงานเป็นเวลานาน แต่มีบางอย่างผิดปกติและจะหยุดทันที sleepช่วยให้ฉันฆ่าคำสั่งก่อนที่ระบบจะปิดลง หรือคุณสามารถใช้shutdownกับอาร์กิวเมนต์เวลา


9

คุณสามารถกำหนดค่า sudo ด้วยvisudoเพื่อให้ผู้ใช้สามารถใช้ make เป็น sudo ได้โดยไม่ต้องใช้รหัสผ่าน

User_Alias USERS = your_user
Cmnd_Alias CMDS = /usr/bin/make
USERS ALL = (ALL) NOPASSWD: CMDS

9

ตั้งค่า HISTIGNORE เป็น " sudo -S "

$ export HISTIGNORE='*sudo -S*'

จากนั้นส่งรหัสผ่านของคุณอย่างปลอดภัยไปยัง sudo:

$ echo "your_password" | sudo -S -k <command>

"HISTIGNORE" หมายถึงการไม่บันทึกคำสั่งนี้ลงในประวัติ นั่นคือประวัติในหน่วยความจำหรือไฟล์ "~ / .bash_history"

ตัวอย่างเช่นด้านล่างจะไพพ์รหัสผ่านของคุณอย่างปลอดภัยไปยังคำสั่ง sudo โดยไม่ต้องเก็บประวัติรหัสผ่านของคุณ

“ -S” หมายถึงการใช้ stdin สำหรับรหัสผ่าน

“ -k” หมายถึงการเพิกเฉยต่อข้อมูลประจำตัวที่แคชเพื่อบังคับให้ sudo ถามทุกครั้ง นี่คือพฤติกรรมที่สอดคล้องกัน

$ export HISTIGNORE='*sudo -S*'
$ echo "<your_password>" | sudo -S -k whoami
$ echo "<your_password>" | sudo -S -k cat /etc/shadow
$ echo "<your_password>" | sudo -S -k bash /tmp/myscript.sh

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

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

$ export HISTIGNORE='*sudo -S*'
$ echo "<your_password>" | sudo -S -v
$ sudo whoami
$ echo "<your_password>" | sudo -S -v
$ sudo cat /etc/shadow
$ echo "<your_password>" | sudo -S -v
$ sudo /tmp/myscript.sh

หมายเหตุฉันเรียกใช้ sudo ก่อนแต่ละคำสั่งเพื่อให้แน่ใจว่ามีการอัพเดตแคช sudo เนื่องจากค่าเริ่มต้นคือ 5 นาที ใช่ whoami ไม่ควรใช้เวลา 5 นาที แต่ฉันคิดว่ามันอาจจะทำงานต่อหน้าแต่ละคำสั่งเพื่อความมั่นคง คุณสามารถใส่ "export HISTIGNORE = ' sudo -S'' ในไฟล์ ~ / .bashrc ของคุณจากนั้นโหลดด้วย " ~ / .bashrc "หรือออกจากระบบจากนั้นเข้าสู่ระบบอย่างไรก็ตามฉันคิดว่าใช้สิ่งนี้เพื่อจุดประสงค์ในการเขียนสคริปต์ดังนั้นฉันจะเก็บมันไว้ที่ด้านบนสุดของสคริปต์ทั้งหมดของฉันเพื่อความปลอดภัยที่ดีที่สุดการตั้งค่า" echo "" | sudo -S -v "ไปที่ตัวแปรแทนอาจเป็นความคิดที่ดีจากนั้นให้เรียกใช้ตัวแปรก่อนที่แต่ละคำสั่งที่ต้องการสิทธิ์รูทดูความคิดเห็นของ Janar ความคิดเห็นของ" John T "ควรรวมพารามิเตอร์" -k "ด้วย ราวกับว่าคุณใช้ "sudo -S" โดยไม่มี "-k" และ sudo รับรองความถูกต้องแคชมีข้อมูลประจำตัวของคุณแล้ว (และยังคงถูกต้องแคชการตรวจสอบความถูกต้อง sudo เริ่มต้นคือ 5 นาที) จากนั้น bash จะใช้รหัสผ่านของคุณเป็นคำสั่งแทน ไม่ดี


1
เช่นเดียวกับโน้ตตัวเล็ก ๆ ในการสร้างสิ่งที่ไม่มีอยู่ในประวัติศาสตร์ให้รันคำสั่งของคุณด้วยการเว้นวรรคหนึ่งที่ด้านหน้าของมัน ด้วยเหตุผลบางอย่างสิ่งนี้ทำให้ประวัติถูกเพิกเฉย
Matt Fletcher

4

หมายเหตุฉันพบว่าวิธีนี้ใช้ไม่ได้กับ sudo รุ่นเก่าโดยเฉพาะ "Sudo เวอร์ชัน 1.6.7p5":

$ echo "<your_password>" | sudo -S -k whoami

โดยที่วิธีนี้ใช้ได้กับเวอร์ชั่นเก่าและใหม่ sudo:

$ echo "<your_password>" | sudo -S -v
$ sudo whoami

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

@Darren DeHaven: คุณช่วยอธิบายได้ไหมว่านี่เป็นคำตอบสำหรับคำถามที่ถามที่นี่ได้อย่างไร
Renju Chandran chingath


2

หากคุณต้องการความระมัดระวังมากขึ้นคุณสามารถสร้างสคริปต์เปลี่ยนการอนุญาตของไฟล์เพื่อให้มีเพียงรูทเท่านั้นที่สามารถอ่านและแก้ไขจากนั้นเรียกใช้

ตัวอย่าง:
1) สร้างไฟล์:

gedit ~/.easy.install  

2) วางสิ่งนี้และบันทึก:

./configure && make && echo <password> | sudo -S make install && halt  

3) ทำให้ปฏิบัติการ:

sudo chmod +x ~/.easy.install  

4) เปลี่ยนการอนุญาตของไฟล์เพื่อให้ root เท่านั้นที่สามารถอ่านและแก้ไข:

sudo chmod 700 ~/.easy.install  

5) Run:

~/.easy.install  

สนุก ;-)


echo <password> จะยังคงปรากฏในรายการกระบวนการและถ้ามีคนโชคดีที่มี ps aux ในเวลาที่ถูกต้องพวกเขาสามารถเห็นรหัสผ่านเป็นข้อความที่ชัดเจน ดีกว่าที่จะบันทึกรหัสผ่านไปยังไฟล์และใช้ <เพื่อเปลี่ยนเส้นทางจากไฟล์ไปยัง sudo
bobpaul

1

การตั้งค่า sudo นั้นเป็นสิ่งที่อันตรายหากมีคนเห็นว่า sudo ไม่ต้องใช้รหัสผ่านในบัญชีของคุณ หากคุณไม่ทราบว่ากำลังทำอะไรอยู่อย่าทำเช่นนั้น ฉันเคยเกิดขึ้นที่โปรแกรมการฝึกอบรม A + ในพื้นที่กับคอมพิวเตอร์ทดลองของฉันหลายครั้งเกินไป ... -_-

สิ่งที่ John T. พูดนั้นฟังดูดีแม้ว่าจะมีความเสี่ยงในการค้นหารหัสผ่านในประวัติเชลล์ สิ่งที่ CarlF พูดได้ฟังดูดีกว่า แต่ถ้ามีคำสั่งเดียวล้มเหลวคอมพิวเตอร์จะยังคงทำงานด้วยสิทธิ์พิเศษของผู้ใช้


0

โดยส่วนตัวแล้วฉันทำอย่างเดียวกับที่จอห์นทีตอบเมื่อวันที่ 9 พ.ย. 2552 เวลา 2:47 น. ฉันได้ปรับปรุงการเรียนรู้ของฉันตามคำแนะนำของเขาด้วย

ความแตกต่างคือฉันมักจะใช้ประโยชน์จากตัวแปรเช่น:

AutoSuDo=$" $echo pass | sudo -S";
# Change AutoSuDo to something else.
# Note that string starts with space,
# useful only if used as first command in line

ด้วยวิธีนี้ฉันสามารถใช้ตัวแปรทุ่นระเบิดแทน sudo ได้อย่างง่ายดาย

$AutoSuDo apt-get update;

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

ฉันยังแนะนำให้ความสนใจกับ:

  • desgua ตอบเมื่อวันที่ 19 เม.ย. 54 เวลา 23:56 น
  • user224306 แสดงความคิดเห็นในวันที่ 14 พฤษภาคม '13 เวลา 17:38 น. สำหรับคำตอบของจอห์นทีเมื่อวันที่ 9 พ.ย. 2552 เวลา 2:47 น

0

ปัญหาได้รับการแก้ไขแล้ว ตัวอย่างเช่นสำหรับผู้ใช้รูท:

echo -e 'password\npassword\n' | sudo passwd root

แฟล็ก -e ทำอะไร @jerson Martinez
674669

1
แฟล็ก -e สำหรับ echo อนุญาตให้ตีความลำดับบางอย่างว่ามีความหมายพิเศษ
Jerson Martínez
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.