Cách nhập mật khẩu chỉ một lần trong tập lệnh bash cần sudo


21

Dữ liệu

  • Tôi muốn người dùng vận hành trên máy này gắn kết cổ phiếu cifs của riêng họ
  • Các sudoerstập tin đã có chứa các /bin/mount -t cifs //*/* /media/* -o username=*lệnh cho tất cả các nhà khai thác
  • Tôi muốn người dùng gắn kết cifschia sẻ thông qua một tập lệnh gõ mật khẩu chỉ một lần, không phải hai lần.
  • Mật khẩu sudo và mật khẩu cifs giống hệt nhau.

Những gì tôi đã có

Kịch bản này hoạt động:

#!/bin/bash
sudo 'mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'

... nhưng nó yêu cầu người dùng gõ cùng một mật khẩu hai lần!

  • Một lần cho sudo
  • Một lần cho gắn kết chính nó

Điều này cũng sẽ làm việc:

#!/bin/bash
echo -n Password: 
read -s szPassword
echo $szPassword | sudo -S sh -c 'echo $szPassword | mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'

... nhưng điều này sẽ yêu cầu tôi cho phép tất cả người dùng của nhà điều hành có thểsudo sh (vấn đề bảo mật lớn)

Câu hỏi

Làm thế nào để gắn kết một CIFS cổ phiếu trong bash ¹ mà không đặt shtrong sudoerstập tin hay tạo ra một tập tin vĩnh viễn / tạm thời ???

Lưu ý 1: không có trăn, perl, C, Go, ... làm ơn?
Lưu ý 2: Tôi biết tôi chỉ có thể xóa mật khẩu qua sudoerstệp, nhưng tôi đang cố gắng thắt chặt bảo mật, không nới lỏng, mà không từ bỏ sự tiện lợi ...


2
Thế còn printf "%s\n" "$szPassword" "$szPassword" | sudo -S mount -t cifs / ...?
muru

Cố gắng ngay bây giờ! @Muru
Fabby

Câu trả lời:


24

Thay vào đó, bạn nên làm cho người dùng thực hiện cuộc gọi sử dụng sudo như sudo script. Chỉ cần kiểm tra nếu tập lệnh đang được chạy như root, nếu không yêu cầu nó

if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root, use sudo "$0" instead" 1>&2
   exit 1
fi

Đừng cố nắm bắt mật khẩu của người dùng của bạn.


1
Có lẽ tôi đang thiếu một cái gì đó, nhưng bạn có thể giải thích làm thế nào để giảm số lần nhắc mật khẩu từ hai xuống một không? Nếu không, tôi không thấy làm thế nào điều này trả lời câu hỏi.
Oliphistic - phục hồi Monica

@Oliphistic Tôi không thấy hai lời nhắc mật khẩu, bạn có thể giải thích điều đó không? Ngoài ra, câu trả lời này không phải là những gì OP muốn, mà là những gì nó cần. Là giải pháp sạch và phù hợp khi bạn cần chạy các lệnh với quyền root và cách các tiện ích khác thực hiện (kiểm tra nếu root, nếu không thì bảo lãnh)
Braiam

1
Vấn đề của OP (theo tôi hiểu) là người dùng được nhắc nhập mật khẩu của họ sudosau đó (sau khi xác thực thành công) một lần nữa mount. Trong trường hợp sử dụng của họ, các mật khẩu này giống hệt nhau để tôi có thể thấy lý do tại sao OP muốn người dùng chỉ phải nhập mật khẩu này một lần. Tôi không tin giải pháp của bạn giúp với điều này. Tôi đồng ý rằng người ta không nên nắm bắt mật khẩu.
Oliphistic - phục hồi Monica

