【问题标题】:Hide or suppress arguments value passed to a shell script隐藏或禁止传递给 shell 脚本的参数值
【发布时间】:2021-03-27 07:19:28
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我不这么认为。如果它应该是私有的,请不要将其放入参数中,而是使用标准输入。
  • 是的,我正在将一些私有参数从本地机器传递到远程服务器。喜欢ssh -i mykey user@$remoteIP-o StrictHostKeyChecking=no 'bash -s' < $test.sh "name" "password"。现在 test.sh 脚本在本地机器上,remoteIP 是远程服务器。你能举个例子说明如何使用标准输入将这两个参数传递给远程吗?
  • 我根本不会这样传递密码。将凭据放在远程计算机上,或执行类似配置 sudo 的操作以在不进行身份验证的情况下运行命令。
  • 我通常会看到文件。将密码放入文件中。 scp 文件。从需要密码的工具读取远程文件中的密码。

标签: bash process arguments


【解决方案1】:

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

#!/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

【讨论】:

  • 请注意,bash 实现了此处的字符串和带有临时文件的此处文档;我不记得使用的权限是否会阻止某人看到它们。
  • 环境变量在ps中也可见。
【解决方案2】:

这是一种获取 cmd 行 args 从 stdin 读取 args 的方法:

#!/usr/bin/env bash
args=()
for arg; do
    printf "%d\t%s\n" $((++c)) "$arg"
    args+=("$arg")
done
if ! [[ -t 0 ]]; then
    while IFS= read -r arg; do
        args+=("$arg")
    done
fi

declare -p args

你能做到吗:

script.sh hello world
printf "%s\n" hello world | script.sh
echo world | script.sh hello

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 2012-12-08
    相关资源
    最近更新 更多