
나는 이미 이 질문을 했습니다.스택 오버플로, 그런데 여기에 게시해 달라는 요청을 받았습니다. 그래서 똑같이합니다.
내 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가 당신을 위해 무엇을 하는지 고려한다면:
- 신원 확인을 위해 비밀번호를 묻는 메시지가 표시됩니다.
- 권한 상승
- 그런 다음 선택적으로 다른 사용자로서 권한을 얻습니다.
- 액세스 권한을 얻거나 명령을 실행하기 위해 sudo 사용을 기록합니다.
Java가 해당 사용자 또는 자신의 비밀번호를 제공하지 않고 임의의 사용자로서 임의의 명령을 실행하도록 하려면 본질적으로 sudo를 대체합니다. 이 경우 남용을 방지하는 방법에 대한 자체 규칙을 만들어야 합니다.
이를 수행하는 방법에는 기본적으로 두 가지가 있습니다.
- 높은 권한으로 Java를 실행하고 필요한 권한을 신중하게 취하고 돌려주십시오(setuid() seteuid() C 함수 호출 참조).
- 원할 때 외부 프로그램을 실행하여 높은 권한을 얻으세요
#1의 경우 Java 프로그램은 sudo가 수행하는 작업을 자체적으로 수행하므로 남용으로부터 보호하기 위해 고유한 규칙 세트를 구현해야 합니다.
#2를 수행하기 위한 sudo 이외의 프로그램이 있습니다. 한 가지 예는 다음에서 찾을 수 있습니다.https://code.google.com/archive/p/exec-wrapper/downloads
이 편리한 쉘 스크립트는 다른 명령(일반적으로 스크립트)을 실행하는 C 프로그램을 생성합니다. 그런 다음 C 프로그램을 바이너리로 컴파일하고 해당 setuid 루트를 표시하거나 실제로 모든 사용자에게 setuid가 될 수 있습니다. (모드 : 4555 및 소유자 : 루트)
이를 허용하는 파일 시스템에 있는 한 바이너리 프로그램을 실행하면 바이너리 프로그램 자체를 소유한 사용자 ID로 구성된 명령이 실행됩니다.