সমাধানের জন্য pam_unix
পাসওয়ার্ডের মেয়াদ শেষ হওয়ার, সম্পাদনা /etc/shadow
। এটির ফর্ম্যাট [কোলন বিচ্ছিন্ন ক্ষেত্র] রয়েছে:
username:passwd:number_of_days_since_pw_changed:...
এবং 3 য় ক্ষেত্রটি শূন্যে সেট করুন।
pam_lastlog
এটি ঠিক করার জন্য এটি কিছুটা কুরুচিপূর্ণ। নিয়ন্ত্রণ ফাইল হয় /var/log/lastlog
। এটি একটি সঙ্কোচিত এবং / অথবা বাইনারি বিন্যাস ফাইল।
এটি ইউটিলিটি দিয়ে দেখা যেতে পারে lastlog
। তবে [এএএফআইসিটি] ইউটিলিটি স্বতন্ত্র প্রবেশের পরিবর্তনের কোনও প্রক্রিয়া সরবরাহ করে না।
মনে হচ্ছে প্রস্তাবিত পদ্ধতিটি ফাইলটি বাতিল করা। এটি এটি সমস্ত ব্যবহারকারীর জন্য পরিবর্তিত হলেও এটি পাসডাব্লুডের মেয়াদোত্তীর্ণ পরিবর্তনের চেয়ে কম গুরুতর। অনুমতিগুলি cp /dev/null /var/log/lastlog
বিরক্ত না করে এটি করবে thisselinux
usermod
উপযোগ হবে একটি তথ্য রিসেট একক ব্যবহারকারী কিন্তু শুধুমাত্র ব্যবহার যখন -u
বিকল্প ব্যবহারকারীর ইউআইডি পরিবর্তন। সম্ভবত, এর সাথে একত্রে ব্যবহৃত -o
:
usermod -o -u <current_uid_of_user> <username>
সবচেয়ে খারাপভাবে, এটি দুটি কমান্ডে করুন, প্রথমে ইউডকে নতুন অনন্য ইউডে সেট করুন, তারপরে আবার পুরানোটিতে সেট করুন। উদাহরণস্বরূপ, যদি ব্যবহারকারীর ইউআইডি 5001 ছিলেন এবং সেখানে কোন ব্যবহারে ইউআইডি 5500, একটি করুন:
usermod -u 5500 fred
usermod -u 5001 fred
আপনি যদি সত্যিই বেশিরভাগ তথ্য সংরক্ষণ করতে চান /var/log/lastlog
এবং উপরের কাজটি না করে, shadow-utils
উত্স প্যাকেজটির এটি করার একটি উপায় আছে ...
ইউজারড থেকে উত্স স্নিপেট এখানে:
static void lastlog_reset (uid_t uid)
{
struct lastlog ll;
int fd;
off_t offset_uid = (off_t) (sizeof ll) * uid;
if (access (LASTLOG_FILE, F_OK) != 0) {
return;
}
memzero (&ll, sizeof (ll));
fd = open (LASTLOG_FILE, O_RDWR);
if ( (-1 == fd)
|| (lseek (fd, offset_uid, SEEK_SET) != offset_uid)
|| (write (fd, &ll, sizeof (ll)) != (ssize_t) sizeof (ll))
|| (fsync (fd) != 0)
|| (close (fd) != 0)) {
fprintf (stderr,
_("%s: failed to reset the lastlog entry of UID %lu: %s\n"),
Prog, (unsigned long) uid, strerror (errno));
SYSLOG ((LOG_WARN, "failed to reset the lastlog entry of UID %lu", (unsigned long) uid));
/* continue */
}
}
এখানে ব্যবহারকারী মডেলের একটি স্নিপেট রয়েছে:
/*
* update_lastlog - update the lastlog file
*
* Relocate the "lastlog" entries for the user. The old entry is
* left alone in case the UID was shared. It doesn't hurt anything
* to just leave it be.
*/
static void update_lastlog (void)
{
struct lastlog ll;
int fd;
off_t off_uid = (off_t) user_id * sizeof ll;
off_t off_newuid = (off_t) user_newid * sizeof ll;
if (access (LASTLOG_FILE, F_OK) != 0) {
return;
}
fd = open (LASTLOG_FILE, O_RDWR);
if (-1 == fd) {
fprintf (stderr,
_("%s: failed to copy the lastlog entry of user %lu to user %lu: %s\n"),
Prog, (unsigned long) user_id, (unsigned long) user_newid, strerror (errno));
return;
}
if ( (lseek (fd, off_uid, SEEK_SET) == off_uid)
&& (read (fd, &ll, sizeof ll) == (ssize_t) sizeof ll)) {
/* Copy the old entry to its new location */
if ( (lseek (fd, off_newuid, SEEK_SET) != off_newuid)
|| (write (fd, &ll, sizeof ll) != (ssize_t) sizeof ll)
|| (fsync (fd) != 0)
|| (close (fd) != 0)) {
fprintf (stderr,
_("%s: failed to copy the lastlog entry of user %lu to user %lu: %s\n"),
Prog, (unsigned long) user_id, (unsigned long) user_newid, strerror (errno));
}
} else {
/* Assume lseek or read failed because there is
* no entry for the old UID */
/* Check if the new UID already has an entry */
if ( (lseek (fd, off_newuid, SEEK_SET) == off_newuid)
&& (read (fd, &ll, sizeof ll) == (ssize_t) sizeof ll)) {
/* Reset the new uid's lastlog entry */
memzero (&ll, sizeof (ll));
if ( (lseek (fd, off_newuid, SEEK_SET) != off_newuid)
|| (write (fd, &ll, sizeof ll) != (ssize_t) sizeof ll)
|| (fsync (fd) != 0)
|| (close (fd) != 0)) {
fprintf (stderr,
_("%s: failed to copy the lastlog entry of user %lu to user %lu: %s\n"),
Prog, (unsigned long) user_id, (unsigned long) user_newid, strerror (errno));
}
} else {
(void) close (fd);
}
}
}
সংজ্ঞাটি struct lastlog
এসেছে #include <lastlog.h>
এবং এগুলি দেখতে পাবেন:
/* The structure describing an entry in the database of
previous logins. */
struct lastlog
{
#ifdef __WORDSIZE_TIME64_COMPAT32
int32_t ll_time;
#else
__time_t ll_time;
#endif
char ll_line[UT_LINESIZE];
char ll_host[UT_HOSTSIZE];
};