আমার সুডোর সুবিধাগুলির সময়সীমা বেঁধে গেছে কিনা তা আমি কীভাবে খুঁজে পাব?


20

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

আমি কীভাবে তা যাচাই করব? মনে রাখবেন যে $(id -u)সুডো হিসাবে চলার পরেও আমার বর্তমান ব্যবহারকারী আইডি ফিরিয়ে দেবে যাতে এটি 0 এর সাথে মিলে যাচাই করা যায় না ...

আমার এমন একটি পদ্ধতি দরকার যা চুপ করে চেক করতে পারে।

উত্তর:


28

-nআপনার এখনও সুবিধা রয়েছে কিনা তা যাচাই করতে বিকল্পটি ব্যবহার করুন ; থেকে man sudo:

-n , --non- ইন্টারেক্টিভ

কোনও ধরণের ইনপুট দেওয়ার জন্য ব্যবহারকারীকে অনুরোধ করা থেকে বিরত থাকুন। কমান্ডটি চালানোর জন্য যদি কোনও পাসওয়ার্ডের প্রয়োজন হয়, sudo একটি ত্রুটি বার্তা প্রদর্শন করবে এবং প্রস্থান করবে।

উদাহরণ স্বরূপ,

sudo -n true 2>/dev/null && echo Privileges active || echo Privileges inactive

সচেতন হন যে সুবিধাগুলি পরীক্ষা করা sudo -n trueএবং আসলে সেগুলি ব্যবহারের মধ্যেই মেয়াদ শেষ হওয়া সম্ভব । আপনি sudo -n command...কোনও বার্তা প্রদর্শন এবং ব্যর্থতার ক্ষেত্রে সরাসরি চেষ্টা করতে চাইতে পারেন এবং সম্ভবত sudoইন্টারেক্টিভভাবে চলতে চেষ্টা করুন ।

সম্পাদনা করুন: নীচেও রুখের মন্তব্য দেখুন।


আপনাকে ধন্যবাদ আমি এর আগেও এরকম কিছু চেষ্টা করেছি কিন্তু আমি যেভাবে চাই তার কাজ করতে পারিনি to
টনিমোরেলো

3
পুনরায়: "সচেতন থাকুন যে এটিগুলির সাথে পরীক্ষা sudo -n trueকরে প্রকৃতপক্ষে সেগুলি ব্যবহারের মধ্যে বিশেষাধিকারের মেয়াদ শেষ হওয়া সম্ভব ": ডকুমেন্টেশনটি এই বিষয়টিতে কিছুটা অস্পষ্ট, তবে আমি মনে করি যে একটি sudoকমান্ড চালানো এমনকি ঠিক sudo -n trueসময়সীমা নির্ধারণ করবে ঘড়ি। যেভাবেই হোক না কেন, -vস্পষ্টভাবে এটি করা হিসাবে নথিভুক্ত করা sudo -n -vহয় এবং sudo -n trueযাইহোক যাইহোক এই উদ্দেশ্যেটির চেয়ে সম্ভবত আরও উপযুক্ত ।
রুখ

যদিও এটি সত্যই নিঃশব্দ থাকবে, তবুও যদি কোনও সুযোগ না থাকে তবে এটি সিস্টেম জার্নালে ত্রুটিটি লগ করবে hostname sudo[8870]: username : a password is required ; TTY=pts/0 ; PWD=/home/username ; USER=root ; COMMAND=/usr/bin/true। উদাহরণস্বরূপ, আপনি যদি এটি ব্যাশ প্রম্পটে ব্যবহার করেন তবে এর ফলে প্রচুর ত্রুটি বার্তা আসবে।
রোগাচ

এবং যদি সুবিধাগুলি থাকে তবে পাম_উনিক্স এবং sudo কমান্ড প্রয়োগ থেকে ডিবাগ লগিং করা হবে।
রোগাচ

8

চালান:

sudo -nv

যদি আপনার সুডোর সুবিধাগুলির সময়সীমা শেষ হয়ে যায় তবে এটি 1 এবং আউটপুট এর প্রস্থান কোড সহ প্রস্থান করবে:

sudo: a password is required

আপনার বৈধ ক্যাশে শংসাপত্রাদি থাকলে, এই আদেশটি সফল হবে এবং কিছুই আউটপুট করবে।

সুতরাং, এগুলি একসাথে রাখার জন্য, এখানে একটি স্ক্রিপ্টলেট রয়েছে যা আপনার বৈধ ক্যাশেড শংসাপত্রগুলি নিঃশব্দে পরীক্ষা করবে :

if sudo -nv 2>/dev/null; then
  echo "no sudo password required"
else
  echo "sudo password expired"
fi

