我一直在研究一系列bash脚本,我需要自动输入密码来批量处理文件和操作。
这不仅适用于一个程序,例如,有时需要为GPG完成,有时需要为steghide完成。
有一个特定的原因,我正在理解它背后的安全元素。这被考虑并被脚本的存储和工作方式所否定。
密码或密码通过命令行参数传递给脚本,密码/短语必须以编程方式重复多次。
以下是我在脚本中使用的示例:
for f in $dir
do
steghide embed -cf $f -ef /path/to/secret.txt
done
然而,这只是交互式地询问每个图像: 输入密码: 重新输入密码短语:
对于目录中的每个图像,都会请求此密码,因此密码应该能够存储在变量中并重复使用。
我最近一直在使用steghide,但是也需要在以后使用GPG自动化密码短语,尽管这些方法不需要相同。
答案 0 :(得分:1)
man steghide
:
-p, --passphrase
Use the string following this argument as the
passphrase. If your passphrase contains whitespace,
you have to enclose it in quotes, for example: -p
"a very long passphrase".
man gpg
:
--passphrase string
Use string as the passphrase. This can only be used if only one
passphrase is supplied. Obviously, this is of very questionable
security on a multi-user system. Don't use this option if you can
avoid it.
答案 1 :(得分:0)
公开未经测试,边缘粗糙,可以改进......但是这里是我的一些研究脚本的预览,这些脚本还没有被合并到其中一个GitHub项目中我正在写...绝对对下面的脚本运行shellcheck
以捕获任何拼写错误。
#/usr/bin/env bash
Var_stego_out_dir="${1}"
Var_stego_in_dir="${2}"
Var_stego_cover_dir="${3}"
Var_passphrase_file="${4}"
Var_passphrase="${5}"
Var_auto_pass_length="${6:-64}"
Func_build_array_of_paths(){
_dir="${1}"
_arr="${2}"
_file_extension_list="${3}"
if [ -d "${_dir}" ] && [ "${#${_arr}[@]}" = "0" ]; then
find "${_dir}" -xtype f | while read _path; do
case "${_path##*.}" in
${_file_extension_list//,/|})
declare -ag "${_arr}+=( ${_path} )"
;;
esac
done
fi
}
Func_enc_stego(){
_cover_file="${1}"
_enc_file="${2}"
_pass_file="${3}"
_output_file="${Var_stego_out_dir}/${_cover_file##*/}"
if [ -f "${_cover_file}" ] && [ -f "${_enc_file}" ]; then
_auto_passphrase="${Var_passphrase:-$(base64 /dev/random | tr -cd '[:print:]' head -c${Var_auto_pass_length})}"
if ! [ -f "${_output_file}" ]; then
steghide -p ${_auto_passphrase} -ef ${_enc_file} -cf ${_cover_file} -sf ${_output_file}
cat <<<"### ${_output_file} ### ${_auto_passphrase}" >> "${_pass_file}"
else
steghide -p ${_auto_passphrase} -ef ${_enc_file} -cf ${_cover_file} -sf ${_output_file}_$(date -u +%s)
cat <<<"### ${_output_file}_$(date -u +%s) ### ${_auto_passphrase}" >> "${_pass_file}"
fi
fi
}
Func_main(){
## Build array of file paths for cover file use
Func_build_array_of_paths "${Var_stego_cover_dir}" "Arr_cover_list" "au,AU,bmp,BMP,jpeg,JPEG,wav,WAV"
## Build array of file paths for embed file use
Func_build_array_of_paths "${Var_stego_in_dir}" "Arr_input_list" "gpg,GPG,txt,TXT"
let _arr_input_count=0
let _arr_cover_count=0
until [ "${_arr_input_count}" = "${#Arr_input_list}" ]; do
if [ -f "${Arr_cover_list[${_arr_cover_count}]}" ]; then
Func_enc_stego "${Arr_cover_list[${_arr_cover_count}]}" "${Arr_input_list[${_arr_input_count}]}" "${Var_passphrase_file}"
let _arr_cover_count++
let _arr_input_count++
elif [ -f "${Arr_cover_list[$((${_arr_cover_count}-1))]}" ]; then
Func_enc_stego "${Arr_cover_list[$((${_arr_cover_count}-1))]}" "${Arr_input_list[${_arr_input_count}]}" "${Var_passphrase_file}"
let _arr_input_count++
_arr_cover_count="$((${_arr_cover_count}-1))"
if
done
}
Func_main
在上面填写以下部分
script.sh "/path/to/stego_out_dir" "/path/to/stego_in_dir" "/path/to/stego_cover_dir" "/path/to/passphrase_file"
## or define static passphrase
#script.sh "/path/to/stego_out_dir" "/path/to/stego_in_dir" "/path/to/stego_cover_dir" "/path/to/passphrase_file" "passphrase"
注意如上所述以纯文本格式保存密码和文件是非常糟糕的做法,并且因为OP表示他们也在考虑GnuPG自动化,读者和OP的作者应该查找Perinoid_Pipes;特别是GnuPG_Gen_Key.sh脚本和函数,以Paranoid_Pipes.sh开头Func_dec_*
为工作/测试的自动化涉及GnuPG密码的例子;并保护上述脚本编写的密码短语查找函数以Func_enc_*
脚本中的Paranoid_Pipes.sh
开头,用于mkfifo
命令和结果命名管道如何用于自动加密大多数数据类型。提示第四个示例参数"/path/to/passphrase_file"
将指向由链接脚本创建的加密命名管道,以使事情更安全; - )