تتبع:كيفية الحصول على هدف الارتباط الرمزي من الملف

StackOverflow https://stackoverflow.com//questions/20052868

  •  27-12-2019
  •  | 
  •  

سؤال

أنا أستخدم dtrace لتسجيل جميع الملفات المحذوفة.

هل من الممكن معرفة هدف الارتباط الرمزي (إذا كان رابطًا رمزيًا)؟أريد إخراج اسم ملف الارتباط الرمزي واسم الملف الهدف لتسجيل الدخول في حالة احتياجي إلى استعادة الارتباط لاحقًا.

أحد الحلول التي توصلت إليها هو استخدام وظيفة dtrace "system" لاستدعاء البرنامج الخاص بي الذي سيطبع هدف الارتباط الرمزي:system("myprogram %s") حيث %s هو الاسم الكامل للارتباط الرمزي الذي أريد طباعة الهدف له.

يعمل هذا بشكل جيد (إنه برنامج C قصير جدًا ويقوم بالمهمة) - ولكن هل هناك طريقة للحصول على المعلومات مباشرة من خلال dtrace، نظرًا لأننا نتعامل مع الملف على أي حال، يجب أن نكون قادرين على البحث عن هدف الارتباط الرمزي؟

لقد ألقيت نظرة على بنية fileinfo_t ولكنها لا تحتوي على هدف الارتباط الرمزي:http://docs.Oracle.com/cd/E18752_01/html/817-6223/chp-io-args.html#chp-io-fileinfo

هذا هو السيناريو الخاص بي حتى الآن:هذا في سولاريس 10.(هذا هو اختبار لـ fop_remove بدلاً من syscall::unlink والسبب في ذلك هو التمكن من الحصول على دليل الارتباط الرمزي في حالة عدم قيام المستخدم بتحديد الدليل في استدعاء rm).

    #!/usr/sbin/dtrace -s

    #pragma D option quiet

    fbt::fop_remove:entry
    {
           self->dir = stringof(args[0]->v_path);
           self->file = stringof(args[1]);
    }

    fbt::fop_remove:return
    /self->file != NULL/
    {
           printf("%s/%s\n", self->dir, self->file);
           self->file = 0;
           self->dir = 0;
    }

شكرًا!

هل كانت مفيدة؟

المحلول

على مستوى Solaris VFS (المعروف أيضًا باسم vnode_t البنية)، هدف الارتباط الرمزي هو لا تعلق على العقدة للارتباط الرمزي نفسه.إنها تفاصيل تنفيذ نظام الملفات.

بالنسبة لأنظمة ملفات UFS، إذا كان اسم مسار هدف الارتباط أقصر من 48 بايت (ما يطلق عليه UFS "ارتباط رمزي سريع")، فسيتم تسجيله بالتوافق مع inode_t struct، ويمكنك طباعة القيمة من خلال DTrace عبر:

vnode = args[0];
inode = (inode_t*)vnode->v_data;

printf("symlink tgt: %47s\n",
    vnode->v_type != VLNK ||
    vnode->v_op != ufs_vnodeops ||
    inode->i_flags & I_FASTSYMLINK == 0 ?
        "[unresolved]" :
        (char *)inode->i_db);

بالنسبة لأنظمة الملفات الأخرى/في الحالة العامة، يجب عليك استخدام ملف fsinfo::readlink:return (أو fop::fop_readlink:return) نقاط التحقيق للحصول على الهدف - عند الوصول، أي أنه (عادةً) لن يكون قابلاً للاسترجاع مباشرة من vnode_t.

نصائح أخرى

لدي الحل المحتمل التالي - عند الوصول كما قلت:

giveacodicetagpre.

(أنا أقيم التتبع إلى MyDirectory هنا).

لذلك يستفيد ذلك من حقيقة أنه عند الدخول، فإن Arg0 هو اسم Symlink، وعلى المقابل، يتوفر واصف الملف للحصول على اسم المسار الذي هو اسم المسار الفعلي للملف.لذلك سيكون الهدف من symlink. ليس من الأهمية بمكان أن يتم التتبع على الحذف، فقط يتم تسجيل هدف Symlink -> الهدف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top