На U *nixssh-agent
в идеале должен запускаться очень рано при входе в сеанс. Обычно это делается при входе в систему с графическим интерфейсом (X11 и т. д. ). Помимо демонизации, эта команда удобно оставляет в качестве вывода команды оболочки , которые экспортируют переменные, необходимые для связи с недавно созданным демоном, готовым для оценки оболочки:
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-TO9z33k5zo6t/agent.25671; export SSH_AUTH_SOCK;
SSH_AGENT_PID=25673; export SSH_AGENT_PID;
echo Agent pid 25673;
запустить снова, как предполагалось, из оболочки posix sh:
$ eval $(ssh-agent)
Agent pid 25965
$ printenv SSH_AUTH_SOCK SSH_AGENT_PID
/tmp/ssh-XgTqsra2Pok2/agent.25964
25965
Если это запускается общим процессом-предком во время настройки входа в систему, все последующие процессы будут наследовать эти переменные, делая запущенный ssh-agent
доступным для использования в любом месте сеанса.
Также следует отметить, что (часть )этих переменных может быть унаследована через удаленное ssh
использование опции переадресации агента(-A
)без необходимости локального ssh-agent
.
Теперь, для случая, когда тот же пользователь хочет повторно использовать ssh-agent
, но из другого несвязанного доступа (другой терминал, сеанс, будь то удаленный или локальный и т. д. ), который не унаследовал два предыдущие экспортированные переменные, потому что нет никакого механизма. Этот пользователь может просто получить их значение из любого места, где это необходимо :другого терминала, работающего с оболочкой, в которой они уже экспортированы, какой-то файл в фиксированной позиции, созданный сценарием, предназначенным для сохранения этих переменных (или, лучше, командами выше перед оценкой )для этой конкретной цели и т. д.)и снова экспортировать их:
SSH_AUTH_SOCK=/tmp/ssh-XgTqsra2Pok2/agent.25964; export SSH_AUTH_SOCK;
SSH_AGENT_PID=25965; export SSH_AGENT_PID;
Итак, если на каком-то терминале запустить вместо eval $(ssh-agent)
что-то вроде этого:
$ mkdir -m 700 -p ~/.ssh-agent-info
$ ssh-agent > ~/.ssh-agent-info/variables
$. ~/.ssh-agent-info/variables
Agent pid 25965
затем начал добавлять некоторые ключи:
$ ssh-add /tmp/demokey
Enter passphrase for /tmp/demokey:
Identity added: /tmp/demokey
$ ssh-add -l
256 SHA256:Ayd3PCiSkVVV09IqwEXz2Fn3nuXF70FDPMlNtZiuTtY user@host (ED25519)
и этот пользователь на других терминалах в той же системе снова использовал те же самые переменные, должен получить ожидаемый результат:
$. ~/.ssh-agent-info/variables
Agent pid 25965
$ ssh-add -l
256 SHA256:Ayd3PCiSkVVV09IqwEXz2Fn3nuXF70FDPMlNtZiuTtY user@host (ED25519)
Это означает, что больше нет необходимости давать кодовую фразу, пока ssh-agent
не будет убит или не попросят забыть его ключи.
Это должно работать примерно одинаково на любой платформе с портом openssh и ssh-agent
, поэтому я считаю, что то же самое должно работать и на WSL.
В идеале вы должны поместить эти команды в сценарий запуска оболочки (, например .profile
), созданный таким образом, чтобы он сначала определял, (правильный)ssh-agent
уже запущен, прежде чем пытаться создать новый один, иначе у вас произойдет утечка процессов, и вам придется снова ввести парольную фразу.
Может быть, что-то вроде этого?
array1=(23 34 23 12 11 32 12 12 12 21)
array2=(12 13 14 43 42 23 32 11 10 22)
# Declare array3 as an array
array3=()
for i in $( seq 1 $((${#array1[@]}+1)) ); do
array3+=( $(( ${array1[i]} + ${array2[i]} )) );
printf 'Result %d : %s\n' "$i" "${array3[i]}";
done
Выход:
Result 1 : 47
Result 2 : 37
Result 3 : 55
Result 4 : 53
Result 5 : 55
Result 6 : 44
Result 7 : 23
Result 8 : 22
Result 9 : 43
array1=(23 34 23 12 11 32 12 12 12 21)
array2=(12 13 14 43 42 23 32 11 10 22)
set -- "${array1[@]}"
unset counter
for elem in "${array2[@]}"; do
set -- "$@" "$((++counter))" "$(( $1 + elem ))"
shift
done
printf 'Result %d: %d\n' "$@"
Это перебирает все элементы одного из массивов (, второго )и для каждого элемента $elem
добавляет счетчик и сумму к списку позиционных параметров.
Сумма вычисляется путем добавления $elem
к первому позиционному параметру, $1
(, который затем смещается из списка ). Позиционные параметры были инициализированы элементами первого списка, так что это эффективно связывает элементы.
После цикла позиционные параметры содержат значения счетчика в паре с суммами. Затем они печатаются с помощью printf
.
Вывод будет
Result 1: 35
Result 2: 47
Result 3: 37
Result 4: 55
Result 5: 53
Result 6: 55
Result 7: 44
Result 8: 23
Result 9: 22
Result 10: 43
Очевидно, что вы также можете распечатать результаты непосредственно в цикле:
array1=(23 34 23 12 11 32 12 12 12 21)
array2=(12 13 14 43 42 23 32 11 10 22)
set -- "${array1[@]}"
unset counter
for elem in "${array2[@]}"; do
printf 'Result %d: %d\n' "$((++counter))" "$(( $1 + elem ))"
shift
done
С петлей типа C -while
:
array1=(23 34 23 12 11 32 12 12 12 21)
array2=(12 13 14 43 42 23 32 11 10 22)
set -- "${array1[@]}"
unset counter
while [ "$#" -ne 0 ]; do
printf 'Result %d: %d\n' "$((++counter))" "$(( $1 + array2[counter-1] ))"
shift
done
Чистый sh
вариант:
set -- 23 34 23 12 11 32 12 12 12 21
unset counter
for elem in 12 13 14 43 42 23 32 11 10 22; do
printf 'Result %d: %d\n' "$((counter += 1))" "$(( $1 + elem ))"
shift
done
Использование bc
иpaste
:
array1=(23 34 23 12 11 32 12 12 12 21)
array2=(12 13 14 43 42 23 32 11 10 22)
paste -d '+' \
<( printf 'print "Result ", ++c, ": ", %s\n' "${array1[@]}" ) \
<( printf '%s, "\\n"\n' "${array2[@]}" ) |
bc
Использованиеawk
(представляет собой петлю в стиле C -for
!):
array1=(23 34 23 12 11 32 12 12 12 21)
array2=(12 13 14 43 42 23 32 11 10 22)
awk -v a="${array1[*]}" \
-v b="${array2[*]}" \
'
BEGIN {
split(a,aa," ");
n = split(b,bb," ");
for (i = 1; i <= n; ++i)
printf "Result %d: %d\n", i, aa[i]+bb[i]
}'
Вот еще вариант:
#!/bin/bash
array1=(23 34 23 12 11 32 12 12 12 21)
array2=(12 13 14 43 42 23 32 11 10 22)
for ((i = 0; i < ${#array1[@]} && i < ${#array2[@]}; i++)); do
printf "Result %2d: %d\n" $((i + 1)) $((array1[i] + array2[i]))
done
Пример выполнения:
Result 1: 35
Result 2: 47
Result 3: 37
Result 4: 55
Result 5: 53
Result 6: 55
Result 7: 44
Result 8: 23
Result 9: 22
Result 10: 43
Скрипт запускает цикл от 0 до длины самого короткого массива (на случай, если какое-то будущее изменение сделает один массив длиннее другого ). Каждый раз в цикле он печатает результат для i -й записи.
Для развлечения с постоянным током
Извините, комментарии на французском.
#!/bin/bash
array1=(23 34 23 12 3211 32 12 2 12 21)
array2=(12 13 14 43 42 23 32 5 710 22)
dc <<EOF
# Definition
# macro e = quitter si les tableaux n ont pas la meme taille
# macro f = calcul du nb de digit du resultat et stocke le max dans registre p
# macro g = addition des tableaux dans le registre tableau m
# macro h = afficher les espaces pour le formattage
# macro i = affichage du resultat formatte
# registre j = nb elt tableau
# registre k = nb max de digit de l index du tableau
# registre l = compteur elt tableau
# registre m = tableau indexe de la somme des tableaux d entree
# registre n = compteur du nb de digit de l index du tableau
# registre o = nb max de digit pour affichage
# registre p = nb max de digit du calcul
# registre q = poubelle
# Strings
[arrays are not the same size]sa
[Result]sb
[:]sc
[ ]sd
# Macros
[lapq]se
[dZsp]sf
[ll;m+dZlp<fll:mll1-dsl0<g]sg
[lnd1+snldnlo>h]sh
[ll1+dddsllbndZsnlksolhxnlcn;mdZsnlpsolhxpsqlj>i]si
# Program
$(printf "%d\n" ${array1[*]})
zdsjZsk
$(printf "%d\n" ${array2[*]})
zlj-lj!=e
ljsllgxljsllgx
lix
EOF
Дисплей:
Result 1: 35
Result 2: 47
Result 3: 37
Result 4: 55
Result 5: 3253
Result 6: 55
Result 7: 44
Result 8: 7
Result 9: 722
Result 10: 43