Sed

如何將腳本的所有輸出重定向到文件並替換密碼?

  • April 15, 2021

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

引用自:https://unix.stackexchange.com/questions/644826