如何将脚本的所有输出重定向到文件并替换密码?

如何将脚本的所有输出重定向到文件并替换密码?

我正在 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

相关内容