Скрыть или подавить значение аргументов, переданное сценарию оболочки

#bash #process #arguments

#bash #процесс #аргументы

Вопрос:

С локального компьютера я запускаю сценарий оболочки на удаленном сервере и передаю некоторые аргументы сценариям. Например test.sh «имя» «возраст» Это мой сценарий:

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

На удаленном сервере во время выполнения скрипта и при запуске ps aux | grep .sh я мог видеть значение двух параметров. Например, возраст имени bash

Есть ли способ подавить или скрыть значения в запущенном процессе оболочки, чтобы можно было видеть параметры?

Комментарии:

1. Я так не думаю. Не помещайте что-либо в аргументы, если оно должно быть закрытым, вместо этого используйте стандартный ввод.

2. Да, я передаю некоторые частные параметры с локального компьютера на удаленный сервер. Нравится ssh -i mykey user@$remoteIP-o StrictHostKeyChecking=no 'bash -s' < $test.sh "name" "password" . Теперь test.sh скрипт находится на локальном компьютере, а remoteIP — это удаленный сервер. Можете ли вы привести мне пример того, как я могу передать эти два аргумента удаленному устройству с помощью stdin?

3. Я бы вообще не передавал пароль таким образом. Поместите учетные данные на удаленную машину или выполните что-то вроде configure sudo для запуска команды без аутентификации.

4. Обычно я вижу файлы. Поместите пароль в файл. scp файл. Считайте пароль из файла на удаленной стороне с помощью инструмента, которому требуется пароль.

Ответ №1:

У меня есть идея. Вы можете создать глобальную переменную среды с уникальным именем и сохранить там позиционные аргументы, затем повторно выполнить свой процесс и получить аргументы:

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

printf -- "My arguments:n"
printf -- "-- %sn" "$@"
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 -- "-- %sn" "$@"
sleep infinity
 

Комментарии:

1. Просто чтобы отметить, bash реализует here strings и here documents с временными файлами; Я не помню, чтобы используемые разрешения не позволяли кому-либо их видеть.

2. Переменные среды также видны в ps .

Ответ №2:

Вот способ взять аргументы строки cmd и прочитать аргументы из стандартного интерфейса:

 #!/usr/bin/env bash
args=()
for arg; do
    printf "%dt%sn" $((  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 "%sn" hello world | script.sh
echo world | script.sh hello