Правильное экранирование кавычек

Входные файлы:

  1. содержание yahoo.net.txt
  2. gougle.com.txt
  3. reddit.com.txt

yahoo.net.txt:

user1-yaho0
pas,,

Содержание gougle.com.txt:

user1-google
pas"wor,d

Содержание reddit.com.txt:

user1-reddit
pas\wor\d

С этим входом, следующий быстрый и грязный сценарий делает работу:

#!/bin/bash

echo "\"Account\",\"Login Name\",\"Password\",\"Web Site\",\"Notes\"" > output.csv
num=0
for f in `find . -type f -name '*.txt'` ; do

num=$((num + 1))
user=`head -1 "$f"`
password=`sed 1d "$f" | sed -r 's/([\\,"])/\\\\\1/g'`
domain=`basename "$f" | sed 's/\.txt$//'`

echo "\"$num\",\"$user\",\"$password\",\"$domain\",\"\"" >> output.csv

done

Содержание output.csv:

"Account","Login Name","Password","Web Site","Notes"
"1","user1-reddit","pas\\wor\\d","reddit.com",""
"2","user1-yaho","pas\,\,","yahoo.net",""
"3","user1-google","pas\"wor\,d","gougle.com",""
3
18.06.2018, 10:11
2 ответа

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

Обычно лучше использовать переменные окружения:

PASSWORD="$Password" python3 -c 'import os, crypt
print(crypt.crypt(os.getenv("PASSWORD"), crypt.mksalt(crypt.METHOD_SHA512)))'

(здесь используется синтаксис VAR=value cmdв отличие от export VAR, поэтому переменная среды передается только для этого одного вызова команды ).

7
27.01.2020, 21:10

Не надо.

python -c 'import sys; import crypt; print(crypt.crypt(sys.argv[1], crypt.mksalt(crypt.METHOD_SHA512)))' "$Password"
2
27.01.2020, 21:10

Теги

Похожие вопросы