luôn nhắc người dùng trước khi thực hiện một lệnh trong trình bao


10

Có tiện ích nào luôn nhắc người dùng xác nhận trước khi thực hiện lệnh tương tự như cách sudoyêu cầu mật khẩu không?


1
Bạn có thực sự muốn điều đó cho bất kỳ lệnh nào? Bao gồm cdls?
Carsten Thiel

Tôi muốn có nó trong bí danh của riêng tôi trong .bashrc.
m33lky

Câu trả lời:


9

Bạn có muốn nó hoạt động mà không cần gõ thêm một lệnh không, vd

$ rm file

Hoặc chỉ khi người dùng gõ một cái gì đó như

$ confirm rm file

Hoặc chỉ khi người dùng cố gắng chạy một số lệnh nhất định, ví dụ:

$ rm file

nhưng không cho

$ echo "Hello"

Nếu tùy chọn 1, điều đó có thể được thực hiện bằng cách sử dụng hook preexec trong zsh hoặc bẫy DEBUG trong bash.

Nếu tùy chọn 2, đặt một cái gì đó như thế này vào /etc/bash.bashrchoặc tập tin khởi động shell khác.

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
}

Nếu tùy chọn 3, bạn có thể sửa đổi confirmkịch bản ở trên, hoặc, một số lệnh có một tùy chọn để hỏi trước khi làm điều gì đó, ví dụ rm -i. Bạn có thể đặt alias rm='rm -i'vào /etc/bash.bashrc.


Tôi muốn xác nhận chỉ cho một lệnh duy nhất luôn khiến tôi đau đầu. Kịch bản sẽ như thế nào?
Danijel

10

Tôi đã chơi với bash một chút và tìm ra một bản hack mà điều này có thể được thực hiện.

#!/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

Bạn có thể lưu tập lệnh này bên dưới, nói confirm-any-command.shsourcetrong tập lệnh của bạn bashrc. Nó sẽ yêu cầu xác nhận từng lệnh bạn sẽ cố gắng thực hiện.

Xin lưu ý rằng đây không gì khác hơn là một bản hack bằng chứng; Tôi nghi ngờ nó thực sự có thể hữu ích trong hình thức này. Nếu bạn sẽ phải xác nhận từng lệnh bạn nhập, bạn sẽ sớm có thói quen tự động nhấn "có" sau mỗi lệnh. Lập bản đồ tinh thần của bạn cho "kết thúc lệnh" sẽ thay đổi từ chỉ Enterđến Enter, yes, Enter- bạn sẽ được gõ nó như một toàn thể, thậm chí không cố gắng dành chút thời gian vào xác minh rằng bạn thực sự muốn lệnh này để thực thi. Điều này là phản tác dụng và sẽ không giúp bạn.


Dừng Allow? 1) yes 2) no #? không phải yescũng không nohoạt động gây ra vòng lặp vô hạn (Debian 8)
vladkras

@vladkras đọc help select: bạn phải nhập 1hoặc 2hơn yeshoặc no. Thử lại tự động cho các đầu vào không hợp lệ là hành vi dự định (để người viết kịch bản không phải tự sáng tạo lại while, giữ lại sự rõ ràng và rõ ràng) và đầu vào EOF chấm dứt vòng lặp. Biết được điều đó, bạn có thể tự kiểm tra xem đoạn script trên có hoạt động không. Tôi sẽ không sửa đổi nó, vì dù sao đó cũng là một bằng chứng thô thiển về khái niệm.
ulidtko

đúng. Tôi đã bối rối trước y e s Enterví dụ của bạn
vladkras
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.