首页 > 解决方案 > 隐藏或禁止传递给 shell 脚本的参数值

问题描述

从本地机器上,我在远程服务器上运行 shell 脚本并将一些参数传递给脚本。像 test.sh "name" "age" 这是我的脚本:

#!/bin/bash
echo $1
echo $2

在远程服务器上,脚本正在执行,如果我运行,ps aux | grep .sh我可以看到这两个参数的值。像 bash -s name 年龄

有没有办法抑制或隐藏正在运行的 shell 进程中的值,以便可以看到参数?

标签: bashprocessarguments

解决方案


我有个主意。您可以创建一个具有唯一名称的全局环境变量并将位置参数保存在那里,然后重新执行您的流程并获取参数:

#!/bin/bash
if [[ -z "$MYARGS" ]]; then
    export MYARGS="$(printf "%q " "$@")"
    exec "$0"
fi
eval set -- "$MYARGS"

printf -- "My arguments:\n"
printf -- "-- %s\n" "$@"
sleep infinity

它将隐藏它ps aux

$ ps aux | grep 1.sh
kamil     196704  0.4  0.0   9768  2084 pts/1    S+   16:49   0:00 /bin/bash /tmp/1.sh
kamil     196777  0.0  0.0   8924  1640 pts/2    S+   16:49   0:00 grep 1.sh

仍然可以从 /proc 中提取环境变量:

$ cat /proc/196704/environ | sed -z '/MYARGS/!d'; echo
MYARGS=1 2 3 54 5 

另一种方法可能是将位置参数作为字符串写入标准输入,并使用原始输入将其传递给外部:

#!/bin/bash
if [[ -z "$MYARGS" ]]; then
    export MYARGS=1 # just so it's set
    # restart outselves with no arguments
    exec "$0" < <(
        # Stream arguments on stdin on one line
        printf "%q " "$@" | xxd -p | tr -d '\n'
        echo
        exec cat
    )
fi
IFS= read -r args # read _one line_ of input - it's our arguments
args=$(xxd -r -p <<<"$args") # encoded with xxd
eval set -- "$args"

printf -- "My arguments:\n"
printf -- "-- %s\n" "$@"
sleep infinity

推荐阅读