আমি তৈরি করা সমস্ত মানব ব্যবহারকারীকে কীভাবে তালিকাবদ্ধ করতে পারি? আমি চেষ্টা করেছি cat /etc/passwdএবং এটি কেবল প্রচুর স্টাফের তালিকাবদ্ধ করে।
আমি তৈরি করা সমস্ত মানব ব্যবহারকারীকে কীভাবে তালিকাবদ্ধ করতে পারি? আমি চেষ্টা করেছি cat /etc/passwdএবং এটি কেবল প্রচুর স্টাফের তালিকাবদ্ধ করে।
উত্তর:
মানব ব্যবহারকারীদের 1000 থেকে শুরু করে ইউআইডি রয়েছে, সুতরাং আপনি সেই সত্যটি অ-মানুষকে ছাঁটাতে ব্যবহার করতে পারেন:
cut -d: -f1,3 /etc/passwd | egrep ':[0-9]{4}$' | cut -d: -f1
এটি প্রথম (ব্যবহারকারীর নাম) এবং তৃতীয় (ইউআইডি) কোলন-সীমাবদ্ধ ক্ষেত্রগুলি থেকে /etc/passwdকেটে ফেলেছে, এরপরে ফলস্বরূপ লাইনগুলির জন্য ফিল্টার করে যা কোনও কোলন এবং চার অঙ্কের সাথে শেষ হয়, তারপরে প্রথম (ব্যবহারকারীর) ক্ষেত্রটি কেটে দেয়, আপনাকে একটি তালিকা রেখে দেয় 1000 এবং 9999 এর মধ্যে ইউআইডি সহ ব্যবহারকারীরা।
আপনার সিস্টেমে যদি নয় হাজারেরও বেশি ব্যবহারকারী থাকে তবে এটি ব্যর্থ হবে - তবে ফলাফলটি 4-সংখ্যার nobodyইউআইডি -তে সীমাবদ্ধ করা প্রয়োজন যাতে না ধরা (ইউআইডি 65534)।
এটি গ্রহণযোগ্য উত্তরটি যা কিছু করে তা কেবল তিনটি পরিবর্তে একটি কমান্ডে করে:
awk -F: '$3 >= 1000 && $1 != "nobody" {print $1}' /etc/passwd
এবং মন্তব্যে কারেলের ধন্যবাদ, nobodyব্যবহারকারীও ফিল্টার আউট।
আমি ব্যক্তিগতভাবে ন্যায়সঙ্গত ব্যবহার করতে পছন্দ করি:
ls /home
স্বীকার্যভাবে এটি ব্যবহারকারীর তালিকা নয় বরং তাদের বাড়ির ডিরেক্টরিগুলির তালিকা। বর্তমানে সিস্টেমে বিদ্যমান মানব ব্যবহারকারীদের হোম ডিরেক্টরি থাকবে /homeতবে আপনি অপসারণ করা অতীতের ব্যবহারকারীদের হোম ডিরেক্টরিগুলিও দেখতে পাবেন।
এটি আমার উদ্দেশ্যগুলির জন্য কাজ করে এবং আপনার জন্যও এটি কাজ করতে পারে। উদাহরণস্বরূপ, আপনি যদি এমন কোনও ব্যবহারকারীর অ্যাকাউন্ট মুছে ফেলার সন্ধান করছেন যা কোনও অস্তিত্ব রাখে না ( nonexistent-user) এবং কমান্ডটি চালান
sudo deluser nonexistent-user
এটি কেবল আপনাকে বলবে যে এই ব্যবহারকারীর অস্তিত্ব নেই।
/home(যা এর সাথে সিমলিঙ্কযুক্ত নয় /home) কম মনে হয় (সর্বোপরি, তালিকা প্রদর্শন থেকে ডিসপ্লে ম্যানেজারকে রাখার এটি সবচেয়ে সাধারণ পদ্ধতি লগইন স্ক্রিনে থাকা কোনও ব্যবহারকারী, যা কখনও কখনও কোনও মানব ব্যবহারকারীর জন্য করা হয়ে থাকে)। এখানে অপেক্ষাকৃত সামান্য অসুবিধা হ'ল lost+foundপৃথক /homeপার্টিশনযুক্ত সিস্টেমে তালিকাভুক্ত করা হবে ।
useradd --no-create-home username?
useradd --no-create-homeহোম ডিরেক্টরি ডিরেক্টরি ইতিমধ্যে উপস্থিত থাকতে পারে বা তার খুব শীঘ্রই তৈরি হতে পারে - এর ls /homeজন্য এই পদ্ধতিটির ক্ষেত্রে পদ্ধতিটি দুর্দান্ত কাজ করে।
যদিও এটি একটি পরিষ্কার ধারণা হিসাবে মনে হতে পারে, প্রকৃতপক্ষে মানব ব্যবহারকারীর অর্থের ক্ষেত্রে অস্পষ্টতা রয়েছে । কোনও ব্যবহারকারী অ্যাকাউন্ট ইচ্ছাকৃতভাবে লগইন স্ক্রিন থেকে আড়াল হয়েছে কারণ এটি কেবলমাত্র বিশেষ উদ্দেশ্যে (তবে মানুষের দ্বারা) কোনও ব্যবহারকারীর জন্য ব্যবহৃত হয়? ubuntuলাইভ সিডিতে ব্যবহারকারী (ইউআইডি 999) সম্পর্কে কীভাবে ? এবং উবুন্টুতে অতিথি অ্যাকাউন্টগুলি অন-ফ্লাই তৈরি করা হয় এবং লগআউট করার পরে ধ্বংস হয়; তারা কি মানব ব্যবহারকারী? আরও উদাহরণ তৈরি করা যেতে পারে।
অতএব, একাধিক, অ-সমতুল্য উত্তর দেওয়া হয়েছে এটি উপযুক্ত। সায়েজ হ্যাম্বলিনের দৌড়ানোর সমাধানটি আসলেls /home লোকেরা যা করেন এবং আপনি কোনও স্ক্রিপ্ট না লিখলে আপনার সম্ভবত এটি ব্যবহার করা উচিত।
ls /homeআরো জোরালোতবে সম্ভবত আপনার ব্যবহারকারীরা মুছে ফেলা হয়েছে, তবে যার হোম ডিরেক্টরিগুলি এখনও বিদ্যমান রয়েছে /homeএবং আপনাকে অবশ্যই সেগুলি তালিকাভুক্ত করা উচিত। অথবা হতে পারে অন্য কোনও কারণে আপনাকে অবশ্যই নিশ্চিত করতে হবে /homeযে বাস্তব অ্যাকাউন্টগুলির সাথে সম্পর্কিত কেবলমাত্র এন্ট্রি তালিকাভুক্ত রয়েছে।
সেক্ষেত্রে, আমি সবকিছু নাম প্রসঙ্গে করার পরামর্শ দিই /homeকরতে getent(পুনরুদ্ধার করতে passwdঐ নামের সাথে ব্যবহারকারীদের এন্ট্রি), তারপর বিছিন্ন ও ডিসপ্লে মাত্র ব্যবহারকারীর নাম ক্ষেত্র (সঙ্গে grep, sedঅথবা awkআপনার পছন্দের অনুযায়ী)। এর মধ্যে যে কোনও একটি করবে:
getent passwd $(ls /home) | grep -o '^[^:]*'
getent passwd $(ls /home) | sed 's/:.*//'
getent passwd $(ls /home) | awk -F: '{print $1}'
এটি ভালভাবে কাজ করা উচিত, কারণ আপনার অ্যাকাউন্টে সাদা জায়গা বা কন্ট্রোল অক্ষরের নাম থাকা উচিত নয়; উবুন্টুকে এটির অনুমতি দেওয়ার জন্য পুনরায় কনফিগার করা ছাড়াই পারে না ; এবং যদি আপনি করেন তবে আপনার বড় সমস্যা রয়েছে। এভাবে পার্সিং সঙ্গে স্বাভাবিক সমস্যার lsহয় বেমানান। তবে এটি এখানে সত্যিই ঠিক আছে, আপনি যদি কমান্ডের বিকল্পগুলি lsনান্দনিকভাবে অপছন্দনীয় বা কেবল একটি খারাপ অভ্যাসের সাথে বিবেচনা করেন তবে আপনি পছন্দ করতে পারেন:
getent passwd $(basename -a /home/*) | grep -o '^[^:]*'
getent passwd $(basename -a /home/*) | sed 's/:.*//'
getent passwd $(basename -a /home/*) | awk -F: '{print $1}'
এগুলি হোয়াইটস্পেস বা নিয়ন্ত্রণের অক্ষরগুলিকে সামঞ্জস্য করে না। আমি কেবলমাত্র সেগুলি সরবরাহ করি কারণ $(ls /home)এটি সঠিক হওয়ার পরেও ভুল দেখায় এবং এইভাবে অনেক ব্যবহারকারীকে ভুল উপায়ে ঘষে। বেশিরভাগ পরিস্থিতিতে পার্সিং এড়াতে আসল, ভাল কারণ রয়েছেls এবং সেই পরিস্থিতিতে পার্সিং basename -aসাধারণত খুব সামান্য কম হয়। এই পরিস্থিতিতে তবে ব্যবহারকারীর নামগুলিতে ব্যবহারিকভাবে অক্ষরগুলি কী হতে পারে তার সীমাবদ্ধতার কারণে তারা উভয়ই ঠিক আছে।
আমি getentপ্রধানত এটি ব্যবহার করি কারণ এটির আউটপুট সীমাবদ্ধ করার জন্য এটি ব্যবহারকারীর নামগুলি আর্গুমেন্ট হিসাবে গ্রহণ করে, তবে এটি প্রমাণ করার জন্য যে /etc/passwdসরাসরি অনুমোদনের সুবিধা এবং পাসওয়ার্ড ডাটাবেস নেটওয়ার্ক পরিষেবাদি সরবরাহ করে সে তুলনায় কিছুটা সার্বজনীন ।
এই পদ্ধতির অতিরিক্ত সুবিধা রয়েছে ls /home, পৃথক /homeপার্টিশনযুক্ত সিস্টেমে lost+foundসাধারণত আউটপুটে প্রদর্শিত হয় ls /home।
lost+foundকেবল তখনই উপস্থিত হবে যখন সেখানে কোনও ব্যবহারকারী (মানুষ বা না) বলা হয়ে থাকে lost+found, যা অসম্ভব।ls /homeকরিয়ে দিচ্ছেন , ঠিক আছে - আপনি জানেন যে আপনার কাছে কোনও মানব ব্যবহারকারী বলা হয়নি lost+found।ফলস্বরূপ, এই পদ্ধতিটি (উপরের যে কোনও পরিবর্তনে) অসন্তুষ্টিজনক আউটপুট উত্পাদন করবে:
/homeবা একেবারেই না থাকে তবে এটি প্রস্তাব দেয় কিন্তু বোঝায় না যে অ্যাকাউন্টটি কোনও মানব ব্যবহারকারীর প্রতিনিধিত্বকারী হিসাবে বিবেচিত হবে না। এই পদ্ধতিটি কেবল তখনই তালিকাভুক্ত করে যখন একই নামের ডিরেক্টরি থাকে /home।/homeতবে বাস্তবে কারওর হোম ডিরেক্টরি না হয়ে থাকে এবং সেগুলি বিদ্যমান অ-মানব ব্যবহারকারী হিসাবে একই নাম ধারণ করে - বা শ্বেত স্পেস দ্বারা পৃথক শব্দের সমন্বয়ে থাকে, যার এক বা একাধিকের একই নাম রয়েছে বিদ্যমান অ-মানব ব্যবহারকারী হিসাবে - তবে কিছু মানবেতর ব্যবহারকারী আউটপুটে অন্তর্ভুক্ত থাকতে পারে। getentঅনুরোধের সাথে প্রয়োগ করা যেতে পারে , সুতরাং শব্দ বিভাজন উত্সাহজনক আউটপুট উত্পাদন করে না But তবে জটিলতাটি নিশ্চিত হয় না; মৌলিকভাবে, আপনি যদি /homeব্যবহারকারীদের হোম ডিরেক্টরিগুলির জন্য অন্য কোনও জায়গা হিসাবে ব্যবহার করেন তবে এই পদ্ধতিটি কার্যকর হবে) নির্ভরযোগ্য আউটপুট উত্পাদন না।)যদি আপনি এমন কোনও পদ্ধতির সাথে যাওয়ার সিদ্ধান্ত নেন যা ব্যবহারকারীর আইডি চেক করে তা নিশ্চিত করার জন্য যে তারা মানুষের প্রতিনিধিত্বকারী অ্যাকাউন্টগুলির সম্ভাব্য পরিসরে রয়েছে, যেমন গৃহীত উত্তর বা অলির জবাব হিসাবে , তবে আমি বংশবৃদ্ধির জন্য এটি প্রস্তাব করছি:
getent passwd | grep -oP '^[^:]+(?=:x:\d{4}:)'
এটি দেখানোর জন্য পার্ল নিয়মিত প্রকাশ ( -P) ব্যবহার করে :
^) :এর কোনও শুরুর শিরোনামে পাঠ্য ( [^:]+) নেই - এটি প্রথম ক্ষেত্র, যেমন :ক্ষেত্র বিভাজকpasswd(?= )) পাসওয়ার্ড ক্ষেত্রকে অন্তর্ভুক্ত করে না x- এটি সর্বদা হওয়া উচিত x, যেহেতু উবুন্টুতে পাসওয়ার্ড হ্যাশগুলি shadowডাটাবেসে সংরক্ষণ করা হয় , বিশ্ব-পাঠযোগ্য passwdডাটাবেস নয়:\d{4}:)।এটি গ্রহণযোগ্য উত্তরে কৌশলটির একটি উল্লেখযোগ্যভাবে খাটো এবং কিছুটা সহজতম রূপ । (সেখানে বর্ণিত কৌশলটিও দুর্দান্তভাবে কাজ করে এবং এটি জিএনইউ / লিনাক্স সিস্টেমগুলিকে grepসমর্থন করে না এমন পোর্টেবল হওয়ার সুবিধা রয়েছে have -P)
আপনি যদি খুব উচ্চ ইউআইডি সমন্বিত করতে চান এবং nobodyস্পষ্টভাবে পরীক্ষা করতে চান তবে আপনি অলির উত্তরে এই পদ্ধতিটি ব্যবহার করতে পারেন । তবে আপনি বিবেচনা করতে ইচ্ছুক হতে পারেন, যদি খুব উচ্চ ইউআইডিওয়ালা ব্যবহারকারীদের সত্যই মানব হিসাবে ধরে নেওয়া উচিত, বা যদি তারা বিশেষভাবে কিছু অন্য-অ-মানব ব্যবহারকারী (যেমন nobody) হওয়ার সম্ভাবনা বেশি থাকে। অনুশীলনে এ জাতীয় ব্যবহারকারীরা - nobodyঅস্বাভাবিক কিছু ছাড়াও , তাই এটি আপনার পক্ষ থেকে রায় দেওয়া কল।
সম্ভাব্য সমঝোতা হ'ল ইউআইডি-র পরিসীমাতে ব্যবহারকারীদের তালিকাভুক্ত করা যা প্রকৃতপক্ষে সদ্য নির্মিত, অ-"সিস্টেম" ব্যবহারকারীদের দেওয়া হচ্ছে। আপনি এই পরীক্ষা করতে পারেন মধ্যেadduser.conf :
$ grep -E '^(FIRST|LAST)_UID' /etc/adduser.conf
FIRST_UID=1000
LAST_UID=29999
ব্যবহারকারীদের তালিকাভুক্ত করার দুটি উপায় এখানে রয়েছে যার ইউআইডি 1000 থেকে 29999 অবধি:
getent passwd | grep -oP '^[^:]+(?=:x:[12]?\d{4}:)'
getent passwd | awk -F: '999<$3 && $3<30000 {print $1}'
basenameএটি কুশ্রী। এর চেয়ে ভাল আর কিছু নয় ls। আমরা ls কে পার্স না করার মূল কারণটি হ'ল এটি এমন একটি কাজ যা অন্যান্য সরঞ্জাম দ্বারা আরও নিরাপদে এবং পরিষ্কারভাবে করা যায়, স্টাইল নয় । এই ক্ষেত্রে, শেল: cd /home; getent passwd *।
lsসাধারণত স্টাইল সম্পর্কে। "অসন্তুষ্টিজনক আউটপুট" সম্পর্কে ২ য় বুলেট পয়েন্ট বিষয়টি coveredেকে রেখেছে, তবে এটি পরবর্তী অংশে প্রদর্শিত হবে। আমি এই পরিস্থিতিতে পার্সিং কেন lsউপযুক্ত তা স্পষ্ট করে বলতে চেষ্টা করেছি । যদিও প্রায়শই একটি সাউন্ডার পদ্ধতির সূচক একটি ফর্ম গ্রহণ করুন, আমি পাঠকদের ডিরেক্টরিগুলির বিষয়বস্তুতে বিশ্বাস করতে না দেওয়ার জন্য, সত্যিকারের ব্যবহারকারীর সাথে সম্পর্কিত না হওয়া অদ্ভুত যুক্ত এন্ট্রি সহ এখনও কোনওরকম কীভাবে তার গাইড হিসাবে নির্ভর করা যেতে পারে? ব্যবহারকারীদের উপস্থিতি। cd /home; getent passwd */home
টিএল; ডিআর : কেবলমাত্র মানব ব্যবহারকারীদের সিস্টেমঅ্যাকউন্ট = মিথ্যা
আর একটি উপায় হ'ল মূল উপেক্ষা করার সময় আউটপুট তালিকাভুক্ত করা ls /var/lib/AccountsService/users/ | grep -v root। এখন, একটি গৌরব রয়েছে - জিডিএম, একটি গ্রিটার / লগইন স্ক্রিন (বা আরও আনুষ্ঠানিকভাবে ডেস্কটপ ম্যানেজার) এছাড়াও ব্যবহারকারী হিসাবে তালিকাভুক্ত। সুতরাং কেবল তালিকা থেকে আমরা বলতে পারছি না যে জিডিএম হ'ল মানব কিনা।
আরও কার্যকর এবং সঠিক পন্থা হ'ল সেই ফোল্ডারে থাকা ফাইলগুলির মধ্য দিয়ে যাওয়া এবং কোন ব্যবহারকারীদের তালিকাভুক্ত রয়েছে তা সন্ধান করা SystemAccount=false। ওয়ান-লাইনার বেলো এটি অর্জন করে
grep SystemAccount=false /var/lib/AccountsService/users/* | awk -F '/' '{gsub(":","/");print $6}'
mini.isoকোনও ডিসপ্লে ম্যানেজারের কাছ থেকে ইনস্টল করা এবং এক্স 11 ইনস্টল করা নেই), আমার একটি মানব ব্যবহারকারীর অ্যাকাউন্ট রয়েছে - তবুও /var/lib/AccountsService/usersখালি ডিরেক্টরি directory আমি আশা করি এটি একইভাবে বাক্সের উবুন্টু সার্ভার ইনস্টলেশনতে কাজ করবে না। তদ্ব্যতীত, যখন এটি কাজ করে, এটি কোনও ব্যবহারকারীর অ্যাকাউন্টকে "মানব" করে তোলে তার কিছুটা সীমাবদ্ধ ধারণার আওতায় এটি করে: একটি ব্যবহারকারী তৈরি করে useraddএমনকি এমনকি কোনও --system ফাইল তৈরি করে না AccountsService/users।
পার্টিতে যোগ দিয়ে, আমি এলডিএপি ব্যবহার করে একটি নেটওয়ার্ক সিস্টেমের তদারকি করি, /homeলক্ষ লক্ষ লোকের বাইরে হোম ডিরেক্টরি এবং ইউআইডি থাকে (স্ক্রিপ্টিং গ্লচের কারণে)। বর্তমানের উত্তরগুলির কোনওোটাই কাজ করে না। আমার জন্য যে পরীক্ষাটি কাজ করে তা পরীক্ষা করে দেখছে যে ব্যবহারকারীর বৈধ লগইন শেল রয়েছে কি না। একটি বৈধ শেল এমন একটি যা তালিকাভুক্ত রয়েছে /etc/shells। সহজতম ফর্ম:
getent passwd | grep -wFf /etc/shells
ফাইলটিতে মন্তব্য (বা খালি লাইন) থাকতে পারে, তাই তাদের এগুলি ফিল্টার করে দিতে হতে পারে:
getent passwd | grep -wFf <(grep '^/' /etc/shells)
root(যা সম্ভবত কোনও মানব ব্যবহারকারী হিসাবে বিবেচনা করা উচিত নয়, যেহেতু মানুষ সাধারণত তাদের নিয়মিত কাজের জন্য ব্যবহার না করে অস্থায়ীভাবে এবং নির্দিষ্ট উদ্দেশ্যে রুট হয়ে যায়), মনে হয় এটির ব্যর্থতার সম্ভাবনা সবচেয়ে কম। কোন বড় উপায়। (খনি সহ) অন্যান্য উত্তর পদ্ধতি, ব্যর্থ হতে পারে পদ্ধতির উপর নির্ভর করে, যদি বাড়িতে ডিরেক্টরি হয় না /home, অন্যান্য আবর্জনা হয় মধ্যে /home, UID অদ্ভুত, অথবা সিস্টেম একটি ডিএম ব্যবহার করে না। এই উত্তরটি সেই সমস্ত পরিস্থিতিতে খুব ভাল কাজ করে।
বুন্টু সিস্টেমে নিয়মিত ব্যবহারকারীদের (মানব ব্যবহারকারীরা, অর্থাৎ) ইউআইডি 1000 দিয়ে শুরু হয় যা তাদের অ্যাকাউন্টগুলি প্রথমবার তৈরি হওয়ার পরে তাদেরকে ক্রমান্বয়ে বরাদ্দ করা হয়। এই সমস্ত কিসের উত্থান ঘটে তা হ'ল বান্টু সিস্টেমে তৈরি করা প্রথম অ্যাকাউন্টটির ইউআইডি 1000 থাকে The পরবর্তী তৈরির একটি ইউআইডি 1001 থাকে And এবং আরও অনেক কিছু।
সুতরাং, আমার মতে সিস্টেমে উপস্থিত সমস্ত মানব ব্যবহারকারী অ্যাকাউন্টের তালিকাভুক্ত করার সহজতম উপায়টি যাচাই করা উচিত যে /etc/passwdফাইলটির তৃতীয় কলামটি যা ব্যবহারকারীর ইউআইডি ধারণ করে এটি 1000 এর চেয়ে বড় বা সমান এবং কম, 2000 বলে নেওয়া যাক, 2000 (সাধারণ ডেস্কটপ পিসির পক্ষে এক হাজারের বেশি ব্যবহারকারীর অ্যাকাউন্ট থাকা খুব সম্ভব নয়, আপনি কি তাই ভাবেন না?):
$ awk -F$':' '{ if ($3 >= 1000 && $3 < 2000) print $1; }' /etc/passwd
nobody। =)