2011-02-01 40 views
26

Tôi đang viết một hàm hệ vỏ UNIX sẽ thực hiện lệnh sẽ nhắc người dùng nhập mật khẩu. Tôi muốn mã hóa mật khẩu vào mã lệnh và cung cấp nó cho lệnh. Tôi đã thử đường dẫn mật khẩu vào lệnh như sau:Làm thế nào để cung cấp mật khẩu cho một lệnh nhắc nhở một trong bash?

function() { 
    echo "password" | command 
} 

Điều này có thể không hoạt động đối với một số lệnh khi lệnh có thể xóa bộ đệm đầu vào trước khi yêu cầu mật khẩu.

Tôi cũng đã cố gắng chuyển hướng đầu vào tiêu chuẩn vào một tập tin chứa mật khẩu như thế này, nhưng điều đó không làm việc, hoặc:

function() { 
    echo "password" > pass.tmp 
    command < pass.tmp 
    rm pass.tmp 
} 

Tôi biết rằng một số lệnh cho phép các mật khẩu được cung cấp như một lập luận, nhưng tôi muốn đi qua đầu vào tiêu chuẩn.

Tôi đang tìm một cách nhanh chóng và dơ bẩn để nhập mật khẩu vào lệnh trong bash.

+3

Bạn đã xem 'tự động xác định' chưa? Nó không dễ dàng hơn thế. Bạn chỉ cần vượt qua nó lệnh và nó sẽ ghi lại tất cả mọi thứ bạn làm và tạo ra các tập tin mong đợi cho bạn. – SiegeX

Trả lời

19

Hãy xem autoexpect (phong nha hướng dẫn HERE). Đó là về như nhanh chóng và bẩn như bạn có thể nhận được mà không cần đến trickery.

+0

Tuyệt vời - thấy như thế nào mục đích thực sự của tôi là để có thể làm một cái gì đó nhanh chóng-n-bẩn, đây chỉ là những gì tôi cần! –

+0

Đã lưu tôi nhập cùng một mật khẩu ba lần vào VPN được thực hiện đáng buồn của tôi. (Tôi cũng tạo ra một kịch bản chỉ chạy '' 'mong đợi vpn.sh''') – Chazt3n

+1

Thật tuyệt vời khi có ít nhất một đoạn trích ngắn được đưa vào câu trả lời ở đây. Liên kết không * luôn luôn * làm việc sáu năm sau đó. Điều này có, nhưng :) – Unsigned

5

Lệnh bảo mật sẽ không cho phép điều này, và đúng như vậy, tôi sợ - đó là lỗ hổng bảo mật bạn có thể lái xe qua.

Nếu lệnh của bạn không cho phép sử dụng chuyển hướng đầu vào hoặc tham số dòng lệnh hoặc tệp cấu hình, thì bạn sẽ phải sử dụng thủ thuật nghiêm trọng.

Một số ứng dụng sẽ thực sự mở ra /dev/tty để đảm bảo bạn sẽ gặp khó khăn trong việc đánh bại bảo mật. Bạn có thể nhận xung quanh chúng bằng cách tạm thời tiếp quản /dev/tty (ví dụ như tạo đường ống của riêng bạn) nhưng điều này yêu cầu đặc quyền nghiêm trọng và thậm chí có thể bị đánh bại.

+1

Bạn nói đúng, tôi hiểu tại sao đây là lỗ hổng bảo mật, nhưng tôi đã ở trong một môi trường an toàn, vì vậy mối quan tâm chính của tôi là điều gì đó nhanh chóng-bẩn mà không phải sử dụng đến những trò gian lận nghiêm trọng. Cảm ơn vì sự trả lời! –

2

Các chương trình nhắc mật khẩu thường đặt tty thành chế độ "thô" và đọc trực tiếp đầu vào từ tty. Nếu bạn sinh ra tiến trình con trong một pty bạn có thể thực hiện công việc đó. Đó là những gì mong đợi không ...

+0

bạn có thể vui lòng đưa ra một ví dụ tối thiểu về điều này? – dibyendu

22

Làm thế nào để sử dụng autoexpect đến ống mật khẩu vào một lệnh:

Các bước này được minh họa bằng một 12.10 desktop Ubuntu. Các lệnh chính xác cho phân phối của bạn có thể hơi khác.

Điều này rất nguy hiểm vì bạn có nguy cơ phơi bày bất kỳ mật khẩu nào bạn sử dụng cho bất kỳ ai có thể đọc tệp tập lệnh tự động xác định.

