PDA

View Full Version : چگونه رمز عبور برنامه را از خط فرمان به صورت نامشخص یا ستاره دار دریافت کنم؟



khajavi
پنج شنبه 20 تیر 1387, 08:39 صبح
یه برنامه نوشتم که به پایگاه داده ی MySQL متصل میشه اما یه مشکلی که دارم اینه که می خوام هنگام اجرای برنامه از خط فرمان ارگومان مربوط به رمز عبور نشان داده نشود.
البته اینکار را با آرگومان های تابع main می توان انجام داد اما مشکلی که هست انیکه نمی خوام در هنگام نوشتن آرگومان ها در خط فرمان رمز عبور نمایش داده شود
مثلا دقت کردید که وقتی برنامه ای را توی لینوکس می خواهید با مجوز root اجرا کنید ازتون رمز عبور را می خواد اگه وقتی دارید رمز عبور را تایپ می کنید هیچ چیزی روی خط فرمان نوشته نمی شود.

mzjahromi
پنج شنبه 20 تیر 1387, 09:11 صبح
این خط فرمان با اون خط فرمان فرق میکنه
اون خط فرمان خودش مدیریت میشه ولی زمانی که شما رمز رو با خط فرمان میفرستید برنامه نمیدونه که این رمز هست.
اگر رمز رو کاربر تایپ میکنه که هیچ( اگر چه بهتره رمز رو بعد از اجرای برنامه خودتون از کاربر بگیرید)
اگر شما دارید با یک برنامه دیگه برنامه رو باز میکنید خوب رمز رو به صورت کد شده پاس بدید

Arash m
پنج شنبه 20 تیر 1387, 11:20 صبح
فکر نکنم از خط فرمان بشه این کار رو کرد چون هنوز دستوری از برنامه ما اجرا نشده که بخواهیم مدیریتی رو اون بکنیم و مدیریت اون دست مانیست.برای این کار بهترین روش گرفتن رمز بعد از اجرای برنامه است(توی main).

همون طور که آقای mzjahromi (http://barnamenevis.org/forum/member.php?u=13276) گفتن اگه برنامه دیگه ای برنامه شما رو فراخوانی میکنه رمز رو به صورت کد شده بفرستین.


اگه منظورت گرفتن رشته از کاربر به صورت مخفی هست قبلاً برای این کار تابعی نوشتم که برات میذارم:


#include<conio.h>
#include<iostream.h>
void get_str(char str[],char msg[],int val,int max){
int c_str=0,pass_val=0,char_val=0;
char ch;
cprintf("%s",msg);
if(val>=1){
pass_val=1;
val-=1;}
do{
ch=getch();
if(ch==8&&c_str>0){
cout<<"\b \b";
c_str--;}
else if(ch>=32&&(c_str<max||max==0)){
*(str+c_str)=ch;
c_str++;
if(pass_val==0)
putch(ch);
else
putch('*');
}
}while((ch!=13)||(c_str==0));
putch('\n');
*(str+c_str)='\0';
gotoxy(1,wherey());
}الگوی تابع:


get_str(str,msg,val,max)str :
این در واقع خروجی تابع است.رشته ای رو که میخواهیم پر کنیم تو این جا قرار میدیم.

msg :

این ورودی پیغامی هست که میخواهیم قبل از ورود رشته توسط کاربر نمایش داده بشه.

val :

این ورودی همون چیزی که تو میخواستی هست.اگه مقدار این ورودی 1 باشه به صورت رمز دریافت میکنه اگه 0 باشه به صورت معمولی دریافت میکنه.

max :

این ورودی حداکثر حروفی رو که کاربر میتونه وارد کنه هست.





مثال:


char p[50];
get_str(p,"Enter password : ",1,49);امیدوارم کمک کرده باشم.

kitten
پنج شنبه 20 تیر 1387, 23:47 عصر
ببین راحت ترین کار این است که
رنگ خطوط و پشت زمینه را یکی کنی و پسوورد را بگیری این جوری مشخص نمی شه

system("color ff");

khajavi
جمعه 21 تیر 1387, 06:51 صبح
خیلی ممنون از راهنمایی هاتون مخصوصا آرش
اما یه مشکل دارم:

توی لینوکس من کتابخانه ی conio.h را ندارم. بعنی این header جز c++ استاندارد نیست. میگید چیکار کنم؟

Arash m
جمعه 21 تیر 1387, 13:29 عصر
خیلی ممنون از راهنمایی هاتون مخصوصا آرش
اما یه مشکل دارم:

توی لینوکس من کتابخانه ی conio.h را ندارم. بعنی این header جز c++ استاندارد نیست. میگید چیکار کنم؟

دوست عزیز شما تابع گرفتن کاراکتر توی لینوکس رو همراه header فایل اون رو بذار تا برات تابع رو تبدبل کنم.

khajavi
جمعه 21 تیر 1387, 18:20 عصر
با getchar() میشه چنین کاری را انجام داد.
به طوری کلی ما فقط می تونی از کتابخانه ی استاندارد سی پلاس پلاس استفاده کنیم: http://www.cppreference.com/

Arash m
یک شنبه 23 تیر 1387, 00:37 صبح
اگه این دستور کاراکتر رو بدون وقفه میگیره یعنی منتظر enter زدن کاربر نمیشه:
به جای دستور getch دستور خودت رو بذار و به جای دستور putch و cprintf دستور چاپ دیگه ای مثل cout رو قرار بده.

khajavi
یک شنبه 23 تیر 1387, 06:59 صبح
دستت درد نکنه مشکل را یه جور دیگه حل کردم.

cout << "Enter Password: " ;
system("stty -echo");
cin >> password;
اینجوری وقتی میخواییم پسورد وارد کنیم هیچ نوشته ای چاپ نمی شود.