bash - 隐藏或禁止传递给 shell 脚本的参数值
问题描述
从本地机器上,我在远程服务器上运行 shell 脚本并将一些参数传递给脚本。像 test.sh "name" "age" 这是我的脚本:
#!/bin/bash
echo $1
echo $2
在远程服务器上,脚本正在执行,如果我运行,ps aux | grep .sh
我可以看到这两个参数的值。像 bash -s name 年龄
有没有办法抑制或隐藏正在运行的 shell 进程中的值,以便可以看到参数?
解决方案
我有个主意。您可以创建一个具有唯一名称的全局环境变量并将位置参数保存在那里,然后重新执行您的流程并获取参数:
#!/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
推荐阅读
- asp.net - IIS 表单/cookies FormsAuthentication.SetAuthCookie(username, true);
- python - 如何根据层次结构对数据进行排序
- vue.js - 如何在其他组件中访问子组件的方法?
- javascript - 使用 Selenium 在 Python 中执行 JavaScript
- linux - 如果在 bash 中运行特定命令,如何获得通知
- ios - iOS - stringByRemovingPercentEncoding 为单/双引号返回 nil
- ios - 为什么我看不到navigationitem 的标题?
- ruby-on-rails - 如何解决日志问题以使用 heroku 回形针/s3 获取管理仪表板?
- .net - 在 ASP .NET 中重定向到错误页面而不是登录页面以获得错误的 AuthorizationManager 响应
- r - 无法在 macOS 上使用 devtools 在 R 中安装 lightgbm