터미널 입력 조작

터미널 입력 조작

실행 전에 터미널 입력을 조작하는 방법이 있습니까? 예:

apt-get update터미널에 입력하세요. 이제 sudo apt-get update실행 전 으로 변경하고 싶습니다 .

내가 시도한 것:

조작된 입력을 사용하여 입력된 명령을 실행하는 스크립트를 실행할 가능성을 고려했지만 다른 프로그램이 실행되는 동안 스크립트를 실행할 수 있는 방법을 찾지 못했습니다.

모든 답변에 감사드립니다. 저는 리눅스 민트 세레나를 사용하고 있습니다.

밝히다:

명령이 호출될 때마다 백그라운드에서 실행되고 패턴과 일치하는지 확인하는 스크립트 등이 있어야 합니다. 그렇지 않은 경우 입력을 실행하고, 그렇다면 명령을 조작하고 실행합니다. -> 이것이 바로 내 예제에서 to apt-get update를 사용하는 이유입니다 sudo apt-get update. 내가 알아낼 수 있는 유일한 것은 스크립트가 실행되기 전에 명령을 얻는 방법입니다.

가능한 목적:

  • 특정 파일/디렉토리에 액세스하려고 할 때 비밀번호 프롬프트를 입력하십시오

  • 바로가기 만들기( cd _1로 변경 cd ~/Desktop)

답변1

에서는 zsh일부 검사자를 추가하여 다음을 수행할 수 있습니다.

validate_apt-get_update() {
  local match MATCH MBEGIN MEND mbegin mend
  if [[ $BUFFER =~ '^(\s*)(apt-get\s+update.*)' ]]; then
    LBUFFER="$match[1]sudo " RBUFFER=$match[2]
    zle -M 'WARNING: sudo has been added before apt-get update'
    return 1
  fi
}

accept-line() {
  validate_apt-get_update && zle .accept-line
}

zle -N accept-line

을 삽입하고 sudo그 뒤에 커서를 놓고 경고 메시지를 표시하며 apt-get입력한 처음 두 단어가 이고 업데이트된 경우 줄을 수락하지 않아 실제로 원하는 것인지 확인할 수 있는 기회를 제공합니다.

여기서는 쉘 명령줄에 대한 간단한 구문 분석을 수행하고 있습니다. 다음을 입력하면 작동하지 않습니다.

'apt-get' update
"$(echo apt-get)" update
something else; apt-get update...

다음을 수행할 수 있으므로 좋을 수도 있습니다.

\apt-get update

별칭을 우회하려는 것처럼 해당 검사를 우회하려는 경우.

귀하 cd _1의 경우 cd ~/Desktop다음을 수행할 수 있습니다.

set -o cdable_vars
_1=~/Desktop

개인적으로, 나는 쉘이 내 등 뒤에서 이런 일을 한다는 생각을 별로 좋아하지 않습니다(특히 다른 사람들이 적어도 기대하지 않을 일).

답변2

음, 완전히 새로운 것입니다. PS4를 사용하여 답변을 읽어보세요.모든 명령을 가로채는 방법

방금 테스트한 경우:

bash: PS4='$(echo $(date) $(history 1) >> /tmp/trace.txt) TRACE: '
bash: set -x
bash: date
 TRACE: date
Fr 28. Jul 14:13:24 CEST 2017

위의 답변에서 언급했듯이 PS4...실행되는 모든 명령에 대해 평가됩니다.... 따라서 래퍼를 통해 명령을 전달하고 실행을 확인하기 위해 이를 대체하면 가로챌 수 있습니다.어느당신의 명령.

답변3

쉘에 따라 alias(위키피디아개념적 세부 사항이 있습니다).

Bash에서 영구 별칭을 만들려면 이를 별칭에 추가하고 .bashrc다음과 같이 편집할 수 있습니다.gedit ~/.bashrc

그런 다음 맨 아래에 다음과 같은 줄을 추가하면 됩니다.

alias apt-get-update='sudo apt-get update'

여러 단어로 별칭을 만드는 것은 대시나 밑줄로 연결하지 않으면 작동하지 않습니다.

답변4

로그인 전용인 경우 시스템 명령 이전에 실행되는 래퍼 스크립트를 작성할 수 있습니다. 시스템 명령 전에 래퍼가 실행되도록 하려면 PATH 변수를 수정해야 합니다.

예를 들어:

  1. 래퍼의 경로를 만듭니다.

    mkdir $HOME/wrapper
    
  2. 접두사PATH 패키지 경로(예: inside $HOME/.bashrc):

    export PATH="/home/myuser/wrapper:$PATH`
    
  3. 예제 스크립트 $HOME/wrapper/ls:

    #!/bin/bash
    echo "sudo ls $*"
    

이제 실행은 다음과 같습니다.

stackoverflow: ls /home
sudo ls /home

보안상의 이유로 다른 사람이 래퍼 스크립트를 수정할 수 없으므로 sudo해커 스크립트를 권한으로 실행하지 마십시오. 이런 방식으로 PATH 변수를 수정하지 않는 데에는 몇 가지 이유가 있습니다.

시스템 전체에서 이 작업을 수행하면( /etc/profilePATH를 수정하고 래퍼를 내부에 배치 /usr/wrapper) 다음과 같습니다.매우누구도 거기에 자신의 파일을 넣을 수 없다는 점을 기억하는 것이 중요합니다!

관련 정보