আমি কীভাবে সমস্ত ব্যবহারকারীর নাম এবং / অথবা হোম ডিরেক্টরিগুলি তালিকাভুক্ত করতে পারি?


16

আমি মেশিনে সমস্ত ব্যবহারকারীর ডায়ার তালিকা করতে চাই s সাধারণত, আমি এটি করব:

ls -l /home

তবে আমি এটিকে এমন স্ক্রিপ্টে ব্যবহার করি যা অন্য মেশিনে স্থাপন করা হবে এবং সম্ভবত সেই মেশিনে তারা এটিকে বাড়িতে ডাকবে না (উদাঃ মাইহোম)। সুতরাং আমি এটি সাধারণ করতে চাই ls -l ~। তবে এটি কেবলমাত্র সমস্ত ব্যবহারকারীদের হোম ডায়ারের নামের পরিবর্তে আমার ব্যবহারকারীদের হোম ডায়ার তালিকাভুক্ত করে (মূলত আমি মেশিনে ব্যবহারকারীদের নামের একটি তালিকা পেতে চাই)। আমি কীভাবে এটি সাধারণ করতে পারি?


19
প্রকৃতপক্ষে, কোনও গ্যারান্টি নেই যে সমস্ত ব্যবহারকারীর হোম ডিরেক্টরিগুলি যে কোনও একটি ডিরেক্টরির উপ- ডিরেক্টরি।
hobbs

17
@ হবসগুলি বা ব্যবহারকারী এমনকি লগ ইন না হওয়া পর্যন্ত এগুলি বিদ্যমান রয়েছে। এটি আপাতদৃষ্টিতে সরল সমস্যাগুলির মধ্যে একটি যা সত্যিই দ্রুত জটিল হয়ে ওঠে।
আটবিটটনি

