简体   繁体   中英

Hide or suppress arguments value passed to a shell script

From a local machine I am running a shell script on a remote server and passing some arguments to the scripts. Like test.sh "name" "age" This is my script:

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

On the remote server while the script is executing and if I run ps aux | grep.sh ps aux | grep.sh i could see the value of the two parameters. Like bash -s name age

Is there a way to suppress or hide the values in the running shell process so that one can see the parameters?

I have an idea. You could create a global environment variable with unique name and save there the positional arguments, then re-exec your process and get the arguments:

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

It will hide it from 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

The environment variable could be still extracted from /proc:

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

Another way might be writing the positional arguments as a string on stdin and pass it to outselves with original input:

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

Here's a way to take the cmd line args and read args from stdin:

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

Do you can do:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM