emacs - 리눅스 - sudo 특정 명령어



어떻게 Emacs에서 sudo 명령을 실행합니까? (5)

일부 자주 사용되는 sudo 셸 명령 (예 : Cc s 실행 (shell-command "sudo /etc/init.d/apache2 restart") )에 대한 바로 가기 키를 만들려고합니다.

위와 같이 똑바로 셸 명령 호출을 사용하여 시도했지만 그냥 *Shell Command Output* 버퍼에 다음 *Shell Command Output* :

[sudo] password for Inaimathi:
Sorry, try again.
[sudo] password for Inaimathi:
Sorry, try again.
[sudo] password for Inaimathi:
Sorry, try again.
sudo: 3 incorrect password attempts

실제로 암호를 요구하지는 않습니다. sudo emacs 이맥스를 사용하여 이맥스를 시작하고 싶지는 않지만 그 밖의 방법이 없다면이 옵션을 사용할 수 있습니다.

이상적인 해결책은 Emacs (쉘 또는 sudo 명령의 동작을 변경하는 OS jiggery-pokery와는 반대)에서 오는 기능입니다. (sudo-shell-command "dostuff") 또는 (with-password-prompt (shell-command "sudo dostuff")) 입니다.

https://ffff65535.com


emacs22 이상을 실행하고 있다면, emacs에서 쉘을 시작하고 sudo 명령을 실행할 수 있습니다. 그러면 자동으로 암호에 대한 미니 버퍼 창으로 이동합니다.

M-x shell
sudo whoami

이렇게하면 화면 하단에 비밀번호 표시하라는 메시지가 표시됩니다.


나는 Emacs로부터 aptitude update 와 같은 명령을 자주 호출한다. 의 솔루션이 유용하지 않을 수도 있습니다. 동기 명령을 사용하면 오랜 시간 동안 기다릴 수 있습니다. 지원되지 않는 프로그램 (예 : ncurses 를 사용하는 aptitude )을 실행하면 Emacs를 끊고 ( Cg 가 도움이되지 않습니다) CPU로드가 100 %가됩니다. async-shell-command 변경하면이 문제가 해결됩니다.

그러나 그것은 또한 새로운 문제를 야기합니다. 명령이 실패하면 암호는 *Messages* buffer에 저장됩니다.

echo PASSWORD | sudo -S aptitude: exited abnormally with code 1.

그래서 다음과 같은 솔루션을 제안합니다.

(defun sudo-shell-command (command)
  (interactive "MShell command (root): ")
  (with-temp-buffer
    (cd "/sudo::/")
    (async-shell-command command)))

여기서 "M"은 미니 with-temp-buffer 프로그램 이름에 대한 interactive 프롬프트에서, with-temp-buffer 는 가짜 버퍼를 생성합니다.이 버퍼에는 sudo 프롬프트에 TRAMP를 사용하기 위해 /sudo::/ 디렉토리를 변경합니다.

이것은 minibuffer 암호 프롬프트 @ gnu.emacs.help가있는 sudo 명령의 David Kastrup이 작성한 해결책 입니다.

sudo pkill aptitude 를 보낼 때까지는 aptitude 직접 호출하면 안됩니다. 그렇지 않으면 서브 프로세스가 영원히 존재하게됩니다.

매뉴얼의 shellsprocesses 를 읽으십시오.


어때?

(shell-command (concat "echo " (shell-quote-argument (read-passwd "Password? "))
                       " | sudo -S your_command_here"))

편집 : 위의 스콧의 대답은이 해킹보다 훨씬 낫다. 그것을 사용하십시오.

가능한 해결책 :

기본 암호 찾기 유틸리티를 설정하면이 문제가 해결된다는 것을 알게되었습니다.

내가해야 할 일은 Defaults:ALL askpass=/usr/lib/openssh/gnome-ssh-askpass/etc/sudoers 파일 ( sudo visudo 사용하여)에 추가하는 것입니다.

Eval-ing (shell-command "sudo /etc/init.d/apache2 restart") 이제 실패한 암호를 추측하는 대신 암호를 묻습니다.

더 나은 해결책이 없다는 것이 분명 해지면이 대답을 받아들이지 않을 것입니다. 이상적으로는 /etc 디렉토리 주위를 찌를 필요없이 내부적으로 Emacs의 문제를 해결하는 것이 좋을 것입니다.


해결 방법 (이맥스 솔루션이 아닌) :

암호가 필요하지 않도록 ssh 키 쌍을 설정하십시오.

순서:

  1. ssh-keygen 을 실행하여 키 쌍을 생성하십시오. 그 (것)들에 익숙해지면 그 (것)들을 당신이 할 다른 사람들 전부에서 분류하는 유지하는 유용한 이름을주십시오
  2. 받는 계정에 대해 공용 계정을 $HOME/.ssh 로 복사하십시오.
  3. 개인 계정을 보내는 계정의 $HOME/.ssh 에 보관하십시오 (여러 개의 보내는 계정에 복사 할 수 있지만 들어오는 모든 컴퓨터에 대해 별도의 키 쌍을 만드는 것이 좋습니다)
  4. 보내는 컴퓨터에서 $HOME/.ssh/config 를 편집하여 ssh에게 사용할 키를 알려줍니다.
  5. 이익




shell