selalu meminta pengguna sebelum menjalankan perintah di shell

10

Apakah ada utilitas yang selalu meminta pengguna untuk konfirmasi sebelum menjalankan perintah yang mirip dengan cara sudomeminta kata sandi?

m33lky
sumber
1
Apakah Anda benar-benar menginginkan itu untuk perintah apa pun? Termasuk cddan ls?
Carsten Thiel
Saya ingin memilikinya di alias saya sendiri di .bashrc.
m33lky

Jawaban:

9

Apakah Anda ingin berfungsi tanpa mengetik perintah tambahan, mis

$ rm file

Atau hanya ketika pengguna mengetik sesuatu seperti

$ confirm rm file

Atau hanya ketika pengguna mencoba menjalankan perintah tertentu, mis

$ rm file

tapi tidak untuk

$ echo "Hello"

Jika opsi 1, itu bisa dilakukan dengan menggunakan preexec hook di zsh, atau perangkap DEBUG di bash.

Jika opsi 2, masukkan sesuatu seperti ini di /etc/bash.bashrcatau file startup shell lainnya.

confirm() {
    echo -n "Do you want to run $*? [N/y] "
    read -N 1 REPLY
    echo
    if test "$REPLY" = "y" -o "$REPLY" = "Y"; then
        "$@"
    else
        echo "Cancelled by user"
    fi
}

Jika opsi 3, Anda dapat memodifikasi confirmskrip di atas, atau, beberapa perintah memiliki opsi untuk bertanya sebelum melakukan sesuatu, misalnya rm -i. Anda bisa menempatkan alias rm='rm -i'di /etc/bash.bashrc.

Mikel
sumber
Saya ingin konfirmasi hanya untuk satu perintah tunggal yang selalu membuat saya sakit kepala. Seperti apa bentuk skripnya?
Danijel
10

Saya telah bermain dengan bash sedikit dan menemukan hack yang memungkinkan ini terjadi.

#!/bin/bash

debug_trap () {
    echo "executing $BASH_COMMAND"
    echo "Allow?"
    select choice in yes no
    do
        if [ "$choice" = "yes" ]
        then break
        elif [ "$choice" = "no" ]
        then return 1
        fi
    done
}

shopt -s extdebug
trap debug_trap DEBUG

Anda dapat menyimpan skrip ini di bawah, misalnya, confirm-any-command.shdan sourcedi skrip Anda bashrc. Ini akan meminta konfirmasi dari setiap perintah yang akan Anda coba jalankan.

Harap dicatat bahwa ini tidak lebih dari peretasan proof-of-concept; Saya ragu itu bisa benar-benar bermanfaat dalam bentuk ini. Jika Anda harus mengkonfirmasi setiap perintah yang Anda ketikkan, Anda akan segera mendapatkan kebiasaan untuk secara otomatis menekan "ya" setelah setiap perintah. Pemetaan mental Anda untuk "akhir perintah" akan berubah dari hanya Enteruntuk Enter, yes, Enter- Anda akan mengetik itu secara keseluruhan, bahkan tidak mencoba untuk menghabiskan beberapa waktu di memverifikasi bahwa Anda benar-benar ingin perintah ini untuk mengeksekusi. Ini kontraproduktif dan tidak akan membantu Anda.

ulidtko
sumber
Berhenti Allow? 1) yes 2) no #? baik yesatau nobekerja menyebabkan loop tak terbatas (Debian 8)
vladkras
@vladkras baca help select: Anda seharusnya memasukkan 1atau 2bukan yesatau no. Retry otomatis untuk input yang tidak valid adalah perilaku yang dimaksudkan (sehingga penulis skrip tidak harus menemukan kembali whiledirinya sendiri, mempertahankan keringkasan dan kejelasan), dan input EOF mengakhiri loop. Mengetahui hal itu, Anda dapat memeriksa sendiri bahwa skrip di atas berfungsi. Saya tidak akan memodifikasinya, karena itu merupakan bukti konsep yang kasar.
ulidtko
itu benar. Saya bingung dengan y e s Entercontoh Anda
vladkras