#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