উত্তর:
অন্যান্য উত্তরগুলি শুরু থেকে অক্ষরের একটি নির্দিষ্ট পরিমাণকে মাস্ক করে, প্লেটেক্সট প্রত্যয় দৈর্ঘ্যে পরিবর্তিত হয়। বিকল্প হ'ল প্লেইন টেক্সটে একটি নির্দিষ্ট পরিমাণ অক্ষর রেখে দেওয়া এবং মুখোশযুক্ত অংশের দৈর্ঘ্য পরিবর্তিত করা। কোনটি বেশি কার্যকর তা আমি জানি না, তবে এখানে অন্যটি পছন্দ রয়েছে:
#!/bin/bash
mask() {
local n=3 # number of chars to leave
local a="${1:0:${#1}-n}" # take all but the last n chars
local b="${1:${#1}-n}" # take the final n chars
printf "%s%s\n" "${a//?/*}" "$b" # substitute a with asterisks
}
mask abcde
mask abcdefghijkl
এই প্রিন্ট **cde
এবং *********jkl
।
আপনি যদি পছন্দ করেন তবে n
বেশিরভাগ স্ট্রিংটি মুখোশযুক্ত হয়ে গেছে তা নিশ্চিত করতে আপনি সংক্ষিপ্ত স্ট্রিংয়ের জন্যও পরিবর্তন করতে পারেন। যেমন এটি নিশ্চিত করবে যে সংক্ষিপ্ত স্ট্রিংয়ের জন্য কমপক্ষে তিনটি অক্ষর মুখোশযুক্ত। (তাই abcde
-> ***de
, এবং abc
-> ***
):
mask() {
local n=3
[[ ${#1} -le 5 ]] && n=$(( ${#1} - 3 ))
local a="${1:0:${#1}-n}"
local b="${1:${#1}-n}"
printf "%s%s\n" "${a//?/*}" "$b"
}
একটি বিকল্প হ'ল পরিবর্তে নিজেকে কোনও ফাংশন ব্যবহার করতে বাধ্য করা echo
যেমন:
obfuprint() {
if [ "${#1}" -ge 8 ]
then
printf '%s\n' "${1/????????/********}"
else
printf '%s\n' "${1//?/*}"
fi
}
তারপরে আপনি কল করতে obfuprint 'secretvalue'
এবং গ্রহণ করতে পারবেন ********lue
(একটি পেছনের নতুন লাইন সহ)। উত্তোলিত মানটির প্রথম আটটি অক্ষর সন্ধান করতে ফাংশনটি প্যারামিটার সম্প্রসারণ ব্যবহার করে এবং আটটি অক্ষর দিয়ে তাদের প্রতিস্থাপন করে। যদি আগত মানটি আটটি অক্ষরের চেয়ে স্বল্প হয় তবে সেগুলি সমস্তগুলি অ্যাসিস্ট্রিক দিয়ে প্রতিস্থাপন করা হয়। আট-বা ততোধিক চরিত্রের ইনপুট সম্পর্কে আমার প্রাথমিক অনুমানটি নির্দেশ করার জন্য ইল্কাচ্ছুকে ধন্যবাদ !
ইল্কাচ্চুর নমনীয় মাস্কিং উত্তরে অনুপ্রাণিত হয়ে , আমি ভেবেছিলাম যে কোনও প্রকরণ যুক্ত করা আকর্ষণীয় হবে যা এলোমেলোভাবে স্ট্রিংয়ের কিছু শতাংশকে মাস্ক করে:
obfuprintperc () {
local perc=75 ## percent to obfuscate
local i=0
for((i=0; i < ${#1}; i++))
do
if [ $(( $RANDOM % 100 )) -lt "$perc" ]
then
printf '%s' '*'
else
printf '%s' "${1:i:1}"
fi
done
echo
}
এটি বাশের $RANDOM
বিশেষ পরিবর্তনশীল উপর নির্ভর করে ; এটি কেবল ইনপুটটির প্রতিটি চরিত্রের মধ্য দিয়ে যায় এবং সেই চরিত্রটি মাস্ক করা বা মুদ্রণ করা যায় কিনা তা স্থির করে। নমুনা আউটপুট:
$ obfuprintperc 0123456789
0*****6*8*
$ obfuprintperc 0123456789
012***678*
$ obfuprintperc 0123456789
**********
$ obfuprintperc 0123456789
*****56***
$ obfuprintperc 0123456789
0*******8*
আপনি পাইপ চেষ্টা করতে পারেন sed
। উদাহরণস্বরূপ, তারকাচিহ্নগুলির সাথে স্ট্রিংয়ের প্রথম 8 টি অক্ষর প্রতিস্থাপন করতে, আপনি sed 's/^......../********/'
কমান্ডটি পাইপ করতে পারেন , যেমন:
$ echo 'secretvalue' | sed 's/^......../********/'
********lue
আপনি এমন কোনও ক্রিয়াও সংজ্ঞায়িত করতে পারেন যা এটি করে:
obsecho () { echo "$1" | sed 's/^......../*********/'; }
sed 's/^......../********/' <<< 'secretvalue'
bash -c 'lsof -d0 -a -p $$ 2>/dev/null' <<< foo
।
একটি zsh
বৈকল্পিক যা পাঠ্যের তিন চতুর্থাংশকে মুখোশ দেয়:
mask() printf '%s\n' ${(l:$#1::*:)1:$#1*3/4}
উদাহরণ:
$ mask secretvalue
********lue
$ mask 12345678
******78
$ mask 1234
***4
প্রথম 8 টি চরকে মুখোশ দেওয়ার জন্য:
mask() printf '%s\n' ${(l:$#1::*:)1:8}
শেষ 3 টি অক্ষর ব্যতীত অন্য সমস্তকে মাস্ক করা:
mask() printf '%s\n' ${(l:$#1::*:)1: -3}
এলোমেলো সংখ্যক অক্ষরকে মাস্ক করতে:
mask() printf '%s\n' ${(l:$#1::*:)1: RANDOM%$#1}
বাশের আরেকটি বিকল্প, আপনি যদি একটি সাধারণ বিষয়কে আপত্তি করেন না তবে আপনি eval
এটি কয়েকটি সহ করতে পারেন printf
:
# example data
password=secretvalue
chars_to_show=3
# the real thing
eval "printf '*%.0s' {1..$((${#password} - chars_to_show))}"
printf '%s\n' "${password: -chars_to_show}"
কিন্তু সতর্কতা অবলম্বন করা আবশ্যক:
${#password}
কম প্রয়োজন তখন উপরেরটি ঠিক করুন${chars_to_show}
eval
অবিশ্বস্ত ইনপুট দিয়ে খুব বিপজ্জনক হতে পারে: এখানে এটি নিরাপদ হিসাবে বিবেচনা করা যেতে পারে কারণ এর ইনপুটটি কেবল নিরাপদ উত্স থেকে আসে, অর্থাত্ দৈর্ঘ্য ${password}
এবং এর মান${chars_to_show}
স্ট্রিং প্রতিস্থাপনের সাথে কীভাবে রেজেক্স-জাতীয় অনুসন্ধানের সংমিশ্রণ করা যায় তা নিয়ে খেলতে এখানে খেলনা বাশ স্ক্রিপ্টগুলি দেওয়া আছে।
strip_str.sh
#!/usr/bin/env bash
_str="${1}"
_filter="${2:-'apl'}"
echo "${_str//[${_filter}]/}"
strip_str.sh 'apple-foo bar'
# -> e-foo br
strip_str.sh 'apple-foo bar' 'a'
# -> pple-foo br
privatize_str.sh
#!/usr/bin/env bash
_str="${1}"
_filter="${2:-'apl'}"
_replace="${3:-'*'}"
echo "${_str//[${_filter}]/${_replace}}"
privatize_str.sh 'apple-foo bar'
# -> ****e-foo b*r
restricted_str.sh
#!/usr/bin/env bash
_str="${1}"
_valid="${2:-'a-z'}"
_replace="${3:-''}"
echo "${_str//[^${_valid}]/${_replace}}"
restricted_str.sh 'apple-foo bar'
# -> applefoobar
কী Takeaways
[a-z 0-9]
বাশের <search>
অভ্যন্তরে সম্পূর্ণ বৈধ এবং কার্যকর is${_var_name//<search>/<replace>}
^
এই প্রসঙ্গে, বিপরীত বা not
রেজেক্সের মতো অনুসন্ধানের জন্যযদিও আমি যে
printf
হয় ভাল প্রায় সব ব্যবহার ক্ষেত্রেই উপরের কোড ব্যবহারecho
মাত্রাতিরিক্ত গুলান না কি হচ্ছে হিসেবে তাই।
obfuscate_str.sh
#!/usr/bin/env bash
_str="${1}"
_start="${2:-6}"
_header="$(for i in {1..${_start}}; do echo -n '*'; done)"
echo "${_header}${_str:${_start}}"
obfuscate_str.sh 'apple-foo bar' 3
# -> ***le-foo bar