انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید

نویسنده موضوع: اجرای دستورات ترمینال با استفاده از زبان ++C  (دفعات بازدید: 3590 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین shayan72

  • Newbie
  • *
  • ارسال: 10
با عرض سلام .  ;)
یک سوالی در مورد اجرای دستورات ترمینال  با استفاده از زبان ++C داشتم !  ???
می دونم که برای دستورات عادی ای مثل cp که نیازی به مجوز root نداره باید از کتابخانه cstdlib استفاده کنم و از تابع system استفاده کنم !
اما این تابع برای دستوراتی مانند passwd یا ssh که نیاز به مجوز root داره کار نمی کنه !
می خواستم ببینم تابعی برای این کار موجود هست که حالا رمز سیستم رو هم بعدش یا باهاش وارد کنم ! و در کل برای دستوراتی که باید با root انجام بشه هم کار کنه ...
( یا حتی اگه همین تابع system این قابلیت رو داره چطوری باید ازش استفاده کرد ؟ )

مرسی  8)

آفلاین ZeetreX

  • Newbie
  • *
  • ارسال: 2
  • جنسیت : پسر
شما باید sudo رو اجرا کنید و اسم دستور مورد نظر رو بعنوان آرگومان به sudo بفرستید.
مثلا در کد زیر من یک فایل رو توسط gedit باز میکنم (با مجوز root)
#include <unistd.h>

int main()
{
int ret;
ret = execl ("/usr/bin/sudo","sudo","gedit","myfile.txt", (char *)0);
return 0 ;
}

میتونی مدلهای دیگه exec رو تو سایت زیر ببینی
http://www.opengroup.org/onlinepubs/000095399/functions/exec.html

آفلاین someonenew

  • Jr. Member
  • *
  • ارسال: 31
  • جنسیت : پسر
با عرض سلام .  ;)
یک سوالی در مورد اجرای دستورات ترمینال  با استفاده از زبان ++C داشتم !  ???
می دونم که برای دستورات عادی ای مثل cp که نیازی به مجوز root نداره باید از کتابخانه cstdlib استفاده کنم و از تابع system استفاده کنم !
اما این تابع برای دستوراتی مانند passwd یا ssh که نیاز به مجوز root داره کار نمی کنه !
می خواستم ببینم تابعی برای این کار موجود هست که حالا رمز سیستم رو هم بعدش یا باهاش وارد کنم ! و در کل برای دستوراتی که باید با root انجام بشه هم کار کنه ...
( یا حتی اگه همین تابع system این قابلیت رو داره چطوری باید ازش استفاده کرد ؟ )

مرسی  8)

اگه درست یادمباشه روش سیستماتیکش اینه که از setuid() استفاده کنی. یه چک کن ببین درست یادمه

آفلاین مهدی2

  • Jr. Member
  • *
  • ارسال: 44
سلام
میشه درباره setuid() یک مثال بزنید

در ضمن من از کد های زیر برای دستورات روت  استفاده می کنم

{
   int x=system("gksu -- sudo dpkg -i /home/m/Desktop/cdd/packages/amir05_beta_i386.deb"); //**
   return 0;
}
البته این به نظر ناقص باشه
این هم یک نمونه دیگه
{
FILE *fp;
        gint exit_status;
        gchar *command = "gksu -- sudo dpkg -i /home/m/Desktop/cdd/packages/amir05_beta_i386.deb";

        /* execute command */
        fp = popen(command, "r");
    if (fp == NULL)
    {
                g_print("Error running %s", command);
    }
        exit_status = pclose (fp);
        g_print("Script exited with status %d", exit_status);
}

آفلاین someonenew

  • Jr. Member
  • *
  • ارسال: 31
  • جنسیت : پسر
سلام
میشه درباره setuid() یک مثال بزنید

سلام مثال خاصی در دسترسم نیست ولی با اضافه کردن "setuid(0);" با اختیارات root اجرا میشه. ولی دو تا مسئله هست! اگر برنامه رو با sudo اجرا نکنی "setuid(0);" خطا می ده (fail می شه).
دوم اینکه در اوبونتو حتی وقتی که با اختیارات root هستی بازم باید sudo  رو اول دستورا قرار بدی. پس مزیت چندانی به روش فعلی شما نداره

آفلاین مهدی2

  • Jr. Member
  • *
  • ارسال: 44
سلام وتشکر از جواب
منظورم اینکه توی یک کد عبارت setuid() در چه جای باید قرار بگیره  ??? مثلا system در کد زیر
{
   int x=system("gksu -- sudo dpkg -i /home/m/Desktop/cdd/packages/amir05_beta_i386.deb"); //**
   return 0;
}

همچنین این کد ها رو کجا می شه پیدا کرد
« آخرین ویرایش: 05 دی 1388، 01:39 ب‌ظ توسط مهدی2 »

آفلاین someonenew

  • Jr. Member
  • *
  • ارسال: 31
  • جنسیت : پسر
سلام وتشکر از جواب
منظورم اینکه توی یک کد عبارت setuid() در چه جای باید قرار بگیره  ??? مثلا system در کد زیر
{
   int x=system("gksu -- sudo dpkg -i /home/m/Desktop/cdd/packages/amir05_beta_i386.deb"); //**
   return 0;
}

مثلا قبل از تابع system() می تونید اونو قرار بدین. برای تست نحوه کار setuid() یک مثال ساده که معمولا در منابع استفاده می کنند یه همچین شکلیه:
.
.
.
system("whoami");
setuid(0);
system("whoami");
.
.
.
در این مثال تا قبل از اجرای stuid دستور whoami اسم کاربر فعلی رو بر می گردونه. در حالی که بعد از setuid روت رو نمایش می ده. این به این معنیه که تا قبل از setuid(0) دستورات با اختیارات کاربر فعلی اجرا می شند و بعد از اون با اختیارات روت