我正在 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(如果您更喜欢编写可移植的 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