실수로 파이프 대신 출력 리디렉션을 사용함 |

실수로 파이프 대신 출력 리디렉션을 사용함 |

한 달 전에 저는 stdin에서 MAC 및 IP 주소를 매핑하는 Python 스크립트를 작성했습니다. 이틀전에 기억나서 출력 필터링에 사용했는데 tcpdump오타로 인해 오류가 나더군요. 나는 들어갔다

tcpdump -ne > ./mac_ip.py

출력은 아무것도 아닙니다. 하지만 입력을 구문 분석할 수 없으면 출력이 "알 수 없음"이어야 하므로 그렇게 하고 프로그램 대신 cat ./mac_ip.py모든 데이터를 찾았습니다 . tcpdump그런 다음 사용해야한다는 것을 깨달았습니다.

tcpdump -ne | ./mac_ip.py

프로그램을 복원할 수 있는 방법이 있나요? 어쨌든 프로그램을 다시 작성할 수 있지만 더 중요한 프로그램에서 이런 일이 다시 발생하면 뭔가를 할 수 있어야 합니다. 아니면 파일을 확인하고 실행 가능한지 경고하도록 출력 리디렉션을 지시하는 방법이 있습니까?

답변1

리디렉션으로 인해 기존 파일을 덮어쓰는 것을 방지하려면 POSIX와 유사한 셸 의 옵션을 >사용하세요 (여기에는 / 대신 있지만 함수가 실제로 발생하는 곳 이기도 함 ). 그런 다음 파일을 강제로 교체해야 하는 경우 리디렉션 연산자( in )를 사용하세요.noclobberbash(t)cshset noclobberset -o noclobberset -C>|>!(t)csh

예:

$ echo abc > file
$ set -o noclobber
$ echo xyz > file
bash: file: cannot overwrite existing file
$ echo xyz >| file
$ cat file
xyz

그런데 다음을 사용하여 현재 설정을 확인할 수 있습니다 set -o.

$ set -o
...
monitor         on
noclobber       on
noexec          off
...

답변2

안타깝게도 다시 작성해야 할 것 같습니다. (백업이 있다면 지금이 삭제해야 할 때입니다. 그렇지 않다면 향후를 위한 백업 메커니즘을 설정하는 것이 좋습니다. 사용 가능한 옵션이 많이 있지만 이 답변의 주제는 아닙니다.)

실행 파일을 별도의 디렉터리에 넣고 해당 디렉터리를 PATH. 이렇게 하면 명시적인 경로를 통해 실행 파일을 참조할 필요가 없습니다. 개인(개인) 스크립트에 대해 내가 선호하는 프로그램 디렉토리는 "$HOME"/bin프로그램 검색 경로에 추가할 수 있는 입니다 PATH="$HOME/bin:$PATH". 일반적으로 이는 쉘 시작 스크립트 .bash_profile및/또는 .bashrc.

마지막으로 모든 실행 프로그램에 대한 쓰기 권한을 제거하는 것을 막을 수 있는 방법은 없습니다.

touch some_executable.py
chmod a+x,a-w some_executable.py    # chmod 555, if you prefer

ls -l some_executable.py
-r-xr-xr-x+ 1 roaima roaima 0 Jun 25 18:33 some_executable.py

echo "The hunting of the Snark" > ./some_executable.py
-bash: ./some_executable.py: Permission denied

답변3

나는 강력히 추천한다중요한 스크립트안에Git 저장소, 원격 동기화(아름다운 자체 호스팅 플랫폼@casey의 의견에서 알 수 있듯이).

이렇게 하면 파일을 이전 작업 상태로 복원하고 다시 실행하는 것과 같은 심각한 인적 오류를 방지할 수 있습니다.

답변4

최근에 스크립트를 보거나 편집했는데 해당 스크립트가 여전히 메모리 버퍼에 있는 경우 처음 발생한 이후에 데이터를 복구할 수 있습니다. 그렇지 않으면 운이 좋지 않습니다.

(또는 대신 ) 대신에 tee파일 (및 )에 쓰기 위해 파이프를 사용하면 쓸 파일이 다음과 같이 실행 가능한지 사용자에게 경고하는 스크립트에 대한 별칭, 함수 또는 심볼릭 링크로 쉽게 바꿀 수 있습니다. .STDOUT>tee -a>>tee

다음은 결코 이상적이지 않으며 개선될 수 있습니다.많은, 그러나 이는 시작점일 뿐이며 이를 달성할 수 있는 방법의 예일 뿐입니다.

wee.sh:

#!/bin/bash

if [ -n "${2}" ]; then
  if [ "$(ls -l "${2}" | awk '{print $1}' | grep x)" ]; then
    echo executable
  else
    tee -a "${2}"
  fi
elif [ "$(ls -l "${1}" | awk '{print $1}' | grep x)" ]; then
  echo executable
else
  tee "${1}"
fi

...그리고 echo 'alias tee="/path/to/wee.sh"' >> ~/.bashrc그런 것들도요.

장점으로는 적어도 더 많은 연습을 하게 될 것이며 Python 스크립트의 두 번째 버전이 아마도 첫 번째 버전보다 훨씬 나을 것입니다!

관련 정보