سؤال كيفية التحقق مما إذا كان لدي sudo الوصول؟


لقد وقعت مؤخرا في مشكلة بسبب هذا.

$sudo vim /etc/motd 
[sudo] password for bruce: 
bruce is not in the sudoers file.  This incident will be reported.

هل هناك طريقة للتحقق مما إذا كان لدي sudo الوصول أم لا؟


83
2018-02-18 19:36


الأصل


اسأل مسؤول النظام الخاص بك؟ - mdpc
mdpc: هل هناك طريقة أخرى بجانب ذلك؟ - Bruce
لم تذكر ما إذا كان بإمكانك الوصول إلى الجذر أم لا. - mdpc
هذا يجب أن يكون أول مثيل رؤية شخص ما يتابع "سيتم الإبلاغ عن هذا الحادث". - slhck


الأجوبة:


يركض sudo -v. يتم استخدامه عادة لتمديد مهلة كلمة المرور الخاصة بك ، ولكن يمكن استخدامها لتحديد ما إذا كان لديك أي sudo الامتيازات.

$ sudo -v
Sorry, user [username] may not run sudo on [hostname].

مقتطفات الصفحة رجل:

إذا تم منح الخيار suv (التحقق) ، فستقوم sudo بتحديث الطابع الزمني للمستخدم ، مما يؤدي إلى طلب كلمة مرور المستخدم إذا لزم الأمر. يؤدي ذلك إلى تمديد مهلة sudo لـ 5 دقائق أخرى (أو أيًا ما يتم تعيين المهلة إلى sudoers) ولكن لا يقوم بتشغيل الأمر.

إذا تم السماح للمستخدم الخاص بك فقط لتشغيل محدد الأوامر ، سيعمل هذا الأمر ، مشيرًا إلى أنه مسموح لك بالتشغيل شيئا ما مع امتيازات مختلفة. بينما تبدو الرسالة مختلفة عند محاولة تنفيذ أمر غير مسموح لك في هذه الحالة (و يتم إرسال أي بريد إلى الجذر) ، لا يزال من الممكن أن تقع في المشاكل إذا قرأ المدراء /var/log/secure.

$ sudo ls
[sudo] password for [username]: 
Sorry, user [username] is not allowed to execute '/bin/ls' as root on [hostname].

تجده في الخارج ماذا يسمح لك بتشغيل مع امتيازات مختلفة ، يمكنك استخدامها sudo -l. لاحظ أن هذا الأمر يتطلب منك إدخال كلمة المرور الخاصة بك.


102
2018-02-18 19:51



شكر. sudo -v يعمل بالنسبة لي. تقول صفحة الرجل بإمكاني تشغيل sudo -l أيضًا ولكن هذا يسأل عن كلمة مرور. لماذا هذا؟ - Bruce
Bruce أنا أظن أنك هنا ، ولكن بخلاف ذلك ، يستطيع شخص ما (أو برنامج تقوم بتشغيله) معرفة البرامج التي يمكن تنفيذها (ربما بدون إدخال كلمة المرور) من قبل مستخدمك الحالي ومحاولة استخدام تلك المعلومات بشكل ضار. - Daniel Beck♦
ماذا تفترض أنه يعني عندما أحصل على هذا: patrick@<host>:~$ sudo -v sudo: unable to resolve host <host>؟ لقد أدخلت كلمة المرور الخاصة بي ولم أحصل على أي شيء عن غير مصرح به. وأنا أعلم أنني لدي sudo من تشغيل أوامر أخرى بنجاح ، لكن ذلك unable to resolve host رسالة لي قد تشعر بالقلق شيء آخر قد يكون غير تقليدي على المضيف. - Patrick M
@ PatrickM يبدو وكأنه مشكلة مع sudoers ملف. في هذا المكان ، يمكنك تحديد المضيف الذي يُسمح للمستخدم بتشغيل أمر معين (وهذا مفيد عند استخدام نفس الأمر sudoers ملف على أجهزة متعددة). ربما لم يتم حل اسم المضيف المحدد في هذا الملف. حاول التحقق من ذلك مع host الأمر على سبيل المثال. - Ale
لا يعمل بالنسبة لي على RHEL 6 ، sudo -v أعطى "xx ليس في ملف sudoers. سيتم الإبلاغ عن هذا الحادث." - 79E09796


