ฉันจะรันคำสั่ง sudo ที่ต้องการป้อนรหัสผ่านในพื้นหลังได้อย่างไร?


29

ฉันเพิ่งปิดใช้งานsudoความสามารถในการแคชการตรวจสอบสิทธิ์เมื่อเร็ว ๆ นี้เพื่อให้พร้อมท์ขอรหัสผ่านทุกครั้ง

และแม้ว่าสิ่งนี้จะดีสำหรับการรักษาความปลอดภัย แต่ก็ทำให้เกิดปัญหาเล็กน้อยหนึ่งที่ฉันไม่สามารถหาวิธีแก้ปัญหาได้ แต่ฉันไม่สามารถเรียกใช้คำสั่งที่ไปตามแนวของ:

sudo <command> &

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

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

ฉันใช้ Ubuntu GNOME 15.10 กับ GNOME 3.18 และโดยเฉพาะอย่างยิ่งโปรแกรมที่ฉันต้องการเรียกใช้ในลักษณะนี้คือetherapeถ้ามันสร้างความแตกต่าง แต่ฉันต้องการโซลูชันสำหรับโปรแกรมและคำสั่งทั้งหมด


3
@kossince คือไม่สามารถค้นหาได้จริงๆผมเปลี่ยนที่& … sudo command in the background
muru

@muru หากคุณสามารถค้นหาเสิร์ชเอ็นจิ้นยอดนิยมค้นหาตัวละครพิเศษแทน : P
kos

1
@kos คุณต้องการจะประหลาดใจ : D
muru

คำตอบ:


56

แทนที่จะทำงานsudoในพื้นหลังบอกsudoให้เรียกใช้คำสั่งในพื้นหลัง จากman sudo:

-b, --background
     Run the given command in the background.  Note that it is not
     possible to use shell job control to manipulate background
     processes started by sudo.  Most interactive commands will
     fail to work properly in background mode.

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

sudo -b sleep 10

อีกวิธีหนึ่งคือใช้เชลล์เพื่อรันคำสั่ง:

sudo sh -c 'sleep 10 &'

ตัวเลือกอื่นจะระบุโปรแกรมกราฟิกสำหรับรับรหัสผ่านและส่งsudoไปที่พื้นหลังอยู่ดี:

-A, --askpass
     Normally, if sudo requires a password, it will read it from
     the user's terminal.  If the -A (askpass) option is
     specified, a (possibly graphical) helper program is executed
     to read the user's password and output the password to the
     standard output.  If the SUDO_ASKPASS environment variable is
     set, it specifies the path to the helper program.  Otherwise,
     if sudo.conf(5) contains a line specifying the askpass
     program, that value will be used.  For example:

         # Path to askpass helper program
         Path askpass /usr/X11R6/bin/ssh-askpass

     If no askpass program is available, sudo will exit with an
     error.

โปรแกรม Askpass มักใช้กับ SSH หนึ่งในนั้นมีให้โดยssh-askpass-gnomeแพ็คเกจซึ่งติดตั้งโดยค่าเริ่มต้นอย่างน้อยใน Ubuntu 15.10

SUDO_ASKPASS=/usr/bin/ssh-askpass sudo -A sleep 10 &

11

หากคุณยินดีที่จะตั้งtimestamp_timeoutอย่างน้อยชอบ0.02(1.2 วินาทีฉันจะบอกว่าปลอดภัยเท่า0) ใน/etc/sudoers(จำเป็นในกรณีของคุณ แต่ด้วยการตั้งค่าเริ่มต้นหรือtimestamp_timeoutตั้งค่าเป็นอะไรก็ได้ แต่0อย่างใดอย่างหนึ่งอาจทำต่อไปนี้) คุณสามารถตั้งชื่อแทนเช่นนี้~/.bashrcได้ซึ่งไม่จำเป็นต้องให้คุณจำบางสิ่งก่อนเรียกใช้คำสั่งและจะช่วยให้คุณสามารถควบคุมกระบวนการได้:

alias sudo='sudo -v; [ $? ] && sudo'