Cảm ơn, nhưng tôi có thể đã đơn giản hóa câu hỏi một chút: Đó là một tập lệnh đã có, đã có bài kiểm tra đó (ngoại trừ 1>&2), trong phần tự động khởi động và nó chỉ là một chia sẻ cifs, nhưng bây giờ là ba, nên thực sự là một mật khẩu là cần thiết. (Nó đã chứa thử nghiệm đó trong trường hợp người khác, không phải thành viên của nhóm vận hành, cố gắng chạy nó)
Fabby

@Fabby Tôi vẫn nghĩ bạn đang tiếp cận vấn đề không chính xác. Đối với những trường hợp này, có người trợ giúp "nhớ" mật khẩu của chia sẻ CIFS / SMB một cách an toàn ( ~/.smbcredentialsví dụ chỉnh sửa ) và thậm chí không cần sudo (nếu bạn sử dụng gvfs, umount hoặc polkit).
Braiam

7

Tôi ngốc thật!

Kịch bản sau:

#!/bin/bash
read -p "Password: " -s szPassword
printf "%s\n" "$szPassword" | sudo --stdin mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER,password="$szPassword"

chỉ hoạt động và:

  1. Không tạo bất kỳ tệp nào chứa mật khẩu
  2. Cho phép người dùng chỉ nhập một mật khẩu cho nhiều lượt chia sẻ (bao gồm cả mật khẩu Windows)
  3. Không cần thêm đặc quyền để được cấp. :-)

1
1 câu hỏi: điều đó có lặp lại lệnh trong danh sách quy trình không?
Rinzwind

3
@Rinzwind là một tích hợp, nó không nên trong bash hoặc zsh. Lệnh mount có thể, mặc dù.
muru

<<<cũng có thể được sử dụng thay thế printf , nhưng cách tiếp cận tốt hơn sẽ là bỏ readhoàn toàn và chỉ sử dụng sudo --stdintất cả. Một cái gì đó như $ printf "Type out your password\n" && sudo --stdin apt-get update Người dùng vẫn có thể nhập mật khẩu sudo. và điều đó sẽ không đưa nó vào danh sách quá trình. Nhưng tất nhiên, có vô số vấn đề bảo mật khác có thể xảy ra, như keylogger, lỗ hổng tiềm ẩn sudo, và blah, và blah, và blah vào vô cùng
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy: Hãy thoải mái chỉnh sửa , anh bạn!
Fabby

3

Yêu cầu không có sudomật khẩu để thực hiện lệnh này; lời nhắc mật khẩu cho mountvẫn còn.

Trong sudoers, bao gồm một cái gì đó như

ALL        ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*

Sau khi bao gồm điều này, sudosẽ không còn yêu cầu mật khẩu cho lệnh cụ thể này; người dùng vẫn cần cung cấp mật khẩu cho mountlệnh.

Lưu ý : Tôi đã lấy nguyên văn lệnh từ những gì bạn đưa vào câu hỏi; Tôi đã không kiểm tra xem các ký tự đại diện của nó có cho phép người dùng làm điều gì đó khó chịu hay không. Đọc các sudoerstrang web cho ví dụ về sự khó chịu. Cụ thể, lưu ý rằng dòng này sudoerscho phép người dùng thêm bất kỳ số lượng -ochuyển đổi hoặc đối số khác vào mount. Bạn có thể muốn suy nghĩ lại về cách tiếp cận của mình, ví dụ: bằng cách thêm một tập lệnh như @Braiam đề xuất và cho phép chạy nó sudomà không cần xác thực thêm. Tập lệnh sau đó đảm bảo rằng người dùng chỉ có thể chạy hình thức cụ thể mountmà bạn muốn họ chạy.

Ngoài ra, thay vì cho phép điều này cho tất cả người dùng, bạn cũng có thể giới hạn điều này với các thành viên của một nhóm nhất định, ví dụ: bạn có thể tạo một nhóm cifsmountvà sau đó có

%cifsmount ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*

@Fabby Xin lỗi, nhưng điều này rất nguy hiểm về điều này? Ngoài ra tôi có thể đang phát hiện một gợi ý châm biếm, không chắc chắn.
Oliphistic - phục hồi Monica

