APIを使用する新しいアプリケーションに移行するには、パスワードデータベース(Keepass)のcsvファイルを使用する必要があります。 API は、JSON データ型を必要とするパブリッシュ要求を通じて更新されます。私がしなければならないのは、KeePass CSVを使用してAPIに関連付けられたパスワードやその他の情報をエクスポートすることです。私はbashとawkを使ってスクリプトを書くことにしました。
csvファイルの列は次のように配列されます。
"Group","Title","Username","Password","URL","Notes","TOTP","Icon","Last Modified","Created"
一部のコメントには改行があるため、「説明」フィールドは複数行です。
"That's an important note, <br/>
some extra infos <br/>
concerning a password"
以下は、データを公開するためのAPIリクエストの例です。データフィールドはJSON形式です。
このリクエストに必要なフィールドをすべて追加したわけではありませんが、すでにどのように機能するかを確認できます。 KeePass と API フィールド名が異なるため、一部のフィールド名が異なります。
var1=name
var2=my.name
var3=password456
curl -s --request PUT -u username123:password123 -H 'Content-Type: application/json; charset=utf-8' https://tpm.mydomain.com/index.php/api/v5/passwords/1659.json --data-binary @- <<DATA
{
"name": "$var1",
"username": "$var2",
"password": "$var3"
}
DATA
私のCSVファイルフィールドをフィールドごとに解析し、行解析を完了したら、データベースにパスワードを公開するようにAPIリクエストを行う予定です。次に、残りの行ごとにこれを行います。
CSVを処理するために、私の場合は非常に便利で便利なようなAWK言語を見つけました。 gsubコマンドを使用して私のファイルを何度もテストしましたが、これは改行文字(\ n)を置き換えるのに役立ちました。どうやって進むべきかわかりません。以下はその一部です(最初の項目のみが機能します。
cat keepass.csv | awk NF=NF RS=/\n/ OFS=\n
cat keepass.csv |awk 'BEGIN {RS=","}{gsub("/\n/","",$0); print $0}'
cat keepass.csv | awk 'BEGIN {RS=""}{gsub(/\n/,"",$6); print $0}'
また、awkの後に-vを追加してbash varを共有できることを知っています。これは私が得ることができる最も近いコードです。
awk -v RS='"\n' -v FPAT='"[^"]*"|[^,]*' '{
print "Row n°", NR, ""
for (i=1; i<=NF; i++) {
sub(/^"/, "", $i)
printf "Field %d, value=[%s]\n", i, $i
}} keepass.csv
私が探しているのは、複数行のコメントを考慮してcsvのすべての列を解析し、それをJSON形式でbashのグローバル変数に入力するコマンドです。
次のようにしてビルドする必要があると思います。
awk -v 'BEGIN{parsing and replacing keeping '\n' of notes}
if end of row,
return boolean to bash for processing the API requests, wait,
restart the loop}''
私はスクリプトが初めてで、数行で完了することができると思いますが、どのように進むべきかわかりません。必要に応じて言語をPythonに変更し、コードにいくつかのツールを追加できます。
答え1
複数行はCSVセルの機能であり、CSV認識ユーティリティを使用できます。ミラー。
たとえば、次のような場合このCSVファイル君は走れるよ
mlr --csv cut -f fieldA acr.csv
最初の列を切り取るmlr --icsv --ojson cut -f fieldA acr.csv
最初の列を切り取り、すべて次に変換します。JSON
[
{
"fieldA": "That's an important note,\nsome extra infos\nConcerning a password\nIpsum"
},
{
"fieldA": "hello"
}
]
ご覧のとおり、Millerはセルキャリッジリターン文字(RFC4180準拠)。
以下はサンプル入力ファイルのイメージです。
答え2
「説明」フィールドは複数行です。
いいえ! CSVは複数行をサポートしません。絶対にしないでください。
複数行の文字列をCSVに保存する必要がある場合は、2つの一般的な方法があります。
\n
元の文字列の文字を別の文字に変更します。通常、2 文字の "\n" 文字列です。- レコード区切り文字を
\n
文字列に表示されない他の文字に変更します。通常はそうです\x01
。
最初の方法は追加の事前変換と後変換が必要ですが、かなり安定しています。
2番目の方法は非常に優れており、簡単に動作しますが、CSVをサポートするすべてのアプリケーションがレコード区切り文字を変更できるわけではなく、レコード区切り文字として使用されている文字がフィールド内に表示される可能性が常にあります。
何らかの理由でファイルを再生成して正しいCSVにすることができない場合は、ループを使用することをお勧めします。
while read row
if row has 6 fields ("Notes" is a 6th field)
do
append "\n" to it
append next row to it
repeat until the working row has 10 fields
export the work row to output file
end if
end while
どんな言語でも可能です(でもbash
)。