java - وعيوب - نظام الملفات في نظم التشغيل




كيفية العثور على الدليل الرئيسي للمستخدم على لينكس أو يونيكس؟ (9)

أفترض أنك تريد العثور على الدليل الرئيسي للمستخدم مختلف. من الواضح أن الحصول على خاصية "user.home" سيكون أسهل طريقة للحصول على الدليل الرئيسي للمستخدم الحالي.

للحصول على دليل المستخدم التعسفي الرئيسي ، فإنه يأخذ قليلاً من الجودة مع سطر الأوامر:

String[] command = {"/bin/sh", "-c", "echo ~root"}; //substitute desired username
Process outsideProcess = rt.exec(command);
outsideProcess.waitFor();
String tempResult;
StringBuilder sb = new StringBuilder();
while((tempResult = br.readLine()) != null) sb.append(tempResult);
br.close();
return sb.toString().trim();

الآن من الناحية الفنية ، يجب أن يكون لدينا مؤشر ترابط ينتظر على stdout و stderr بحيث لا تملأ المخازن المؤقتة وتغلق العملية ، لكنني آمل بالتأكيد أن المخزن المؤقت يمكنه على الأقل الاحتفاظ باسم مستخدم واحد. أيضا ، قد ترغب في التحقق من النتيجة لمعرفة ما إذا كانت تبدأ بـ root (أو أي اسم مستخدم استخدمته) فقط للتأكد من أن المستخدم موجود وأنه تم تقييمه بشكل صحيح.

امل ان يساعد. صوّت لهذه الإجابة إذا فعلت ذلك لأنني جديد في المساهمة في SO ويمكن استخدام النقاط.

كيف يمكنني العثور على الدليل الرئيسي لمستخدم تعسفي من داخل Grails؟ على نظام التشغيل Linux ، غالبًا ما يكون / المنزل / المستخدم. ومع ذلك ، في بعض أنظمة التشغيل ، مثل OpenSolaris على سبيل المثال ، المسار هو / export / home / user.


إذا كنت تحاول القيام بذلك من أجل اسم مستخدم لا يمكنك الحصول على رمز ثابت ، فقد يكون الأمر صعباً. بالتأكيد echo ~rbronosky سوف اقول لكم الطريق إلى /home/rbronosky ، ولكن ماذا لو rbronosky هو في متغير؟ إذا كنت تفعل name=rbronosky; echo ~$name name=rbronosky; echo ~$name تحصل على ~rbronosky

هنا حالة العالم الحقيقي والحل:

لديك برنامج نصي يجب على المستخدم تشغيله عبر sudo . يجب على البرنامج النصي الوصول إلى المجلد الرئيسي للمستخدم. لا يمكنك الرجوع إلى ~/.ssh وإلا فسيتم توسيعه إلى /root/.ssh . بدلا من ذلك عليك:

# Up near the top of your script add
export HOME=$(bash <<< "echo ~$SUDO_USER")
# Then you can use $HOME like you would expect
cat rsa_key.pub >> $HOME/.ssh/authorized_keys

جمال ذلك هو أنه إذا لم يتم تشغيل البرنامج النصي كما sudo ثم $ SUDO_USER فارغ ، لذلك هو في الأساس نفس الشيء مثل فعل "صدى ~". ما زال يعمل كما تتوقع.

إذا استخدمت set -o nounset ، والذي يجب أن تستخدمه ، فأنت تريد إجراء التصدير قبل ذلك.


العثور على غلاف جافا ل getpwuid/getpwnam(3) ، يطلبون من النظام لمعلومات المستخدم عن طريق uid أو عن طريق اسم الدخول ويمكنك الحصول على جميع المعلومات بما في ذلك الدليل الرئيسي الافتراضي.


جرب هذا على جافا:

System.out.println("OS: " + System.getProperty("os.name") + ", USER DIRECTORY: " + System.getProperty("user.home"));

عادة ما تستخدم البيان

String userHome = System.getProperty( "user.home" );

للحصول على الدليل الرئيسي للمستخدم على أي نظام أساسي. راجع وثائق الطريقة الخاصة بـ getProperty لمعرفة ما الذي يمكنك الحصول عليه أيضًا.

قد يكون هناك مشاكل في الوصول قد ترغب في تجنبها باستخدام this الحل البديل (استخدام ملف سياسة الأمان)


للعثور على الدليل الرئيسي للمستخدم FOO على نظام UNIX-ish ، استخدم ~FOO . للمستخدم الحالي ، استخدم ~ .


يمكن أن تكون بادئة userdir (على سبيل المثال ، '/ home' أو '/ export / home') عنصر تكوين. بعد ذلك يمكن للتطبيق إلحاق اسم المستخدم التعسفي بهذا المسار.

التحذير: هذا لا يتفاعل بذكاء مع نظام التشغيل ، لذلك لن يكون لديك الحظ إذا كان نظام ويندوز مع مستخدمين على محركات مختلفة ، أو على يونكس مع تخطيط المنزل مثل / المنزل / و / فو ، / المنزل / ب / بار.


يمكنك استخدام متغير البيئة $HOME لذلك.


بالنسبة لأنظمة UNIX-Like ، قد ترغب في تنفيذ " echo ~username " باستخدام shell (لذا استخدم Runtime.exec() لتشغيل {"/bin/sh", "-c", "echo ~username"} ).





grails