11
মনে রাখবেন যে ~সাধারণত হয় সমতুল্য /home/user, না /homeবা /home/*(যেটা আপনার উদ্দেশ্য কাছাকাছি হবে বলে মনে হচ্ছে)।
ইথান কামিনস্কি

2
@EightBitTony: ... কিংবা কোন নিশ্চয়তা home ডিরেক্টরিতে বিদ্যমান সব সময়ে । উদাহরণস্বরূপ, আমার উবুন্টু ইনস্টলে, বেশ কয়েকটি সিস্টেম ব্যবহারকারী (সহ nobody) তাদের হোম ডিরেক্টরি সেট করে রেখেছেন /nonexistent, যা সম্ভবত স্পষ্টভাবে বিদ্যমান নেই। (অবশ্যই, সেই ব্যবহারকারীদেরও তাদের পাসওয়ার্ড হ্যাশ সেট করা আছে *এবং তাদের শেলটি সেট করা আছে /usr/sbin/nologinবা /bin/false, যাতে তারা শুরু করতে সাধারণ অর্থে সত্যই লগ ইন করতে পারে না))
ইলমারি করোনেন

1
অন্যদিকে, একটি (পুরাতন স্কুল) এনএফএস সার্ভার ব্যবহারকারীদের জন্য হোম ডিরেক্টরি সরবরাহ করতে পারে যা তার ওএস থেকে নাম দ্বারা পরিচিত নয়।
রেক্যান্ডবোনম্যান

উত্তর:


45

অনেক সিস্টেম একটি আছে getentলিস্টে আদেশ বা বিষয়বস্তুর অনুসন্ধান নাম পরিষেবা মত ডাটাবেস passwd, group, services, protocols...

getent passwd | cut -d: -f6

ডাটাবেসে সমস্ত ব্যবহারকারীর হোম ডিরেক্টরি ( th ষ্ঠ কোলোন সীমাবদ্ধ ক্ষেত্র) তালিকাবদ্ধ করে

ব্যবহারকারীর নাম নিজেই প্রথম ক্ষেত্রে, তাই ব্যবহারকারীর নামের তালিকার জন্য:

getent passwd | cut -d: -f1

(মনে রাখবেন যে এর অর্থ এই নয় যে এই ব্যবহারকারীরা সিস্টেমে লগইন করতে পারেন বা তাদের হোম ডিরেক্টরি তৈরি করা হয়েছে, তবে তারা সিস্টেমে পরিচিত, তাদের কোনও ব্যবহারকারী আইডিতে অনুবাদ করা যেতে পারে)।

ডাটাবেসগুলির জন্য যা গণনা করা যায় না, আপনি পৃথকভাবে প্রতিটি সম্ভাব্য ব্যবহারকারী আইডি চেষ্টা করতে এবং জিজ্ঞাসা করতে পারেন:

getent passwd {0..65535} | cut -d: -f1,6

(এখানে ধরে নেওয়া হচ্ছে যে ইউডস 65535 এ থামবে (কিছু সিস্টেম আরও সমর্থন করে) এবং zsh এর সমর্থন করে এমন একটি শেল {x..y} ব্রেস সম্প্রসারণের ফর্মকে )। তবে আপনি এমন সিস্টেমে প্রায়শই করতে চান না যেখানে ব্যবহারকারী ডেটাবেস নেটওয়ার্কযুক্ত (এবং সেখানে স্থানীয় স্থানীয় ক্যাচিং সীমাবদ্ধ রয়েছে) যেমন এলডিএপি, এনআইএস +, এসকিউএল ... এতে প্রচুর নেটওয়ার্ক ট্র্যাফিক বোঝানো যায় (এবং ডিরেক্টরি সার্ভারে লোড হয়) ) এই সমস্ত প্রশ্ন করা।

এর অর্থ হ'ল যদি একই ইউআইড ভাগ করে নেওয়ার জন্য বেশ কয়েকটি ব্যবহারকারী থাকে তবে আপনি প্রতিটি ইউইডের জন্য কেবল একটি করে এন্ট্রি পাবেন, তাই অন্যকে মিস করুন।

আপনার যদি না থাকে তবে getentআপনি অবলম্বন করতে পারেন perl:

perl -le 'while (@e = getpwent) {print $e[7]}'

জন্য getent passwd( $e[0]ব্যবহারকারীর নাম জন্য), অথবা:

perl -le 'for ($i=0;$i<65536;++$i) {
  if (@e = getpwuid $i) {print $e[0] ": " $e[7]}}'

জন্য getent passwd {0..65535}একই সতর্কতা সঙ্গে ।

শেলগুলিতে, আপনি ~userহোম ডিরেক্টরি ডিরেক্টরি পেতে ব্যবহার করতে পারেন user, তবে বেশিরভাগ শেলগুলিতে, কেবলমাত্র ব্যবহারকারীর নামের সীমিত সেটগুলির জন্য কাজ করে (সেই ~সম্প্রসারণ অপারেটরের জন্য সমর্থিত ব্যবহারকারীর নামগুলিতে অনুমোদিত অক্ষরের তালিকা শেল থেকে শেল পর্যন্ত পরিবর্তিত হয়) এবং এর সাথে বেশ কয়েকটি শেল (সহ bash) ~$userকাজ করবে না ( evalযখন ব্যবহারকারীর নাম সেখানে একটি ভেরিয়েবলে সংরক্ষণ করা হয় তখন আপনাকে অবলম্বন করতে হবে)। এবং আপনাকে এখনও ব্যবহারকারীর নামের তালিকা পাওয়ার একটি উপায় খুঁজে বের করতে হবে।

কিছু শেল ব্যবহারকারীর নামের তালিকাটি পেতে অন্তর্নির্মিত সমর্থন করেছে।

  • bash: compgen -uগণনা করা যায় এমন ডাটাবেসে ব্যবহারকারীদের তালিকা ফিরিয়ে দেয়।
  • zsh: $userdirsঅ্যাসোসিয়েটিভ অ্যারে ব্যবহারকারীর নামগুলি তাদের ডিরেক্টরি ডিরেক্টরিতে ম্যাপ করে (এটি গণনা করা যায় এমন ডেটাবেসগুলির মধ্যেও সীমাবদ্ধ তবে আপনি যদি একটি ~userঅগণিত ডাটাবেসে থাকা কোনও ব্যবহারকারীর জন্য প্রসারণ করেন তবে একটি এন্ট্রি যুক্ত করা হবে $userdirs)। সুতরাং আপনি এটি করতে পারেন:

    printf '%s => %s\n' "${(kv@)userdirs}"

    তাদের হোম ডিরেক্টরি সহ ব্যবহারকারীদের তালিকা করতে।

    এটি কেবল তখনই কার্যকর zshহয় যখন ইন্টারেক্টিভ হয়

  • tcsh, fishএবং yashঅন্য তিনটি শেল যা ব্যবহারকারীর নাম (উদাহরণস্বরূপ যখন তর্কগুলি সম্পন্ন করার সময় ~<Tab>) সম্পূর্ণ করতে পারে তবে এটি মনে হয় না যে তারা আপনাকে ব্যবহারকারীর নামের তালিকাটি প্রোগ্রামগতভাবে পেতে দেয়।


ওপি'র জন্য চ্যালেঞ্জটি হবে কিনা তা জানা হবে getentযা আমি অনুমান করি যে কিছুটা তাদের 'মেশিনগুলির' ক্ষেত্রের উপর নির্ভর করে।
আটবিটটনি

1
@ আটবিটটনি, আমি একটি perlবিকল্প যুক্ত করেছি ।
স্টাফেন চেজেলাস

1
ম্যাকের ক্ষেত্রে এটি সম্ভবত উন্মুক্ত ডিরেক্টরি জড়িত।
সিলভার ওল্ফ - মনিকা

@ সিটুর্টেল, ম্যাকস-এ ভাল perl -le 'while (@e = getpwent) {print $e[7]}'কাজ করে।
স্টাফেন চেজেলাস

1
@ ফ্ল্লো, এগুলি ব্যবহারকারীর নাম। ইউনিক্স সিস্টেমে বেশিরভাগ ব্যবহারকারীরা বিশেষ সিস্টেম ব্যবহারকারী যাদের জীবন চলমান সিস্টেম পরিষেবাদিতে নিবেদিত। getent passwdআপনাকে ব্যবহারকারী ডাটাবেস দেখায়। প্রথম ক্ষেত্রটি হল ব্যবহারকারীর নাম, 6th ষ্ঠ ক্ষেত্রটি ব্যবহারকারীদের হোম ডিরেক্টরি।
স্টাফেন চেজেলাস

17

ব্যবহারকারীর হোম ডিরেক্টরি তালিকাভুক্ত করার একটি আরও ভাল উপায়, পার্স করা /etc/passwd সেগুলি এবং সেগুলি বের করা এবং তারা কোথায় রয়েছে সে সম্পর্কে কোনও অনুমান করা না।

এবং আপনার দ্বিতীয় মন্তব্যে বিচার করে আপনি প্রকৃতপক্ষে ব্যবহারকারীর নামগুলি চান, তাদের হোম ডিরেক্টরিগুলি নয়, সেক্ষেত্রে /etc/passwdযাইহোক, আরও ভাল পছন্দ। মনে রাখবেন যে কয়েকটি লিনাক্স / ইউএনআইএক্স মেশিনে অন্যান্য ব্যবহারকারীর প্রমাণীকরণ প্রক্রিয়া কনফিগার করা থাকবে (যেমন এলডিএপি), এবং পরিণামে, আপনার ক্যোয়ারীটি আপনি প্রথম কল্পনা করার চেয়ে জটিল, তবে /etc/passwdএটি শুরু করার জন্য ভাল জায়গা।


9
getentএটি সমর্থন করে এমন সিস্টেমেও দেখুন ।
কুসালানন্দ

6
হ্যাঁ, getentপার্সিংয়ের চেয়ে সর্বদা উত্তম /etc/passwd(এটি "অন্যান্য ব্যবহারকারীর প্রমাণীকরণ প্রক্রিয়া" সহ উদ্বেগকে সম্বোধন করে)।
স্টিফেন কিট

@ কুসালানন্দ একটি getentসমাধানের সমস্যা হ'ল এটি ধরে নেওয়া হয় যে তথ্য উত্সটি গণনা করা যায়, এবং কেবল কোনও নির্দিষ্ট মানের জন্য অনুসন্ধান করা হয় না। এটি স্টাফেন চ্যাজেলাস এই প্রশ্নের উত্তরটিতে বিস্তারিত , তবে আমি এই পৃষ্ঠায় যে কেউ স্কিমিং করে তার জন্য একটি মন্তব্য যুক্ত করব।
অ্যান্ড্রু হেনেল

7

সংক্ষিপ্ত উত্তর :

compgen -u

মাঝারি উত্তর : আপনি ব্যবহার করছেন যেহেতু bash, আপনার জন্য সব সম্ভব সম্পূর্ণকরণ তালিকাবদ্ধ করতে পারেন ~ব্যবহার compgen -A user। এটি এমন একটি সাধারণ ব্যবহার, এটি সংক্ষেপে বলা যেতে পারে compgen -u। শেলটি অন্তর্নির্মিত হিসাবে, compgenএর নিজস্ব ম্যান পৃষ্ঠা নেই। পরিবর্তে ডকুমেন্টেশনের জন্য বাশ (1) দেখুন এবং প্রোগ্রামেবল কমপ্লিশনে বিভাগটি পড়ুন

আরও পুঙ্খানুপুঙ্খ বিকল্প

আপনি যদি বহনযোগ্যতা সম্পর্কে অত্যন্ত উদ্বিগ্ন হন তবে আপনি থাকতে পারে এমন অন্যান্য মেশিনের উপরও নির্ভর করতে পারবেন না bash। সেক্ষেত্রে এটি করুন:

(getent passwd ||
    dscl . -ls /Users dsAttrTypeNative:homeDirectory || 
    nidump passwd  ||
    cat /etc/passwd) 2>/dev/null  |  cut -d: -f6

ব্যাখ্যা দীর্ঘ উত্তরটি সবকিছু চেষ্টা করে, তাই এটি কোনও নতুন /etc/nsswitch.conf (জিএনইউ / লিনাক্স এবং বিএসডি উভয়ই আসে getent) ব্যবহার করে না কেন, এটি ইউএনএক্স সিস্টেমের উপর কার্যকরভাবে কাজ করবে , ম্যাকোসের ডিরেক্টরি পরিষেবাদি¹ ( dscl) বা এমনকি পুরানো, বিড়াল-থিমযুক্ত ম্যাকওএস এক্স রিলিজ এবং NeXTSTEP ( nidump)।

সরলতা তবে কীভাবে আপনার পোর্টেবল দরকার? ইউনিক্সে বিভিন্ন জিনিস করার অনেকগুলি উপায় এবং কখনও কখনও সহজ উপায়ে থাকে। আপনার যদি একটি বাছাই করতে হয়, আমি getent passwd | cut -d: -f6শেল স্ক্রিপ্টগুলির জন্য সুপারিশ করব ²


পাদটীকা ¹: আমি কিছুটা সময় ম্যাকওএস ব্যবহার করি নি, তাই যদি কেউ আমার জন্য নিশ্চিত করতে পারেন যে আমি সিনট্যাক্সটি সঠিকভাবে পেয়েছি (এবং আউটপুটটিতে গোলমাল হবে এমন কোনও বিপথগামী কোলোন অন্তর্ভুক্ত নয় cut), এটি দুর্দান্ত। ধন্যবাদ।

পাদটীকা ²: আমি কী প্রস্তাব দিই এবং আমি কী করি তা ভিন্ন হতে পারে। ব্যক্তিগতভাবে, আমি প্রায়শই cut -d: -f1 /etc/passwdকমান্ড লাইনে প্রচলিত ব্যবহার করব । কয়েক দশক পুনরাবৃত্তি করার পরে, আমার মন অন্যান্য জিনিস নিয়ে কাজ করার সময় আমার আঙ্গুলগুলি এটিকে টাইপ করতে পারে।


2
সমস্ত ম্যাক ওএস এক্স মেশিনগুলি ব্যাশ রাখার গ্যারান্টিযুক্ত, এটি সিস্টেমের সাথে আসে। (আস zsh এবং একাধিক অন্যান্য শাঁস থাকে।)
SilverWolf - পুনর্বহাল মনিকা

সত্যই যথেষ্ট, তবে আমি যখন ম্যাকওএস ব্যবহার করছিলাম তখন অ্যাপল দীর্ঘ সময় ব্যাশ আপডেট করেনি এবং এটি কিছুটা ক্রাস্ট ভার্সন 3 জিনিস যা আমাকে সর্বদা প্রতিস্থাপন করতে হয়েছিল। অ্যাপল কি ব্যাশ আপডেট করার বিষয়ে আরও ভাল কাজ করেছে?
hackerb9


সত্য, এটি সম্পর্কে ভাবেনি। আমার বাশের সংস্করণ (ম্যাকোস সিয়েরা 10.12.6) হল 3.2.57। (:
সিলভার ওল্ফ - মনিকা

যাই হোক, bashছিল compgen -uযেহেতু 2.04 2000 সালে মুক্তি
Stéphane Chazelas

2

কি হবে ls -l ~/..? এটি আপনার হোম ডিরেক্টরিতে পিতামাতার সমস্ত ডিরেক্টরি তালিকাভুক্ত করে।


4
এটি কেবলমাত্র সেই সমস্ত সিস্টেমে কাজ করে যেখানে সমস্ত হোম ডিরেক্টরিগুলি একই ডিরেক্টরিতে ভিত্তিক হয়, যা অনেকগুলি নয় (আপনি /homeলিনাক্স সিস্টেমে সাধারণ মনে হতে পারেন তবে আপনি যখন এটি চালাবেন তখন কী ঘটে root?)। হোম ডিরেক্টরি ডিরেক্টরি তালিকাভুক্তি একটি পূর্ণ অ্যাডভেঞ্চার আপনি যদি আপনি যে সমস্ত ক্ষেত্রে আসতে পারেন সম্ভবত পরিচালনা করতে চান, বিশদটির জন্য অন্যান্য উত্তর দেখুন।
স্টিফেন কিট

7
এটি এখনও যুক্তিযুক্ত একমাত্র উত্তর যা ওপির অনুভূত সমস্যার সরাসরি উত্তর দেয় । তবে এটি ওপির অন্তর্নিহিত সমস্যার উত্তর দেয় না ।
পাইপ

1
এই উত্তরের মানটি এটি কী কী মিস করে তা বোঝার মধ্যে রয়েছে এবং কেন এটি অন্যান্য উচ্চ-ভোট প্রাপ্ত উত্তরের মতো ভাল নয়।
ক্রিগগি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.