অবসন্নতার সাথে প্রতিধ্বনি


15

আমাকে স্ক্রিনে কিছু ভেরিয়েবল মুদ্রণ করা দরকার তবে আমি প্রথম কয়েকটি অক্ষরকে অগ্রাধিকার সহকারে প্রকাশ করতে হবে এবং আমি ভাবছিলাম যে বাশ-এ কোনও প্রতিধ্বনি রয়েছে যা এটি কোনও টার্মিনালে মুদ্রণের সময় কোনও গোপন মানের প্রথম অক্ষরগুলিকে অপসারণ করতে পারে:

echo 'secretvalue'
********lue

উত্তর:


11

অন্যান্য উত্তরগুলি শুরু থেকে অক্ষরের একটি নির্দিষ্ট পরিমাণকে মাস্ক করে, প্লেটেক্সট প্রত্যয় দৈর্ঘ্যে পরিবর্তিত হয়। বিকল্প হ'ল প্লেইন টেক্সটে একটি নির্দিষ্ট পরিমাণ অক্ষর রেখে দেওয়া এবং মুখোশযুক্ত অংশের দৈর্ঘ্য পরিবর্তিত করা। কোনটি বেশি কার্যকর তা আমি জানি না, তবে এখানে অন্যটি পছন্দ রয়েছে:

#!/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"
}

13

একটি বিকল্প হ'ল পরিবর্তে নিজেকে কোনও ফাংশন ব্যবহার করতে বাধ্য করা 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*

স্পষ্ট করে বলতে গেলে, আমি এলোমেলো মাস্কিং পছন্দ করি না। একটি দৃ determined়ধারিত কাঁধে সার্ফার আমার সাথে ছোট ছোট কথা বলার ভান করে আমার গোপনীয়তাগুলি অবশেষে পেয়ে যাবে।
ইমোরি

অবশ্যই সংবেদনশীল তথ্য প্রদর্শন সাবধানে করা উচিত! আমি স্থির-উপসর্গ মাস্কিং এবং ভেরিয়েবল-প্রিফিক্স মাস্কিংয়ের বিকল্প হিসাবে এলোমেলো মাস্কিং উপস্থাপন করেছি।
জেফ স্ক্যালার হলেন

4
আমি স্থির-উপসর্গ বা ভেরিয়েবল-উপসর্গের মুখোশের কোনও অনুরাগী নই, তবে তাদের সাথে আমার গোপনীয়তার একটি "কর্নেল" রয়েছে যা গোপন রয়ে যায়। এলোমেলো মাস্কিং সহ, কোনও "কার্নেল" নেই। অবশেষে সবকিছু সেই রোগীর কাছে প্রকাশিত হবে।
ইমোরি 20'19

7

আপনি পাইপ চেষ্টা করতে পারেন sed। উদাহরণস্বরূপ, তারকাচিহ্নগুলির সাথে স্ট্রিংয়ের প্রথম 8 টি অক্ষর প্রতিস্থাপন করতে, আপনি sed 's/^......../********/'কমান্ডটি পাইপ করতে পারেন , যেমন:

$ echo 'secretvalue' | sed 's/^......../********/'
********lue

আপনি এমন কোনও ক্রিয়াও সংজ্ঞায়িত করতে পারেন যা এটি করে:

obsecho () { echo "$1" | sed 's/^......../*********/'; }

2
আমি প্রস্তাব করব printfউপরecho যেমন ডাটা ব্যাখ্যা আপনি বিষয় না হন তাই \rবা\n
জেফ স্ক্যালার হলেন

@ জেফশালার এই কারণেই আমি এসইতে পোস্ট করি। ভাল যুক্তি. সাহায্য করার জন্য ধন্যবাদ.
আইগাল

এটি আমার সময়ে আমি শিখেছি এমন অনেকগুলি জিনিসগুলির মধ্যে একটি এটিও! এটি পাশ দিয়ে খুশি!
জেফ শ্যাচলার

1
পরিবর্তে যখন এখানে স্ট্রিং ব্যবহার করতে পারেন তখন পাইপ ব্যবহার করার দরকার নেই:sed 's/^......../********/' <<< 'secretvalue'
ওয়াজান্দ্রিয়া

@ রোয়াইমা এটি আসলে একটি অস্থায়ী নিয়মিত ফাইল। আপনি যদি এটি করেন তবে তা দেখতে পাবেন bash -c 'lsof -d0 -a -p $$ 2>/dev/null' <<< foo
JoL

7

একটি 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}

2

বাশের আরেকটি বিকল্প, আপনি যদি একটি সাধারণ বিষয়কে আপত্তি করেন না তবে আপনি 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}

0

স্ট্রিং প্রতিস্থাপনের সাথে কীভাবে রেজেক্স-জাতীয় অনুসন্ধানের সংমিশ্রণ করা যায় তা নিয়ে খেলতে এখানে খেলনা বাশ স্ক্রিপ্টগুলি দেওয়া আছে।

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.