Bagaimana cara menjalankan perintah sudo yang membutuhkan input kata sandi di latar belakang?

29

Saya baru-baru ini menonaktifkan sudokemampuan cache otentikasi sehingga sekarang meminta saya untuk kata sandi setiap waktu.

Dan meskipun ini bagus untuk keamanan, itu telah menyebabkan satu masalah kecil yang belum dapat saya temukan solusinya, saya tidak dapat menjalankan perintah yang sejalan dengan:

sudo <command> &

Di masa lalu saya akan menjalankan sudoperintah sebelum itu, itu akan men-cache kata sandi saya dan memungkinkan saya untuk menjalankan sudoperintah tanpa cepat selama beberapa menit berikutnya, dan dengan demikian itu akan memungkinkan saya untuk menjalankan perintah.
Tetapi ketika saya menjalankannya sekarang karena tidak ada caching di tangan sebelumnya dan karena memulai thread baru segera dan sudobahkan tidak meminta saya untuk kata sandi, saya tidak dapat menjalankannya dengan cara ini.

Jadi kecuali saya menjalankan sudo -isebelumnya saya tidak dapat menjalankan perintah dalam format ini yang menjadi agak mengganggu.
Jadi saya bertanya-tanya apakah ada cara untuk mengatasi ini dan masih menjalankan program dan perintah dengan cara ini?

Saya menjalankan Ubuntu GNOME 15.10 dengan GNOME 3.18, dan secara khusus program yang ingin saya jalankan dengan cara ini adalah etherapejika itu membuat perbedaan, tetapi saya ingin solusi untuk bekerja untuk semua program dan perintah.

muru
sumber
3
@ Kossince &tidak benar-benar dapat ditelusuri, saya mengubahnya menjadi … sudo command in the background.
muru
@muru Jika Anda dapat membuat mesin pencari populer mencari karakter khusus sebagai gantinya. : P
kos
1
@kos Anda akan terkejut . : D
muru

Jawaban:

56

Alih-alih berjalan sudodi latar belakang, minta sudountuk menjalankan perintah di latar belakang. Dari 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.

Sebagai contoh:

sudo -b sleep 10

Cara lain adalah dengan menggunakan shell untuk menjalankan perintah:

sudo sh -c 'sleep 10 &'

Opsi lain akan menentukan program grafis untuk mendapatkan kata sandi, dan tetap mengirim sudoke latar belakang:

-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.

Program Askpass biasanya digunakan untuk SSH. Salah satunya disediakan oleh ssh-askpass-gnomepaket, yang diinstal secara default, setidaknya di Ubuntu 15.10.

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

Jika Anda bersedia untuk mengatur timestamp_timeoutsetidaknya sesuatu seperti 0.02(1,2 detik, saya akan mengatakan seaman 0) di /etc/sudoers(diperlukan dalam kasus Anda, tetapi dengan pengaturan default atau dengan timestamp_timeoutdiatur ke apa pun kecuali 0satu dapat melakukan hal berikut) , Anda dapat mengatur alias seperti ini ~/.bashrc, yang tidak mengharuskan Anda untuk mengingat sesuatu sebelum menjalankan perintah dan yang memungkinkan Anda untuk tetap mengontrol proses .:

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

Kuncinya di sini adalah titik koma, yang akan membuat Bash mengurai sudo -vpertama dan secara terpisah, mengautentikasi pengguna, dan membatasi bagian latar belakang potensial untuk [ $? ] && sudoperintah, yang akan memeriksa apakah sudo -vberhasil dan berjalan sudolagi (berpotensi melatar belakanginya) jika itu terjadi.

$ alias sudo='sudo -v; [ $? ] && sudo'
$ sudo -H gedit &
[sudo] password for user:
[1] 19966
$ jobs
[1]+  Running                 [ $? ] && sudo -H gedit &
kos
sumber
Apakah sudo -vmemperpanjang caching kredensial bahkan jika caching dinonaktifkan? Dan, IIRC <untuk alias berkembang, ruang harus di akhir perintah, bukan di awal.
muru
@muru Rasanya aku lupa dia telah timestamp_timeoutmengatur untuk 0. Dan ya, saya benar-benar kacau dengan hal ekspansi alias, sebenarnya alias tidak boleh berkembang. Terima kasih.
kos
Bukankah alias sudo='sudo -v && sudo'sama baiknya?
G-Man Mengatakan 'Reinstate Monica'
@ G-Man Tidak, ini berfungsi karena ;Bash membuat parse sudo -vpertama dan terpisah; menggunakan &&Bash akan menguraikan keduanya sebagai satu perintah dan latar belakang keduanya dengan segera.
kos
8

Kamu tidak bisa The &mengirimkan perintah ke latar belakang segera. Artinya, subkulit dibuat di latar belakang dan perintah dijalankan di sana. Ketika perintah itu mengeluarkan prompt, seperti halnya sudo, prompt ditampilkan di latar belakang dan Anda tidak pernah melihatnya.

Satu-satunya cara untuk melakukannya adalah mengembalikan perintah ke latar depan, memberikan kata sandi dan mengirimkannya kembali ke latar belakang. Sebagai contoh:

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

Sekarang, masukkan kata sandi Anda, tekan Enterdan kemudian tekan CtrlZuntuk mengirimnya kembali ke latar belakang dan bgmengatakannya untuk terus berjalan.

Pendekatan yang lebih sederhana adalah dengan tidak pernah menggunakan &dan, sebagai gantinya, mengirim pekerjaan ke latar belakang secara manual dengan CtrlZdan bgsetelah meluncurkannya.

Terakhir, Anda mungkin ingin mempertimbangkan untuk menyetel batas waktu kata sandi sudo menjadi sekitar 1 atau 2 detik. Itu masih akan memberi Anda keamanan yang cukup (kecuali jika Anda mencoba menjaga terhadap Flash) dan memungkinkan Anda untuk menjalankan perintah seperti itu seperti yang diharapkan.

terdon
sumber
Flash telah mencuri kue cokelat saya jadi ... ; P
2
Di era kerentanan dan malware Adobe yang menginfeksi firmware, waspada terhadap Flash diperlukan.
Damian Yerrick
Di samping catatan, apakah mungkin mengatur waktu tunggu menjadi detik? man sudoersnilai mengatakan timestamp_timeoutharus menentukan menit dengan bagian fraksional yang mungkin (yang omong-omong membuat sudokesalahan jika saya mencoba untuk menentukan satu, tidak yakin mengapa).
kos
2
@kos kedengarannya seperti itu ya. 2.5berfungsi dengan baik di sini (Arch, sudoversi 1.8.15).
terdon