Лучший известный мне способ — использовать сценарий входа в систему PAM, который я адаптировал из предыдущей работы, поскольку не смог найти удовлетворительного ответа на этот вопрос.
Ваша парольная фраза хранится в зашифрованном виде с помощью системного пароля и сложной функции деривации. При входе в систему ваш системный пароль используется для расшифровки парольной фразы и ее добавления в агент.
https://github.com/capocasa/systemd-user-pam-ssh
Преимущество по сравнению с любым другим представленным решением заключается в том, что оно сочетает в себе безопасность, эквивалентную запуску ssh -add вручную при загрузке без каких-либо усилий. Он не требует дополнительных инструментов и имеет одну дополнительную зависимость, которая уже установлена по умолчанию в большинстве систем (OpenSSL ).
Добавление буквенных кавычек в строки не означает, что оболочка понимает эти кавычки. Вам нужна эта заметка (, в bash версии 4.2+ printf можно использовать для форматирования даты)
old_version='"version": "0.0.0"'
# "-1" is a magic value meaning "now"
printf -v year '%(%y)T' -1
printf -v dayOfYear '$(%j)T' -1
version="$year.$dayOfYear.3434"
echo "$version"
# or even without the temp variables:
# printf -v version '%(%y)T.%(%j)T.3434' -1 -1
filepath="/opt/vsts-agent-linux/_work/5/s/projects/tl-angular-map/package.json"
echo "$filepath"
replace="s/$old_version/$version/g"
echo "$replace"
sed -i -e "$replace" "$filepath"
Однако при этом строка "version": "0.0.0"
будет заменена на 21.292.3434
, что приведет к поломке вашего объекта JSON в файле.
$ cat package.json
{
"key": "value",
"version": "0.0.0",
"foo": "bar"
}
$ sed "s/$old_version/$version/g" package.json
{
"key": "value",
21.292.3434,
"foo": "bar"
}
Для управления данными JSON следует использовать jq для установки нового значения:
$ jq --arg newversion "$version" '.version = $newversion' package.json
{
"key": "value",
"version": "21.292.3434",
"foo": "bar"
}
Предполагая, что version
является ключом верхнего уровня -в вашем документе JSON, вы должны обновить его до нужного значения, используя jq
, например:
jq --arg patch 3434 \
'.version |= (now | strftime("%y.%j.") + $patch)' file.json >newfile.json
Это сначала устанавливает внутреннюю переменную $patch
в версию выпуска исправления в командной строке. Затем он форматирует строку отметки времени -из текущего времени, используя strftime()
, и добавляет значение $patch
в конец этой строки. Эта результирующая строка затем назначается клавише version
на верхнем уровне -документа JSON, и результирующий документ выводится.
Пример:
$ cat file.json
{
"key": "value",
"version": "0.0.0",
"foo": "bar"
}
$ jq --arg patch 3434 '.version |= (now | strftime("%y.%j.") + $patch)' file.json
{
"key": "value",
"version": "21.292.3434",
"foo": "bar"
}
Нужно ли вам убедиться, что старая версия не обновлена, если она отличается от точно 0.0.0
, тогда вместо этого используйте
jq --arg patch 3434 \
'select(.version == "0.0.0").version |= (now | strftime("%y.%j.") + $patch)' file.json >newfile.json
То есть используйте select()
, чтобы убедиться, что объект всегда обновляется, только если его значение version
равно 0.0.0
.
Альтернативный способ формулировки, который может кому-то показаться более приятным:
jq --arg patch 3434 \
'(now | strftime("%y.%j.") + $patch) as $version |
select(.version == "0.0.0").version |= $version' file.json >newfile.json