AIX 7.2에서 ksh 스크립트를 실행하고 있습니다.
디버그 모드에서 스크립트가 수행하는 모든 작업을 brkpt 파일로 리디렉션하고 싶습니다.
스크립트는 다른 애플리케이션에도 로그인하므로 비밀번호(예: "pw123_")를 사용합니다.
exec > $brkpt_file 2>&1
set -xv
dsmadmc -id=admin -pa=pw123_ q pr
리디렉션은 잘 작동하지만 brkpt 파일에 표시되지 않도록 비밀번호 문자열을 "***"로 바꾸고 싶습니다.
이것은 명령줄에서 잘 작동합니다.
echo "dsmadmc -id=admin -pa=pw123_ q pr" | sed "s/-pa=[[:graph:]]* /-pa=*** /g"
result
dsmadmc -id=admin -pa=*** q pr
하지만 이 "sed"를 "exec"와 결합하자마자:
a) 출력이 더 이상 파일로 리디렉션되지 않고 화면으로 리디렉션됩니다.
b) 비밀번호 문자열이 대체되지 않습니다.
exec | sed 's/-pa.*=[[:graph:]]* /pa=*** /g' > $brkpt_file 2>&1
set-xv
dsmadmc -id=admin -pa=pw123_ q pr
result
+ dsmadmc -id=admin -pa=pw123_ q pr
+ ... other stuff of script
brkpt에서 모든 스크립트 내용을 가져오고 비밀번호를 숨기는 방법은 무엇입니까?
답변1
exec
출력을 다른 프로그램으로 직접 파이프하는 데 사용할 수 없으며 출력을 파일로 리디렉션하는 데만 사용할 수 있습니다.
다행히 UNIX에서는 모든 것이 파일처럼 보입니다.
ksh(및 POSIX 호환성)의 경우 명명된 fifo를 생성하고 스크립트 출력을 해당 파일로 리디렉션해야 합니다.
#!/bin/ksh
fifo=./exec.fifo
log=./exec.ksh.log
# delete the fifo if it already exists
[ -e "$fifo" ] && rm -f "$fifo"
mkfifo "$fifo"
# now run the sed script in the background. Its purpose is to modify
# the input coming from the fifo before saving it to the log file
( sed -e 's/-pa=[^ ]* /-pa=*** /g' < "$fifo" > "$log" ) &
# set up a function and trap to delete the fifo on exit.
cleanup () { rm -f "$fifo" ;}
trap cleanup EXIT
# now do the exec
exec > "$fifo"
# and finally do something that produces some output.
echo "dsmadmc -id=admin -pa=pw123_ q pr"
스크립트를 실행하면 출력이 sed와 fifo를 통해 필터링된 후 로그 파일로 리디렉션됩니다.
$ ./exec.ksh
$ cat exec.ksh.log
dsmadmc -id=admin -pa=*** q pr
하지만 를 사용하면 bash
더 쉽습니다 . 당신은 그것을 사용할 수 있습니다프로세스 교체fifo 대신 출력을 리디렉션할 "파일"을 제공합니다(이식 가능한 쉘 스크립트 작성을 선호하는 경우 fifo 접근 방식이 계속 작동합니다).
예를 들어:
#!/bin/bash
exec 1> >(sed 's/-pa=[^ ]* /-pa=*** /g' > ./exec.bash.log)
echo "dsmadmc -id=admin -pa=pw123_ q pr"
마찬가지로 출력은 로그 파일에 저장되기 전에 sed에 의해 수정됩니다.
$ ./exec.bash
$ cat exec.bash.log
dsmadmc -id=admin -pa=*** q pr