tốt, ngay cả khi sudo không yêu cầu mật khẩu, mount vẫn có thể yêu cầu mật khẩu. Tệp / etc / sudoers có thể được sử dụng để làm cho sudo không yêu cầu mật khẩu. Điều đó sẽ không ảnh hưởng đến việc mount yêu cầu mật khẩu. Nếu một người không thể gắn kết, thì sudo cuối cùng sẽ chạy một lệnh không thành công, đó có thể không phải là vấn đề.
TUYỆT VỜI

@TOOGAM Đó là ý định của tôi. Một mật khẩu thay vì hai.
Oliphistic - phục hồi Monica

Ý định của tôi là giữ một nhóm "toán tử" trong tệp sudoers để nếu một toán tử cố gắn kết nội dung của riêng họ, họ vẫn phải nhập mật khẩu, nhưng để gắn kết toán tử "chuẩn", họ chỉ phải nhập mật khẩu một lần thay vì 5 lần ... Nhưng giải pháp của bạn có thể có hiệu quả với người khác, vì vậy đã được nâng cấp ... (và đã xóa nhận xét ban đầu)
Fabby

1

Một giải pháp chung cho những vấn đề này là đặt phần mở đầu sau ở đầu tập lệnh yêu cầu sudo của bạn:

#!/bin/bash
case $EUID in
   0) : cool we are already root - fall through ;;
   *) # not root, become root for the rest of this session
      # (and ask for the sudo password only once)
      sudo $0 "$@" ;;
esac
# now the present process is effective-UID  (root)
# so there's no need to put sudo in front of commands

any more commands here will run as superuser ...

Rõ ràng, điều này có một nhược điểm là nếu một số lệnh trong tập lệnh không yêu cầu sudochạy, thì có một sự nâng cao đặc quyền không cần thiết ở đây.

Dù sao, nghĩ rằng tôi sẽ chia sẻ mẹo nhỏ này. Điều thú vị nhất về nó, là nếu bạn đã sử dụng root hiệu quả (ví dụ nếu bạn đã gọi nó theo sudo) thì duyên dáng sẽ làm điều đúng đắn. Ngoài ra đưa ra một lỗi và buộc bạn phải gõ lại / chạy lại (với sudo) là ít thân thiện hơn.

Bạn cũng có thể muốn kiểm tra timestamp_timeoutbiến trong man 5 sudoersđó yêu sudocầu ghi nhớ thông tin đăng nhập của người dùng trong một số phút giới hạn (và có thể là phân số).


Tôi đã đơn giản hóa tập lệnh để có được câu trả lời dễ dàng: tập lệnh đã chứa: #test if root: if not: bail out if [[ $EUID -ne 0 ]]; then echo "This script must be run as root, use sudo "$0" instead" 1>&2 exit 1 fi Vấn đề là nó cũng chứa nhiều mount tất cả với cùng một mật khẩu (một lần nữa: đã xóa), nhưng dù sao cũng cảm ơn ...
Fabby 26/12/12

1
Vấn đề là giải pháp ở trên sẽ chỉ cần một lần nhập mật khẩu (đối với sudo). Nó không cần bất kỳ khác. Thêm vào đó, nó là một lỗi chung (và thanh lịch hơn là đưa ra lỗi và phải gõ lại lệnh bằng sudo) cho tất cả các vấn đề tương tự, ngay cả khi chúng yêu cầu nhiều (nhiều hơn hai) lệnh đặc quyền.
thân

nên nhưng nó không ! ;-) Đó là bởi vì mỗi mount cifs cũng yêu cầu mật khẩu. (vì nó thể khác với mật khẩu Ubuntu, nhưng trong trường hợp này không phải là do các nhà khai thác giữ mật khẩu Windows và Ubuntu của họ được đồng bộ hóa)
Fabby
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.