Sed
如何將腳本的所有輸出重定向到文件並替換密碼?
我在 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 中的所有腳本內容並隱藏密碼?
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
的是 ,它會更容易一些。您可以使用Process Substitution提供“文件”來將輸出重定向到而不是 fifo(如果您更喜歡編寫可移植的 shell 腳本,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