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

کمک و پشتیبانی => برنامه‌سازی => نویسنده: shayan72 در 24 تیر 1388، 12:58 ق‌ظ

عنوان: اجرای دستورات ترمینال با استفاده از زبان ++C
ارسال شده توسط: shayan72 در 24 تیر 1388، 12:58 ق‌ظ
با عرض سلام .  ;)
یک سوالی در مورد اجرای دستورات ترمینال  با استفاده از زبان ++C داشتم !  ???
می دونم که برای دستورات عادی ای مثل cp که نیازی به مجوز root نداره باید از کتابخانه cstdlib استفاده کنم و از تابع system استفاده کنم !
اما این تابع برای دستوراتی مانند passwd یا ssh که نیاز به مجوز root داره کار نمی کنه !
می خواستم ببینم تابعی برای این کار موجود هست که حالا رمز سیستم رو هم بعدش یا باهاش وارد کنم ! و در کل برای دستوراتی که باید با root انجام بشه هم کار کنه ...
( یا حتی اگه همین تابع system این قابلیت رو داره چطوری باید ازش استفاده کرد ؟ )

مرسی  8)
عنوان: پاسخ به: اجرای دستورات ترمینال با استفاده از زبان ++C
ارسال شده توسط: ZeetreX در 24 تیر 1388، 01:34 ق‌ظ
شما باید 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 (http://www.opengroup.org/onlinepubs/000095399/functions/exec.html)
عنوان: پاسخ به: اجرای دستورات ترمینال با استفاده از زبان ++C
ارسال شده توسط: someonenew در 27 تیر 1388، 11:44 ب‌ظ
با عرض سلام .  ;)
یک سوالی در مورد اجرای دستورات ترمینال  با استفاده از زبان ++C داشتم !  ???
می دونم که برای دستورات عادی ای مثل cp که نیازی به مجوز root نداره باید از کتابخانه cstdlib استفاده کنم و از تابع system استفاده کنم !
اما این تابع برای دستوراتی مانند passwd یا ssh که نیاز به مجوز root داره کار نمی کنه !
می خواستم ببینم تابعی برای این کار موجود هست که حالا رمز سیستم رو هم بعدش یا باهاش وارد کنم ! و در کل برای دستوراتی که باید با root انجام بشه هم کار کنه ...
( یا حتی اگه همین تابع system این قابلیت رو داره چطوری باید ازش استفاده کرد ؟ )

مرسی  8)

اگه درست یادمباشه روش سیستماتیکش اینه که از setuid() استفاده کنی. یه چک کن ببین درست یادمه
عنوان: پاسخ به: اجرای دستورات ترمینال با استفاده از زبان ++C
ارسال شده توسط: مهدی2 در 04 دی 1388، 04:10 ب‌ظ
سلام
میشه درباره 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);
}
عنوان: پاسخ به: اجرای دستورات ترمینال با استفاده از زبان ++C
ارسال شده توسط: someonenew در 04 دی 1388، 05:53 ب‌ظ
سلام
میشه درباره setuid() یک مثال بزنید

سلام مثال خاصی در دسترسم نیست ولی با اضافه کردن "setuid(0);" با اختیارات root اجرا میشه. ولی دو تا مسئله هست! اگر برنامه رو با sudo اجرا نکنی "setuid(0);" خطا می ده (fail می شه).
دوم اینکه در اوبونتو حتی وقتی که با اختیارات root هستی بازم باید sudo  رو اول دستورا قرار بدی. پس مزیت چندانی به روش فعلی شما نداره
عنوان: پاسخ به: اجرای دستورات ترمینال با استفاده ا&
ارسال شده توسط: مهدی2 در 05 دی 1388، 01:36 ب‌ظ
سلام وتشکر از جواب
منظورم اینکه توی یک کد عبارت setuid() در چه جای باید قرار بگیره  ??? مثلا system در کد زیر
{
   int x=system("gksu -- sudo dpkg -i /home/m/Desktop/cdd/packages/amir05_beta_i386.deb"); //**
   return 0;
}

همچنین این کد ها رو کجا می شه پیدا کرد
عنوان: پاسخ به: اجرای دستورات ترمینال با استفاده از زبان ++C
ارسال شده توسط: someonenew در 05 دی 1388، 01:46 ب‌ظ
سلام وتشکر از جواب
منظورم اینکه توی یک کد عبارت 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) دستورات با اختیارات کاربر فعلی اجرا می شند و بعد از اون با اختیارات روت