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

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

나는 항상 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를 실행 중인 것으로 보입니다. 내 원래 대답은 다음과 같습니다.SysVinit시스템이지만 다음과 같은 명령은telinit호환성을 위해 여전히 존재하며 다음을 사용하여 배포판에서 작동합니다.시스템화됨또는갑자기 나타나다.

SysV 방식

    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)

관련 정보