首页 运维 网络学院 查看内容

CMD环境下操作SQL语句的C代码

2008-11-15 10:54 644 0

摘要:  /*   sqlcmd.c    WWW.EXCLUDED.ORG - l0om - l0om a7 excluded d07 org ...
关键词: nbsp login mslogin printf database return include HOST define dbd

 /*   sqlcmd.c    WWW.EXCLUDED.ORG - l0om - l0om a7 excluded d07 org    connect to mssql server and spawn a shell via master..xp_cmdshell 'command'   - default user "sa"   - default pwd  ""     sqlcmd <hostname:port> [options]    -u: username [def:sa]-p: password [def:]  -d: use database  -h: help-v: verbose    badass@linux:/home/sirownalot> gcc -o sqlcmd sqlcmd.c -lsybdb */ #include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <signal.h>#include <sys/stat.h>#include <sys/types.h>#include <sybfront.h>#include <sybdb.h>#include <stdio.h> #define MAX_HOST   40#define MAX_BUFF   256#define PROMPT     "sqlcmd> " #define DEFAULTHST "127.0.0.1:1433"#define DEFAULTUID "su"#define DEFAULTPWD ""#define FGREEN     "\033[0;32m"#define FNORMAL    "\033[0;38m"#define FRED       "\033[0;31m" struct mssql_login {    char host[MAX_HOST];    char *uid;    char *pwd;    char *database;}; int set_paranoia(void *addr, size_t nlen, mode_t mask);int sql_cmd(DBPROCESS *dbd);void set_login_defaults(struct mssql_login *login);void help(char *usage);static void sig_int(int sig); int main(int argc, char **argv){    int i, verbose = 0;    char buf[MAX_BUFF], cmdbuf[MAX_BUFF];    struct mssql_login mslogin;    LOGINREC *login;    DBPROCESS *dbd;     if(dbinit() == FAIL) {fprintf(stderr, "dbinit failed\n");return(1);    } else login = dblogin();    if(login == NULL) {fprintf(stderr, "cannot allocate structur\n");return(1);    } else set_login_defaults(&mslogin);     if(argc > 1)for(i = 1; i < argc; i++)    if(argv[i][0] == '-') switch(argv[i][1]) {   case 'h': help(argv[0]);exit(0);   case 'u':mslogin.uid = argv[++i];break;   case 'p':mslogin.pwd = argv[++i];break;   case 'd':mslogin.database = argv[++i];break;   case 'v':verbose = 1;break;   default:printf("unknown option >>%s<<\n",argv[i]);return(1);} else {   memcpy(mslogin.host, argv[i], MAX_HOST);   if(strchr(mslogin.host, ':') == NULL) {fprintf(stderr, "wrong host syntax!  <hostname:port>\n");return(1);   }}       if(!getuid()) // if we are root set paranoia settings ;)if(!set_paranoia((LOGINREC *)&login, sizeof(LOGINREC), 022))   fprintf(stderr, "[warning]: paranoia settings faild\n");else printf("[note]: paranoia settings set\n");     DBSETLUSER(login, mslogin.uid);    DBSETLPWD(login, mslogin.pwd);    DBSETLAPP(login, "sqlcmd");    DBSETLHOST(login, mslogin.host);        if(verbose) printf("verbose: username:%s password:%s host:%s\n\n",mslogin.uid, mslogin.pwd, mslogin.host);     if( (dbd = dbopen(login, mslogin.host)) == NULL) { fprintf(stderr, "%sfailed to connect to %s!%s\n",FRED,mslogin.host,FNORMAL);return(1);    } else printf("%sconnected to host %s as user %s!\nexit with CTRL+C\n%s\n",FGREEN,mslogin.host,mslogin.uid,FNORMAL);     if(mslogin.database != NULL)if(dbuse(dbd, mslogin.database) == FAIL)    fprintf(stderr, "cannot change to %s\n",mslogin.database);        else if(verbose) printf("using database %s\n",mslogin.database);     if(signal(SIGINT, sig_int) == SIG_ERR) fprintf(stderr, "cannot install signalhandler\n");     i = sql_cmd(dbd);     dbclose(dbd);    dbfreebuf(dbd);    dbexit();    return(i);} int sql_cmd(DBPROCESS *dbd) {    char cmdbuf[MAX_BUFF], buf[MAX_BUFF];     while(1) {memset(cmdbuf, 0x00, MAX_BUFF);printf(PROMPT); fflush(stdout);if(read(0, cmdbuf, MAX_BUFF)==-1) {   perror("read");   return(1);} else dbfcmd(dbd, "exec master..xp_cmdshell '%s'",cmdbuf);    if(dbsqlexec(dbd) == FAIL || dbresults(dbd) == FAIL) fprintf(stderr, "error while dbsqlexec\n");    else dbbind(dbd, 1, NTBSTRINGBIND, 0, (BYTE *)&buf);        while(dbnextrow(dbd) != NO_MORE_ROWS) printf("%s\n",buf);    }    return(0);} int set_paranoia(void *addr, size_t nlen, mode_t mask){    if(addr != NULL)if(mlock(addr, nlen)) return(0);     if(mask != 0)umask(mask);     if(setuid(65534))return(0);    return(1);} void set_login_defaults(struct mssql_login *login){    memcpy(login->host, DEFAULTHST, MAX_HOST);    login->uid=DEFAULTUID;    login->pwd=DEFAULTPWD;    login->database=NULL;  //Northwind?!} static void sig_int(int sig){    printf(FRED);    printf("\n\n\t EXITING...\n");    printf(FNORMAL);    dbexit();    sleep(1);    exit(0);} void help(char *usage){    printf("%s <hostname:port> [options]\n",usage);    printf("-u: username [def:sa]\n");    printf("-p: password [def:]\n");    printf("-d: use database\n");    printf("-h: help\n");    printf("-v: verbose\n");}
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部