실행 전에 터미널 입력을 조작하는 방법이 있습니까? 예:
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 변수를 수정해야 합니다.
예를 들어:
래퍼의 경로를 만듭니다.
mkdir $HOME/wrapper
접두사PATH 패키지 경로(예: inside
$HOME/.bashrc
):export PATH="/home/myuser/wrapper:$PATH`
예제 스크립트
$HOME/wrapper/ls
:#!/bin/bash echo "sudo ls $*"
이제 실행은 다음과 같습니다.
stackoverflow: ls /home
sudo ls /home
보안상의 이유로 다른 사람이 래퍼 스크립트를 수정할 수 없으므로 sudo
해커 스크립트를 권한으로 실행하지 마십시오. 이런 방식으로 PATH 변수를 수정하지 않는 데에는 몇 가지 이유가 있습니다.
시스템 전체에서 이 작업을 수행하면( /etc/profile
PATH를 수정하고 래퍼를 내부에 배치 /usr/wrapper
) 다음과 같습니다.매우누구도 거기에 자신의 파일을 넣을 수 없다는 점을 기억하는 것이 중요합니다!