쉘 스크립트에서 루트 비밀번호를 안전하게 전달하십시오.

쉘 스크립트에서 루트 비밀번호를 안전하게 전달하십시오.

나는 항상 콘솔 모드에서 GNU/Linux 노트북을 시작합니다. 하지만 때로는 GUI 모드를 불러와야 할 때도 있습니다. 항상 루트 비밀번호를 묻습니다. 그래서 다음 스크립트 "gogui.sh"를 작성하여 다음 위치에 넣었습니다 /usr/bin.

#!/bin/bash
echo "mypassword" | sudo service lightdm start

이는 마치 파일을 읽는 사람이 내 비밀번호를 쉽게 알 수 있다는 것처럼 매우 어리석은 생각입니다.

대안이 있나요?

답변1

스크립트에서 sudo에 비밀번호를 전달하는 것은 전혀 의미가 없습니다. 대신 sudo 규칙을 추가하세요.실행하려는 특정 명령을 추가합니다. NOPASSWD사용하려는 태그를 추가합니다.. 명령별 NOPASSWD규칙은 일반 규칙 뒤에 와야 합니다.

saeid ALL = (ALL:ALL) ALL
saeid ALL = (root) NOPASSWD: service lightdm start

하지만 어쨌든 그것은 유용하지 않을 수도 있습니다. lightdm start로그인 프롬프트를 시작하지만 다른 사용자가 그래픽으로 로그인하도록 하려는 경우에만 필요합니다. 단지 GUI 세션을 시작하려는 경우에는 필요하지 않습니다. 대신에 전화하세요.startx텍스트 모드 세션에서 GUI 세션을 시작합니다. 여기에는 추가 권한이 필요하지 않습니다.

startxlightdm에서 사용하는 것과 동일한 기본 세션 유형이 선택되지 않을 수 있으므로 창 관리자 또는 데스크탑 환경을 명시적으로 지정해야 할 수도 있습니다 .

startx -- gnome-session

답변2

몇 가지 옵션이 있으며 그 중 하나는 visudoNOPASSWD 플래그를 사용하여 특정 명령을 추가하는 것입니다.

%wheel ALL=(ALL) NOPASSWD: /path/to/myscript

cat /path/to/myscript
#!/bin/bash
service lightdm start

답변3

편집하다
댓글에서 Unity를 언급하신 것을 보니 Ubuntu를 실행 중인 것 같습니다. 내 원래 대답은 다음과 같습니다.시스템 초기화시스템이지만 다음과 같은 명령은telinit호환성을 위해 여전히 존재하며 배포판에 사용될 예정입니다.체계또는갑자기 나타나다.

시스템 V 모드

    telinit 5

최신 Systemd 시스템에서는telinit로 리디렉션되다systemctl.

시스템 접근 방식

    systemctl isolate runlevel5.target

또는

    systemctl isolate graphical.target

원래 답변:
이전의 비시스템 배포판(예: RHEL/CentOS 6 이하)에서 콘솔 모드에서 GUI로 전환하는 가장 쉬운 방법은 다음을 사용하는 것입니다.telinit주문하다. 예를 들어 RHEL/Centos 배포판에서 다중 사용자 텍스트 기반 모드는 실행 수준 3이고 다중 사용자 GUI 모드는 실행 수준 5입니다. 콘솔에서 GUI 모드로 전환하는 방법은 다음과 같습니다. 기본적으로 telinit루트 권한이 필요합니다. 비밀번호 없이 일반 사용자로 실행하려면 sudoers항목을 입력하거나 telinit 실행 파일에 setuid 플래그를 설정해야 합니다. 이 sudo방법은 귀하의 계정으로 제한될 수 있으므로 선호됩니다.

답변4

을 구체적으로 언급하고 있으므로 sudo다음 사항을 준수하세요.자일스의 대답. 그러나 귀하의 질문 제목은 단지 프로그램의 비밀번호를 얻는 것에 관한 것이므로 stdin최근에 비슷한 상황이 발생했습니다.

echo $(read -sp "Password: " password; echo $password) | yourcommand

이것에 대해 약간의 비판을 받을 수도 있지만 효과가 있습니다.

말하자면 bash, 당신은 또한 사용할 수 있습니다

yourcommand <$(read -sp "Password: " password; echo $password)

관련 정보