죄송합니다. sudo를 실행하려면 tty가 있어야 합니다.

죄송합니다. sudo를 실행하려면 tty가 있어야 합니다.

나는 이미 이 질문을 했습니다.스택 오버플로, 그런데 여기에 게시해 달라는 요청을 받았습니다. 그래서 똑같이합니다.

내 Java 프로그램을 사용하여 이 명령을 실행했습니다.

sudo -u <username> -S pwd

나는이 출력을 얻었다 -

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

/etc/sudoers 편집을 시도했지만 이미 포함되어 있습니다.

<username>       ALL=(ALL)       NOPASSWD: ALL

그런 다음 /etc/sudoers에서 다음 코드를 주석 처리하면 이 작업을 수행할 수 있다는 것을 알게 되었습니다.

# Defaults requiretty

또한 기본적으로 를 사용하여 다른 사용자로 명령을 실행하려고 할 때 sudo자체 비밀번호를 제공해야 합니다. 그러나 이는 /etc/sudoers-에서 다음과 같이 변경하여 변경할 수 있습니다.

Defaults targetpw

내 질문은,기본 설정을 사용하여 어디서나 변경하지 않고 Java에서 위 명령을 실행할 수 있습니까??

답변1

Java에서 쉘 명령을 실행하는 방법을 모르지만 ssh 명령에 대한 -t 옵션을 살펴보십시오.

-t force pseudo-tty allocation.

이것이 SSH를 통해 루트로 명령을 실행해야 할 때 수행하는 작업입니다(직접 루트 로그인 비활성화 및 sudo에 필요한 tty).

답변2

내 질문은 기본 설정을 사용하여 아무 곳이나 변경하지 않고 Java에서 위 명령을 실행할 수 있습니까?

sudo -u -S 비밀번호

짧은 대답은 '아니오'입니다. sudo가 현재와 다르게 작업을 수행하도록 하려면 설정을 변경해야 합니다.

sudo는 이에 대한 잘못된 도구일 수 있습니다. Sudo의 규칙은 시스템 관리자가 추가/의도하지 않은 권한을 얻기 위해 남용하기 어려운 권한 상승 방법을 구성하는 데 도움이 됩니다.

sudo가 당신을 위해 무엇을 하는지 고려한다면:

  1. 신원 확인을 위해 비밀번호를 묻는 메시지가 표시됩니다.
  2. 권한 상승
  3. 그런 다음 선택적으로 다른 사용자로서 권한을 얻습니다.
  4. 액세스 권한을 얻거나 명령을 실행하기 위해 sudo 사용을 기록합니다.

Java가 해당 사용자 또는 자신의 비밀번호를 제공하지 않고 임의의 사용자로서 임의의 명령을 실행하도록 하려면 본질적으로 sudo를 대체합니다. 이 경우 남용을 방지하는 방법에 대한 자체 규칙을 만들어야 합니다.

이를 수행하는 방법에는 기본적으로 두 가지가 있습니다.

  1. 높은 권한으로 Java를 실행하고 필요한 권한을 신중하게 취하고 돌려주십시오(setuid() seteuid() C 함수 호출 참조).
  2. 원할 때 외부 프로그램을 실행하여 높은 권한을 얻으세요

#1의 경우 Java 프로그램은 sudo가 수행하는 작업을 자체적으로 수행하므로 남용으로부터 보호하기 위해 고유한 규칙 세트를 구현해야 합니다.

#2를 수행하기 위한 sudo 이외의 프로그램이 있습니다. 한 가지 예는 다음에서 찾을 수 있습니다.https://code.google.com/archive/p/exec-wrapper/downloads

이 편리한 쉘 스크립트는 다른 명령(일반적으로 스크립트)을 실행하는 C 프로그램을 생성합니다. 그런 다음 C 프로그램을 바이너리로 컴파일하고 해당 setuid 루트를 표시하거나 실제로 모든 사용자에게 setuid가 될 수 있습니다. (모드 : 4555 및 소유자 : 루트)

이를 허용하는 파일 시스템에 있는 한 바이너리 프로그램을 실행하면 바이너리 프로그램 자체를 소유한 사용자 ID로 구성된 명령이 실행됩니다.

관련 정보