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