KHÔNG hiển thị mật khẩu gốc hoặc mật khẩu người dùng nguồn của bạn bằng cách đặt chúng qua mong đợi như thế này. Bộ dụng cụ gốc SILL tìm thấy điều này ngay lập tức và hộp của bạn được sở hữu.

EXPECT sinh ra một quy trình, đọc văn bản đi kèm rồi gửi văn bản được xác định trước trong tệp tập lệnh.

  1. Đảm bảo bạn có expectautoexpect cài đặt:

    sudo apt-get install expect 
    sudo apt-get install expect-dev 
    
  2. Đọc trên nó:

    man expect 
    man autoexpect 
    
  3. Tới thư mục chính của bạn:

    cd /home/el 
    
  4. tài el không thể chown một tập tin vào thư mục gốc và phải nhập mật khẩu:

    touch testfile.txt 
    sudo chown root:root testfile.txt 
        [enter password to authorize the changing of the owner] 
    
  5. Đây là sự xâm nhập mật khẩu, chúng tôi muốn tự động hoá. Khởi động lại thiết bị đầu cuối để đảm bảo rằng sudo yêu cầu chúng tôi nhập lại mật khẩu. Truy cập/home/el lần nữa và thực hiện việc này:

    touch myfile.txt 
    
    autoexpect -f my_test_expect.exp sudo chown root:root myfile.txt 
    
        [enter password which authorizes the chown to root] 
    
    autoexpect done, file is my_test_expect.exp 
    
  6. Bạn đã tạo tệp my_test_expect.exp. Mật khẩu siêu bí mật của bạn được lưu trữ bản rõ trong tệp này. Điều này sẽ làm cho bạn RẤT khó chịu. Giảm thiểu một số khó chịu bằng cách hạn chế quyền và quyền sở hữu càng nhiều càng tốt:

    sudo chown el my_test_expect.exp  //make el the owner. 
    sudo chmod 700 my_test_expect.exp //make file only readable by el. 
    
  7. Bạn thấy những loại lệnh ở dưới cùng của my_test_expect.exp:

    set timeout -1 
    spawn sudo chown root:root myfile.txt 
    match_max 100000 
    expect -exact "\[sudo\] password for el: " 
    send -- "YourPasswordStoredInPlaintext\r" 
    expect eof 
    
  8. Bạn sẽ cần phải xác minh rằng mong đợi trên lệnh phù hợp. Nếu kịch bản tự động phát hiện quá nhạy cảm hoặc không đủ nhạy cảm thì tập lệnh sẽ bị treo. Trong trường hợp này, nó có thể chấp nhận được vì mong đợi đang đợi văn bản sẽ luôn đến.

  9. Chạy kịch bản mong đợi là người dùng el:

    expect my_test_expect.exp 
    spawn sudo chown root:root myfile.txt 
    [sudo] password for el: 
    
  10. Mật khẩu chứa trong my_test_expect.exp được đường ống vào một chown để rễ của thành viên el. Để xem nếu mật khẩu đã được chấp nhận, nhìn vào myfile.txt:

    ls -l 
    -rw-r--r-- 1 root root   0 Dec 2 14:48 myfile.txt 
    

Nó làm việc bởi vì nó là gốc, và el chưa bao giờ nhập mật khẩu. Nếu bạn để lộ mật khẩu gốc, sudo hoặc mật khẩu người dùng của bạn với tập lệnh này, thì việc lấy thư mục gốc trên hộp của bạn sẽ dễ dàng. Đó là hình phạt cho một hệ thống an ninh cho phép mọi người không hỏi gì.

+1

Bài đăng này sẽ không được bình chọn như bình thường. Mật khẩu được thực hiện vì một lý do, và điều này chủ yếu đánh bại mục đích đó. –

1

Đơn giản chỉ cần sử dụng:

echo "password" | sudo -S mount -t vfat /dev/sda1 /media/usb/; 
if [ $? -eq 0 ]; then 
    echo -e '[ ok ] Usb key mounted' 
else 
    echo -e '[warn] The USB key is not mounted' 
fi 

Mã này đang làm việc cho tôi, và nó ở /etc/init.d/myscriptbash.sh

5

Bạn có thể sử dụng -S cờ để đọc từ đầu vào tiêu chuẩn. Tìm bên dưới ví dụ:

function shutd() 
{ 
    echo "mySuperSecurePassword" | sudo -S shutdown -h now 
}  
+0

Cảm ơn bạn. Điều này hoạt động hoàn hảo như việc thực hiện vani nhanh và dơ bẩn. –

Các vấn đề liên quan