[질문] 원격에서 명령어 실행시키기
글쓴이: psycoder / 작성시간: 일, 2004/06/06 - 7:42오후
서버 프로그램을 만들었는데요..
특정 포트에서 바인딩하다가 "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()로 바꿨는데 그래도 안됩니다.
뭐가 잘못된 걸까요?
Forums:
c:\windows\notepad.exe도 CreateProcess에서는
c:\windows\notepad.exe도 CreateProcess에서는
c:\\windows\\notepad.exe로 받아야 실행이 되겠네요.
.
전혀 코드상에는 문제가 없는데요... ^^ 위에서 왜 fail로 나오는지 이해가 안되네요....
상황을 보면 CreateProcess보다는 ShellExecute가 더
상황을 보면 CreateProcess보다는 ShellExecute가 더 적절해보이는군요.
그리고 fail나면 당연히 GetLastError ()값을 알아보셔야죠. 최소한 CreateProcess가 왜 삐졌는지 이유는 아실수 있었을겁니다.
산넘어 산
[quote="psycoder"]클라이언트 측에서 "command=c:\
좀 어이 없는 상상일지도 모르지만, 클라이언트는 win9x 계열이라 c:\windows\notepad.exe가 맞겠죠.
서버면 최소 nt4 이상일텐데요 디폴트 설치 디렉토리가 c:\winnt 아닌가요? windows라고 따로 이름을 지정해서 설치하는 사람을 주변에서 한명도 못봤습니다.
정확한 정보가 없으면 이렇게 엉뚱한 상상을.. -_-
산넘어 산
답글....
CreateProcess(cmd, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
를
CreateProcess(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
로 바꾸면 되지 않을까 하네요...
세상은 하나..........
Re: 답글....
답변 감사합니다. :D
계속 답변을 안주셔서 저혼자 삽질하다 결국 해결하긴 했습니다.(어제까진 답변이 없었는데 오늘보니 많은 분들이 답변해주셨네요. :D )
문제는..클라이언트에서 서버에게 명령어를 보낼때..
1) command=c:\\windows\\notepad.exe가 아니라..
2) command="c:\\windows\\notepad.exe" 이렇게 " "으로 묶어줘야 되더군요. (즉, CreateProcess()의 cmd[] 배열에 "c:\windows\notepad.exe" 이렇게 " "가 포함되어야 되더군요.)
근데 해결하긴 했는데 왜 이렇게 해야하는지 이유를 모르겠습니다.
앞에서 답변주신데로 1)번 명령어를 쏘고 GetLastError()으로 찍어보면 해당명령어가 없다는 에러를 뱉습니다.
근데 로컬에서 실행할땐 " "으로 묶어주지 않아도 잘 실행되는데 왜 원격(소켓을 통해)에서 실행하면 안될까요?
Re: 답글....
로컬(command line)에서 실행할 때에도 스페이스가 포함되면 따옴표없으면 실행 안됩니다. :twisted:
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
Re: 답글....
답변 감사합니다. :D
저두 그건 알고있는데요..
위의 명령에선 스페이스가 전혀 포함되어 있지 않습니다.
그리고 제가 로컬에서 잘된다는건
여기서 소켓관련 부분은 빼고 로컬에서 똑같은 명령어를 실행하면 잘된다는 겁니다.
근데 유독 원격에서 소켓을 통해 같은 명령어를 실행시킬땐 " "으로 묶어서 보내야 실행되는데 이유를 잘 모르겠습니다.
댓글 달기