هذا بسيط جدا. يركض sudo -l. هذا سوف قائمة أي امتيازات sudo لديك.


38
2017-12-17 22:55



ربما انخفضت بشدة لأنها تكرر ما قاله دانييل بيك قبل نحو عامين. - G-Man
أو يفسر ما يحدث ، إنه تعليق ، في أحسن الأحوال - Ramhound
@ جوناثان: إذا كان البرنامج النصي في أوبونتو الأبجدية الآن ، sudo -l يسأل عن كلمة مرور إذا كان يمكنك sudo أم لا. sudo -v يسأل فقط إذا كان يمكنك ، و "$(whoami)" != "root" لن تسأل أي شيء في أي لينكس. - bksunday
bksunday أنت على صواب. لقد اختبرت الآن على ديبيان جيسي نظيفة وأكدت نتائجك. ربما كان تعليقي السابق (المحذوف الآن) نتيجة اختبار على جهاز كان لدي بعض منه sudo privs. - Jonathan Ben-Avraham
@ G-Man ولكن هذه الإجابة البسيطة ساعدتني أكثر من إجابة دانييل على وجه الدقة أكثر ، حيث أن هذا الأمر هو النهاية البائسة ... - Betlista


هنا هو الإصدار الصديق للبرنامج النصي:

timeout 2 sudo id && echo Access granted || echo Access denied

نظرًا لعدم توقفها عن إدخال كلمة المرور إذا لم يكن لديك sudo التمكن من.

يمكنك أيضًا تعيينها في متغير مثل:

timeout 2 sudo id && sudo="true" || sudo="no"
echo "$sudo"

ملاحظة: في نظام macOS ، تحتاج إلى التثبيت coreutilsعلى سبيل المثال brew install coreutils.


6
2018-06-14 00:49



أي بدائل لأين timeout غير متاح بشكل افتراضي ، على سبيل المثال ، على OS X؟ - Harry
تحتاج إلى تثبيت coreutilsعلى سبيل المثال brew install coreutils. - kenorb
هذا لا يعمل بالنسبة لي في البرنامج النصي. لسبب غير المبرر تعليق البرنامج النصي حتى أقتله. - beruic


لي، 'sudo -v"و"sudo -l"لم يعمل في برنامج نصي لأنه في بعض الأحيان تفاعلي (يسألني عن كلمة مرور ، كما هو مذكور أعلاه). 'sudo -n -l"لم تنجح أيضا ، أعطت رمز الخروج" 1 "على الرغم من أن لدي أذونات sudo ، بسبب كلمة المرور المفقودة. لكن تمديد الأمر إلى:

A=$(sudo -n -v 2>&1);test -z "$A" || echo $A|grep -q asswor

كان ناجحا بالنسبة لي للنص. هذا التعبير يعطي 0 إذا كان المستخدم الحالي يمكنه الاتصال بـ "sudo" و 1 ان لم.

تفسير:
المعلمة الإضافية -n إلى sudo يمنع التفاعل.
الإخراج $A من الأمر "sudo -n -v 2>&1' يمكن:
 - فارغ (في هذه الحالة ، يمكن استدعاء sudo من قبل المستخدم الحالي) ، أو:
 - ملاحظة أن المستخدم الحالي غير مصرح له بالسودو ، أو:
 - نص سؤال لكلمة المرور (في هذه الحالة ، يتم تفويض المستخدم).
("سوف يتناسب" Asswor مع "كلمة المرور" بالإنجليزية بالإضافة إلى "Passwort" باللغة الألمانية).


1
2018-02-28 02:27





لقد حصلت على رتبة منخفضة للتصويت والتعليق ، ولكني أردت أن أجيب على إجابة جيرالد شادي ، كما وجدت أن الطريقة الوحيدة سابقا ، ويعتقد أن لا أحد يعرف ذلك - سمسم الآن: D

راجع للشغل حلا:

[[ "$(whereis sudo)" == *'/'* && "$(sudo -nv 2>&1)" != 'Sorry, user'* ]]

(من نهاية 2015 mwhahaaa)


1
2017-10-01 22:31



اقرأ "لماذا أحتاج إلى 50 سمعة للتعليق" لضمان فهمك لكيفية بدء التعليق. - Pimp Juice IT


إجابة جيرالد شادي هنا، لا يزال من الممكن تحسينها!

