2010-08-18 5 views
0

때로는 잘못된 조작을 방지하기 위해 일부 명령이 실행되지 않도록 방지하는 방법이 있는지 궁금합니다. (예 : "rm *. py" "rm *. pyc"또는 그와 비슷한 것을 실행하고 싶었습니다.Bash - 숨기기 명령 (잘못된 조작 방지)

사람들은 입력 내용을 확인하는 것이 사용자의 책임임을 말하지만 그것이 맞다면 어쨌든 알고 싶습니다. ,

alias apt-get="echo 'We use aptitude here !'" 
alias sl="echo 'Did you mean ls ?'" 

그러나 "RM -f * 평"(또는 "RF RM은 /")와 같은 인수 뭔가 :

는 "기본"일을 위해, 우리는 같은 우리 bashrc에에 별칭을 사용할 수 있습니다 이 간단한 트릭은 작동하지 않습니다. 물론, 정확한 명령을 실행하지 못하도록하는 기본 방법을 원합니다 (같은 공백과 같은 인수를 사용하는 것이 좋습니다).

답장을 보내 주셔서 감사합니다.

PATH=~/safebin:$PATH 

하고, ~/safebin, 당신은 "안전"입니다 스크립트를 넣어 :

+0

하는 것으로. 그것이 볼 수있는 것은'* .py ', 즉 해당 패턴과 일치하는 파일의 목록을 globbing 한 결과입니다. (또는 문자가 없으면'* .py' 문자가 사용되고,'shopt -s nullglob'의 경우 빈 문자열이됩니다.) – janmoesen

+0

'rm'과 같은 이름의 대체품에 의존하는 것은 좋지 않습니다. 필요한 모든 작업은 단 한 번만 사용할 수 없으며 Bam! 안전망이 없기 때문에 파일이 사라졌습니다. 인터넷에서 작업하려면 다른 이름 (예 : "saferm")을 사용해야합니다. –

+0

@Dennis Williamson : 예, 맞습니다. 다른 이름을 사용하는 것이 더 좋을 수도 있지만 실제로는 (실제로 "rm *"과 같은 것을 직접 사용하지 않고 원래 "rm"명령을 사용하는 경우에는 내 소스 코드를 삭제하지 않기 때문에 항상 사용할 수 있습니다. ")). 하지만 문제는 아마도 Makefiles 또는 "rm"이 표준이 아니며 거대한 부작용을 만들 수 있다는 것을 모르는 스크립트를 설치하는 것일 것입니다 ... – ThR37

답변

3

글쎄, 당신은 모든 다른 사람 앞에서 자신의 경로 구성 요소 중 하나를 넣는 시간 영광 방법을 사용할 수 있습니다 rm 같은 rm *위한

#!/bin/bash 

for fspec in "[email protected]" ; do 
    if [[ "${fspec: -3}" = ".py" ]] ; then 
     echo Not removing ${fspec}, use /bin/rm if you really want to. 
    else 
     echo Would /bin/rm "${fspec}" but for paranoia. 
    fi 
done 

해당 스크립트 출력 :

Would /bin/rm chk.sh but for paranoia. 
Would /bin/rm go but for paranoia. 
Would /bin/rm go.sh but for paranoia. 
Would /bin/rm images but for paranoia. 
Would /bin/rm images_renamed but for paranoia. 
Would /bin/rm infile.txt but for paranoia. 
Would /bin/rm jonesforth.S but for paranoia. 
Would /bin/rm jonesforth.f but for paranoia. 
Would /bin/rm mycode.f but for paranoia. 
Would /bin/rm num1.txt but for paranoia. 
Would /bin/rm num2 but for paranoia. 
Would /bin/rm num2.txt but for paranoia. 
Would /bin/rm proc.pl but for paranoia. 
Would /bin/rm qq but for paranoia. 
Would /bin/rm qq.c but for paranoia. 
Would /bin/rm qq.cpp but for paranoia. 
Would /bin/rm qq.in but for paranoia. 
Not removing qq.py, use /bin/rm if you really want to. 
Would /bin/rm qq.rb but for paranoia. 
Would /bin/rm qq.s but for paranoia. 
Would /bin/rm qq1 but for paranoia. 
Would /bin/rm qq2 but for paranoia. 
Would /bin/rm qqq but for paranoia. 
Would /bin/rm rm but for paranoia. 
Would /bin/rm source.f90 but for paranoia. 
Would /bin/rm test.txt but for paranoia. 
Would /bin/rm xx but for paranoia. 
Not removing xx.py, use /bin/rm if you really want to. 

이제 분명히 "${fspec: -3}" = ".py"은 단순한 목록과 검은 색 목록입니다. 아마 내가 삭제하고 다른 모든 것을 거부하도록 허락 된 것들에 대한 화이트리스트를 갖는 것을 선호 할 것입니다.

#!/bin/bash 

for fspec in "[email protected]" ; do 
    del=0 
    if [[ ! -z "$(echo "${fspec}" | grep 'a.e')" ]] ; then 
     del=1 
    fi 
    if [[ ! -z "$(echo "${fspec}" | grep '\.[Ss]$')" ]] ; then 
     del=1 
    fi 

    if [[ ${del} -ne 1 ]] ; then 
     echo "Not removing ${fspec}, use /bin/rm if you want." 
    else 
     echo " Removing ${fspec}" 
     #/bin/rm "${fspec} 
    fi 
done 

출력 :

Not removing chk.sh, use /bin/rm if you want. 
Not removing go, use /bin/rm if you want. 
Not removing go.sh, use /bin/rm if you want. 
    Removing images 
    Removing images_renamed 
Not removing infile.txt, use /bin/rm if you want. 
    Removing jonesforth.S 
Not removing jonesforth.f, use /bin/rm if you want. 
Not removing mycode.f, use /bin/rm if you want. 
Not removing num1.txt, use /bin/rm if you want. 
Not removing num2, use /bin/rm if you want. 
Not removing num2.txt, use /bin/rm if you want. 
Not removing proc.pl, use /bin/rm if you want. 
Not removing qq, use /bin/rm if you want. 
Not removing qq.c, use /bin/rm if you want. 
Not removing qq.cpp, use /bin/rm if you want. 
Not removing qq.in, use /bin/rm if you want. 
Not removing qq.py, use /bin/rm if you want. 
Not removing qq.rb, use /bin/rm if you want. 
    Removing qq.s 
Not removing qq1, use /bin/rm if you want. 
Not removing qq2, use /bin/rm if you want. 
Not removing qqq, use /bin/rm if you want. 
Not removing rm, use /bin/rm if you want. 
Not removing source.f90, use /bin/rm if you want. 
Not removing test.txt, use /bin/rm if you want. 
Not removing xx, use /bin/rm if you want. 
Not removing xx.py, use /bin/rm if you want. 
+0

답변 해 주셔서 감사합니다. 결국 어쩌면 최상의 솔루션일까요? 파이썬에서 좀 더 가독성을 높이기 위해 스크립팅을하는 것도 고려해 볼 수 있습니다 (파이썬이 느슨하면 직접/bin/rm을 사용하십시오).하지만 bash 스크립트는 잘 된 것 같습니다! – ThR37

1

당신을보고 싶을 수도


그리고 여기에 정규 표현식을 기반으로 화이트리스트 버전입니다 ("builtin"명령과 비슷한) 덜 알려진 명령 "command"를 사용하여 제한적인 RM 래퍼 : 내 LS에

help builtin command | less 

# test example using ls instead of rm 
function ls() { 
    for ((i=1; i<=$#; i++)); do 
     arg="${@:i:1}" 
     echo "arg ${i}: ${arg}" 
     [[ "${arg}" == \*.py ]] && { echo "Not allowed: ${arg}"; return 1; } 
    done 
    command ls "${@}" 
    return 0 
} 

ls -a 

ls -a *.py 
+0

명령어로 별명을 지정하거나 함수로 덮어 쓸 경우'builtin command ls "$ {@}"'를 쓸 수 있습니다 – lesmana

0

보정이 기능은 예 : 다음

[[ "${arg}" != \*.py ]] && [[ "${arg}" == *.py ]] && \ 
    { echo "Not allowed: ${arg}"; return 1; } 

:

ls -a *.py 

# ... and also play with modified shell wildcard expansion behaviour ... 
(shopt -s nullglob; ls -a *.py) 
0

ThR37는 말한다 : 여기

을 기반으로 짧은 파이썬 스크립트입니다 단순히 "rm"과 같은 명령을 감싸는 아이디어. 배쉬 래퍼 어쩌면 더 좋은 생각하지만 나는 :) 파이썬을 좋아한다 : 그것은 그 와일드 카드를 확장 쉘, 그래서 프로그램이나 기능이 실제로 * * '* .py`을 볼 수 없을 것

#!/usr/bin/python 
# coding=UTF-8 

import getopt, sys 
import subprocess 
import re 

exprs=[] 
exprs.append(re.compile(".*\.py$")); 
exprs.append(re.compile(".*\.cpp$")); 
exprs.append(re.compile(".*\.hpp$")); 
exprs.append(re.compile("\*$")); 


def main(): 
     try: 
      opts, args = getopt.getopt(sys.argv[1:], "Rrfiv", ["interactive","no-preserve-root","preserve-root","recursive","verbose","help","version"]) 
     except getopt.GetoptError, err: 
      # print help information and exit: 
      print str(err) 
      usage() 
     optsString = "".join([opt[0]+opt[1]+" " for opt in opts]); 
     for arg in args: 
      tab = [expr.match(arg) for expr in exprs]; 
      if tab.count(None)!=len(tab): 
       print "Not removing "+str(arg); 
      else 
       cmd = ["/bin/rm"]+[opt[i] for opt in opts for i in range(2) if not opt[i]=='']+[str(arg)]; 
       rmfile = subprocess.Popen(cmd) 

if __name__=="__main__": 
    main(); 
관련 문제