เคล็ดลับที่นี่คือเครื่องหมายอัฒภาคซึ่งจะทำให้ Bash แจงsudo -vก่อนและแยกพิสูจน์ตัวจริงของผู้ใช้และ จำกัด ส่วนพื้นหลังที่อาจเกิดขึ้นกับ[ $? ] && sudoคำสั่งซึ่งจะตรวจสอบว่าsudo -vประสบความสำเร็จและทำงานsudoอีกครั้ง

$ alias sudo='sudo -v; [ $? ] && sudo'
$ sudo -H gedit &
[sudo] password for user:
[1] 19966
$ jobs
[1]+  Running                 [ $? ] && sudo -H gedit &

ไม่sudo -vขยายการแคชข้อมูลประจำตัวแม้ว่าแคชถูกปิดใช้งาน? และ IIRC <สำหรับนามแฝงที่จะขยายพื้นที่ควรอยู่ท้ายคำสั่งไม่ใช่ที่จุดเริ่มต้น
muru

@muru ขวาฉันลืมเขาได้ตั้งค่าให้timestamp_timeout 0และใช่ฉันยุ่งกับสิ่งขยายนามแฝงจริง ๆ นามแฝงไม่ควรขยาย ขอบคุณ
kos

จะไม่alias sudo='sudo -v && sudo'ดีเหมือนกันใช่ไหม
G-Man กล่าวว่า 'Reinstate Monica'

@ G-Man ไม่ได้ผลเพราะ;Bash แยกวิเคราะห์sudo -vก่อนและแยกกัน การใช้&&Bash จะแยกวิเคราะห์ทั้งคำสั่งเดียวและพื้นหลังทั้งสองทันที
kos

8

คุณทำไม่ได้ การ&ส่งคำสั่งไปยังพื้นหลังทันที นั่นคือ subshell ถูกสร้างขึ้นในพื้นหลังและคำสั่งจะถูกดำเนินการที่นั่น เมื่อคำสั่งนั้นแสดงพรอมต์ตามที่เป็นกรณีของsudoพรอมต์จะปรากฏในพื้นหลังและคุณไม่เคยเห็น

วิธีเดียวที่จะนำคำสั่งกลับมาที่พื้นหน้าจัดเตรียมรหัสผ่านและส่งกลับไปที่พื้นหลัง ตัวอย่างเช่น:

$ sudo command &
$ fg
sudo command
[sudo] password for terdon: 

ตอนนี้ใส่รหัสผ่านของคุณEnterแล้วกดCtrlZเพื่อส่งกลับไปที่พื้นหลังและbgบอกให้มันทำงานต่อไป

วิธีที่ง่ายกว่าคือการไม่ใช้&และแทนที่จะส่งงานไปที่พื้นหลังด้วยตนเองด้วยCtrlZและbgหลังจากเปิดใช้งาน

สุดท้ายคุณอาจต้องการพิจารณาตั้งค่าการหมดเวลาของรหัสผ่านของ sudo เป็น 1 หรือ 2 วินาที สิ่งนั้นจะยังคงให้ความปลอดภัยเพียงพอ (เว้นแต่คุณจะพยายามป้องกันแฟลช) และอนุญาตให้คุณเรียกใช้คำสั่งเช่นนั้น


แฟลชได้ขโมยเค้กช็อคโกแลตของฉันไปแล้ว ... ; P

2
ในยุคนี้ของ Adobe ช่องโหว่และมัลแวร์ที่ติดเฟิร์มแวร์การระมัดระวังของ Flash นั้นได้รับการรับประกัน
Damian Yerrick


ในหมายเหตุด้านข้างเป็นไปได้หรือไม่ที่จะกำหนดการหมดเวลาเป็นวินาที man sudoersกล่าวว่าtimestamp_timeoutค่าของจะต้องระบุนาทีด้วยส่วนที่เป็นไปได้ (ซึ่งจะทำให้เกิดsudoข้อผิดพลาดถ้าฉันพยายามที่จะระบุหนึ่งไม่แน่ใจว่าทำไม)
kos

2
@kos ดูเหมือนว่าใช่ 2.5ทำงานได้ดีที่นี่ (Arch, sudoรุ่น 1.8.15)
terdon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.