[질문] 원격에서 명령어 실행시키기

psycoder의 이미지

서버 프로그램을 만들었는데요..
특정 포트에서 바인딩하다가 "command=string"이란 문자열을 받으면 string을 실행하도록 만들어봤습니다.

if(strstr(buf, "command")!=NULL) {         //buf는 recv로 받은 데이타값이 들어가는 배열입니다.
        char *exe, cmd[100];
        STARTUPINFO si={0,};
        PROCESS_INFORMATION pi;

        closesocket(ClientSock);
        exe=strstr(buf2, "=")+1;
        sprintf(cmd, "%s", exe);
        si.cb=sizeof(STARTUPINFO);
        si.dwFlags=0;
        CreateProcess(cmd, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);

        continue;
    }

이렇게 만들었구요..클라이언트 측에서 "command=c:\\windows\\notepad.exe" 를 해당포트에 보낸후 서버측에서 cmd배열을 확인해 보면 "c:\windows\notepad.exe"라고 제대로 들어와있습니다.
근데, 저걸 실행을 않하네요..(CreateProcess()의 리턴값을 찍어보면 0으로 fail로 나오구요..)
첨엔 WinExec()로 만들었다가 잘 안되서 CreateProcess()로 바꿨는데 그래도 안됩니다.
뭐가 잘못된 걸까요?
mrmirang의 이미지

c:\windows\notepad.exe도 CreateProcess에서는
c:\\windows\\notepad.exe로 받아야 실행이 되겠네요.

neohwang의 이미지

Quote:
CreateProcess()의 리턴값을 찍어보면 0으로 fail로 나오구요..)

전혀 코드상에는 문제가 없는데요... ^^ 위에서 왜 fail로 나오는지 이해가 안되네요....

dudungsil의 이미지

상황을 보면 CreateProcess보다는 ShellExecute가 더 적절해보이는군요.

그리고 fail나면 당연히 GetLastError ()값을 알아보셔야죠. 최소한 CreateProcess가 왜 삐졌는지 이유는 아실수 있었을겁니다.

산넘어 산

dudungsil의 이미지

psycoder wrote:
클라이언트 측에서 "command=c:\\windows\\notepad.exe" 를 해당포트에 보낸후 서버측에서 cmd배열을 확인해 보면 "c:\windows\notepad.exe"라고 제대로 들어와있습니다

좀 어이 없는 상상일지도 모르지만, 클라이언트는 win9x 계열이라 c:\windows\notepad.exe가 맞겠죠.

서버면 최소 nt4 이상일텐데요 디폴트 설치 디렉토리가 c:\winnt 아닌가요? windows라고 따로 이름을 지정해서 설치하는 사람을 주변에서 한명도 못봤습니다.

정확한 정보가 없으면 이렇게 엉뚱한 상상을.. -_-

산넘어 산

ssoo76의 이미지

CreateProcess(cmd, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);

CreateProcess(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);

로 바꾸면 되지 않을까 하네요...

세상은 하나..........

psycoder의 이미지

답변 감사합니다. :D
계속 답변을 안주셔서 저혼자 삽질하다 결국 해결하긴 했습니다.(어제까진 답변이 없었는데 오늘보니 많은 분들이 답변해주셨네요. :D )
문제는..클라이언트에서 서버에게 명령어를 보낼때..
1) command=c:\\windows\\notepad.exe가 아니라..
2) command="c:\\windows\\notepad.exe" 이렇게 " "으로 묶어줘야 되더군요. (즉, CreateProcess()의 cmd[] 배열에 "c:\windows\notepad.exe" 이렇게 " "가 포함되어야 되더군요.)
근데 해결하긴 했는데 왜 이렇게 해야하는지 이유를 모르겠습니다.

앞에서 답변주신데로 1)번 명령어를 쏘고 GetLastError()으로 찍어보면 해당명령어가 없다는 에러를 뱉습니다.
근데 로컬에서 실행할땐 " "으로 묶어주지 않아도 잘 실행되는데 왜 원격(소켓을 통해)에서 실행하면 안될까요?

M.W.Park의 이미지

psycoder wrote:
답변 감사합니다. :D
계속 답변을 안주셔서 저혼자 삽질하다 결국 해결하긴 했습니다.(어제까진 답변이 없었는데 오늘보니 많은 분들이 답변해주셨네요. :D )
문제는..클라이언트에서 서버에게 명령어를 보낼때..
1) command=c:\\windows\\notepad.exe가 아니라..
2) command="c:\\windows\\notepad.exe" 이렇게 " "으로 묶어줘야 되더군요. (즉, CreateProcess()의 cmd[] 배열에 "c:\windows\notepad.exe" 이렇게 " "가 포함되어야 되더군요.)
근데 해결하긴 했는데 왜 이렇게 해야하는지 이유를 모르겠습니다.

앞에서 답변주신데로 1)번 명령어를 쏘고 GetLastError()으로 찍어보면 해당명령어가 없다는 에러를 뱉습니다.
근데 로컬에서 실행할땐 " "으로 묶어주지 않아도 잘 실행되는데 왜 원격(소켓을 통해)에서 실행하면 안될까요?

로컬(command line)에서 실행할 때에도 스페이스가 포함되면 따옴표없으면 실행 안됩니다. :twisted:

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

psycoder의 이미지

M.W.Park wrote:

로컬(command line)에서 실행할 때에도 스페이스가 포함되면 따옴표없으면 실행 안됩니다. :twisted:


답변 감사합니다. :D
저두 그건 알고있는데요..
위의 명령에선 스페이스가 전혀 포함되어 있지 않습니다.
그리고 제가 로컬에서 잘된다는건
if(strstr(buf, "command")!=NULL) {         //buf는 recv로 받은 데이타값이 들어가는 배열입니다. 
        char *exe, cmd[100]; 
        STARTUPINFO si={0,}; 
        PROCESS_INFORMATION pi; 

        closesocket(ClientSock); 
        exe=strstr(buf2, "=")+1; 
        sprintf(cmd, "%s", exe); 
        si.cb=sizeof(STARTUPINFO); 
        si.dwFlags=0; 
        CreateProcess(cmd, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); 

        continue; 
    } 
여기서 소켓관련 부분은 빼고 로컬에서 똑같은 명령어를 실행하면 잘된다는 겁니다.
근데 유독 원격에서 소켓을 통해 같은 명령어를 실행시킬땐 " "으로 묶어서 보내야 실행되는데 이유를 잘 모르겠습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.