উল্লিখিত অন্যান্য উত্তর / মন্তব্যের হিসাবে, -vক্যাড শংসাপত্রগুলি উত্পন্ন করার জন্য যদি প্রমাণীকরণের জন্য অন্য কোনও অনুরোধ থাকে তবে বিকল্পভাবে ("বৈধতা দিন") ক্যাশে শংসাপত্রগুলি পুনর্নবীকরণ করে এবং -nবিকল্পটি ("অ-ইন্টারেক্টিভ") সুডো উত্পাদন থেকে বাধা দেয় কোনও ইন্টারেক্টিভ প্রম্পট যেমন প্রমাণীকরণের প্রম্পট।


এটি একটি ভাল সমাধান ... আমি আগে এটি চেষ্টা করেছিলাম তবে আলেকসপির উত্তরটি আমার যা প্রয়োজন ঠিক তা করেছে ... আমি মনে করি এর আগে -n পরামিতিটি আমি ভুল
বুঝেছিলাম

1

sudo -nvসূক্ষ্মভাবে কাজ করে, তবে সুডো ত্রুটি এবং পাম প্রমাণীকরণ তথ্য সহ সিস্টেম লগগুলিকে দূষিত করে। আমার বাশ প্রম্পটের জন্য আমার sudo সুবিধাগুলি পরীক্ষা করা দরকার, তাই এটি প্রায়শই সম্পাদন করা হয়েছিল এবং আমার লগগুলিতে প্রায় এই গোলমালটিই অন্তর্ভুক্ত ছিল।

সুডো টাইমস্ট্যাম্প ফাইলটি সরাসরি পার্স করা সম্ভব - আমি এটির জন্য একটি ছোট সি ব্যবহার লিখেছিলাম:

/* compile and set permissions: */
/* $ gcc checksudo.c -o checksudo -std=gnu99 -O2 */
/* $ chown root:root checksudo */
/* $ chmod +s checksudo */

#define USERNAME "replace-with-your-username"
#define TIMEOUT 5

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <time.h>

void timespec_diff(struct timespec *start, struct timespec *stop, struct timespec *result) {
    if ((stop->tv_nsec - start->tv_nsec) < 0) {
        result->tv_sec = stop->tv_sec - start->tv_sec - 1;
        result->tv_nsec = stop->tv_nsec - start->tv_nsec + 1000000000;
    } else {
        result->tv_sec = stop->tv_sec - start->tv_sec;
        result->tv_nsec = stop->tv_nsec - start->tv_nsec;
    }
    return;
}

int main(int argc, char** argv) {
  if (geteuid() != 0) {
    printf("uid is not 0 - checksudo must be owned by uid 0 and have the setuid bit set\n");
    return 2;
  }

  struct timespec current_time;
  if (clock_gettime(CLOCK_BOOTTIME, &current_time) != 0) {
    printf("Unable to get current time: %s\n", strerror(errno));
    return 2;
  }

  struct stat ttypath_stat;
  if (stat(ttyname(0), &ttypath_stat) != 0) {
    printf("Unable to stat current tty: %s\n", strerror(errno));
    return 2;
  }

  FILE* timestamp_fd = fopen("/var/run/sudo/ts/" USERNAME, "rb");
  if (timestamp_fd == NULL) {
    printf("Unable to open sudo timestamp file: %s\n", strerror(errno));
    return 2;
  }

  long offset = 0;
  int found = 0;

  while (1) {
    if (fseek(timestamp_fd, offset, SEEK_SET) != 0) {
      printf("Failed to seek timestamp file: %s\n", strerror(errno));
      return 2;
    }
    unsigned short timestamp_entry_header[4];
    if (feof(timestamp_fd)) {
      printf("matching timestamp not found\n");
      return 2;
    }
    if (fread(&timestamp_entry_header, sizeof(unsigned short), 4, timestamp_fd) < 4) {
      break;
    }
    if (ferror(timestamp_fd)) {
      printf("IO error when reading timestamp file\n");
      return 2;
    }

    // read tty device id
    if (timestamp_entry_header[2] == 2 && timestamp_entry_header[3] == 0) {
      if (fseek(timestamp_fd, offset + 32, SEEK_SET) != 0) {
        printf("Failed to seek timestamp file: %s\n", strerror(errno));
        return 2;
      }
      dev_t tty_dev_id;
      if (fread(&tty_dev_id, sizeof(dev_t), 1, timestamp_fd) < 1) {
        printf("EOF when reading tty device id\n");
        return 2;
      }
      if (tty_dev_id == ttypath_stat.st_rdev) {
        // read timestamp
        if (fseek(timestamp_fd, offset + 16, SEEK_SET) != 0) {
          printf("Failed to seek timestamp file: %s\n", strerror(errno));
          return 2;
        }
        struct timespec sudo_time;
        if (fread(&sudo_time, sizeof(struct timespec), 1, timestamp_fd) < 1) {
          printf("EOF when reading timestamp\n");
          return 2;
        }

        struct timespec time_since_sudo;
        timespec_diff(&sudo_time, &current_time, &time_since_sudo);
        found = time_since_sudo.tv_sec < TIMEOUT * 60;
        break;
      }
    }

    offset += timestamp_entry_header[1];
  }

  fclose(timestamp_fd);

  return !found;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.