xin lỗi, bạn phải có một tty để chạy sudo


13

Tôi đã hỏi câu hỏi này trong Stack Overflow , nhưng tôi đã được yêu cầu đăng nó ở đây. Làm như vậy.

Tôi đã chạy lệnh này bằng chương trình java của mình-

sudo -u <username> -S pwd

Tôi đã nhận được đầu ra này-

command=sudo -u <username> -S pwd
exitCode=1
sudo: sorry, you must have a tty to run sudo

Tôi đã thử chỉnh sửa / etc / sudoers nhưng nó đã chứa

<username>       ALL=(ALL)       NOPASSWD: ALL

Sau đó, tôi đã học được rằng điều này có thể được thực hiện bằng cách nhận xét đoạn mã sau trong / etc / sudoers

# Defaults requiretty

Ngoài ra, theo mặc định, khi cố gắng thực thi một lệnh như một người dùng khác sử dụng sudo, chúng tôi phải cung cấp mật khẩu của riêng mình. Nhưng điều này có thể được thay đổi bằng cách thực hiện thay đổi sau trong / etc / sudoers-

Defaults targetpw

Câu hỏi của tôi là, có thể thực hiện lệnh trên của tôi trong java mà không thực hiện bất kỳ thay đổi nào ở mọi nơi tức là bằng cách có cài đặt mặc định không?


1
Đây có phải là lý do tại sao bạn yêu cầu Thay thế khá giả cho sudo ?
slhck

6
Có vẻ như distro cụ thể nếu requirettyđược bật theo mặc định. Theo tài liệusudo riêng của nó, nó "tắt theo mặc định."
mpy

Câu trả lời:


3

Tôi không biết cách chạy các lệnh shell trong Java nhưng hãy xem tùy chọn -t cho lệnh ssh

-t force pseudo-tty allocation.

Đó là những gì tôi làm khi tôi cần chạy lệnh dưới quyền root trên ssh (vô hiệu hóa đăng nhập root trực tiếp và tty được yêu cầu bởi sudo)


1
Mặc dù cách tiếp cận này có thể giải quyết vấn đề ngay từ cái nhìn đầu tiên nhưng nó không rõ ràng về việc nó liên quan đến câu hỏi như thế nào. Bạn có thể vui lòng giải thích chi tiết hơn?
pabouk

1
+1 để giải quyết vấn đề mà không cần thay đổi bất kỳ cài đặt mặc định nào.
Lu-ca

1

Câu hỏi của tôi là, có thể thực hiện lệnh trên của tôi trong java mà không thực hiện bất kỳ thay đổi nào ở bất cứ đâu tức là bằng cách có cài đặt mặc định không?

sudo -u -S pwd

Câu trả lời ngắn gọn là không, bạn sẽ cần thay đổi cài đặt để có được sudo để làm những việc khác với hiện tại.

sudo có thể là công cụ sai cho việc này. Các quy tắc của Sudo có mặt để giúp quản trị viên hệ thống định cấu hình một cách để đạt được các đặc quyền nâng cao rất khó lạm dụng để có được các đặc quyền bổ sung / ngoài ý muốn.

Nếu bạn xem xét những gì sudo làm cho bạn:

  1. lời nhắc nhập mật khẩu để xác minh danh tính
  2. nâng cao đặc quyền
  3. sau đó tùy chọn nhận các đặc quyền như một người dùng khác
  4. đăng nhập sudo sử dụng để có được quyền truy cập hoặc chạy lệnh

Nếu bạn muốn java của bạn chạy các lệnh tùy ý như người dùng tùy ý mà không cung cấp mật khẩu cho những người dùng đó hoặc của chính bạn, thì về cơ bản bạn đang thay thế sudo. Trong trường hợp đó, bạn nên tạo quy tắc của riêng mình về cách ngăn chặn lạm dụng.

Về cơ bản có hai cách để làm điều này:

  1. chạy java của bạn với các đặc quyền nâng cao và cẩn thận lấy và trả lại các đặc quyền bạn cần (xem các lệnh gọi hàm setuid () seteuid () C).
  2. chạy một chương trình bên ngoài để lấy các đặc quyền nâng cao khi bạn muốn chúng

Trong trường hợp # 1, chương trình java của bạn đang tự thực hiện những gì sudo làm và bạn nên thực hiện bộ quy tắc của riêng mình để bảo vệ khỏi lạm dụng.

Có những chương trình khác ngoài sudo để làm # 2. Một ví dụ có thể được tìm thấy trong https://code.google.com.vn/archive/p/exec-wrapper/doads

Kịch bản shell tiện dụng này tạo ra một chương trình C để chạy một lệnh khác (thường là một tập lệnh). Sau đó, bạn biên dịch chương trình C thành nhị phân và đánh dấu gốc setuid hoặc thực sự nó có thể được đặt cho bất kỳ người dùng nào. (chế độ: 4555 và chủ sở hữu: root)

Miễn là bạn đang ở trên một hệ thống tập tin cho phép nó, chạy chương trình nhị phân sẽ chạy lệnh được cấu hình là userid sở hữu chính chương trình nhị phân.

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.