استعمال

prompt=$(sudo -nv 2>&1)
if [ $? -eq 0 ]; then
  # exit code of sudo-command is 0
  echo "has_sudo__pass_set"
elif echo $prompt | grep -q '^sudo:'; then
  echo "has_sudo__needs_pass"
else
  echo "no_sudo"
fi

هنا مثال كامل للاستخدام في البرنامج النصي:

#!/usr/bin/env bash

is_root () {
    return $(id -u)
}

has_sudo() {
    local prompt

    prompt=$(sudo -nv 2>&1)
    if [ $? -eq 0 ]; then
    echo "has_sudo__pass_set"
    elif echo $prompt | grep -q '^sudo:'; then
    echo "has_sudo__needs_pass"
    else
    echo "no_sudo"
    fi
}

elevate_cmd () {
    local cmd=$@

    HAS_SUDO=$(has_sudo)

    case "$HAS_SUDO" in
    has_sudo__pass_set)
        sudo $cmd
        ;;
    has_sudo__needs_pass)
        echo "Please supply sudo password for the following command: sudo $cmd"
        sudo $cmd
        ;;
    *)
        echo "Please supply root password for the following command: su -c \"$cmd\""
        su -c "$cmd"
        ;;
    esac
}

if is_root; then
    echo "Error: need to call this script as a normal user, not as root!"
    exit 1
fi


elevate_cmd which adduser

1
2017-12-30 18:57



النصي الأول ساعدني ، شكرا! - JRichardsz


"وصول سودو" يأتي في النكهات. اثنين من النكهات الأساسية: أولا أنت ، أو مجموعة عضو لديك ، تحتاج إلى الإعداد للحصول على sudo الوصول في الملف / etc / sudoers.

ثانيًا ، تحتاج إلى معرفة كلمة المرور الخاصة بك ، أو تحتاج إلى إجراء أمر sudo مؤخرًا. مؤخرًا بما فيه الكفاية أن المهلة لم تنته مدة صلاحيتها. (حقيقة ممتعة: يمكنك قضاء وقت طويل في ملف sudoer الخاص بك.)

غالبًا ما أرغب في اختبار النوع الثاني من الوصول في مقدمة البرنامج النصي الذي سيحتاج إلى إلغاء بعض الخطوات. عندما يفشل هذا التحقق يمكنني إعلام المستخدم الذي يحتاج إليه لتمكين نوع الوصول الثاني قبل تشغيل البرنامج النصي.

bash-3.2$ if sudo -S -p '' echo -n < /dev/null 2> /dev/null ; then echo 'Sudo is enabled.' ; else echo 'Sudo is not enabled' ; fi
Sudo is enabled.
bash-3.2$ sudo -K
bash-3.2$ if sudo -S -p '' echo -n < /dev/null 2> /dev/null ; then echo 'Sudo is enabled.' ; else echo 'Sudo is not enabled' ; fi
Sudo is not enabled

و- S يقول sudo لقراءة كلمة المرور من stdin. يعيّن -p مطالبة فارغة. يمحو -K المرة الثانية من الوصول.

نظرًا لأنه يرسل stderr إلى / dev / null ، فإنه سيتحقق أيضًا مما إذا كان المستخدم لديه النوع الأول من الوصول sudo.


1
2017-08-30 17:58





إتبع هؤلاء خطوات لعرض ملف sudoers. إذا كنت هناك ، لديك سودو. إذا لم يكن كذلك ، يمكنك إضافة نفسك.

  1. su
  2. visudo
  3. الجزء السفلي من الملف ، أدخل your_username_here ALL=(ALL) ALL
  4. نجاح زر ESC فى الكيبورد واكتب :wq
  5. نوع exit
  6. أعد تشغيل الأمر الذي تحتاجه sudo
  7. أدخل كلمة المرور الخاصة بك (وليس كلمة مرور الجذر)

-3
2018-02-18 19:41



البروتوكول الاختياري "وقع في مشكلة" لتشغيله sudo، ربما هو ليس كذلك ال مسؤول النظام ، ولا حتى واحد من مديري النظام النخبة. ربما كان مجرد مستخدم يعتقد أنه ربما تم منحه بعض الصلاحيات المحدودة. ما الذي يجعلك تشك أنه يستطيع الذهاب su؟ - Scott