2015-02-09 69 views
1

我正在製作一些程序,其中包含向客戶端發送shell腳本的服務器。客戶端獲取代碼並將其放入一個文件中,然後執行它。C將文件寫入可執行文件ASCII

加法功能:

void addScript(char *name,char *content){ 
    int fd; 
    char path[BUFSIZ]; 
    strcpy(path,"scripts/"); 
    strcat(path,name); 
    strcat(path,".sh"); 
    printf("file : %s\n",path); 
    fd = open(path,O_WRONLY|O_CREAT|O_TRUNC,S_IRWXU|S_IRGRP); 
    if(fd == -1){ 
     printf("Error openning file !!"); 
     return; 
    } 
    write(fd,content,strlen(content)); 
    write(fd,"\n",1); 
    close(fd); 
} 

我有一個文件,但是當我嘗試運行它EXEC給我一個錯誤:

Exec failed : Exec format error 

我的腳本運行文件命令,它給我:

mount.sh: Non-ISO extended-ASCII text 

而在手寫腳本(這工作之一),我有:

diskUse.sh: POSIX shell script, ASCII text executable 

我無法找到如何強制文件類型,當我用我的功能創建它時,任何人都有想法?謝謝 !

編輯一些細節:


非工作文件的例子:

#!/bin/sh 

mount 

「有趣」的是,它工作得很好,如果我用手工運行它從我的殼(zsh)與./mount.sh,但我有警告:

./mount.sh: line 1: #!/bin/sh: No such file or directory 

但是:

$ ll /bin/sh 
lrwxrwxrwx 1 root root 4 30 déc. 23:08 /bin/sh -> bash 

瓦爾內容是一個char *,發送throught網絡。用戶在Web界面中鍵入它,然後將其存儲在SQLite3數據庫中,然後通過網絡發送。

+0

'char * content'的內容是什麼?該字符串很可能具有非ASCII字符。 – m0skit0 2015-02-09 11:22:48

+2

您無法定義'file'類型。這種類型是從內容中猜測出來的。 – ceving 2015-02-09 11:23:22

+2

我猜你的腳本缺少shebang,但我不確定(你沒有提供太多細節)。確保你的腳本的前綴是'#/ bin/bash'(假設你的腳本是Bash腳本)。 – 2015-02-09 11:24:07

回答

0

如果以hexedit出現的非打印字符現在可用。

謝謝大家!

+1

由於這些問答旨在幫助其他提出同樣問題的人,也許你可以詳細說明垃圾人物如何偷偷溜進來? – Potatoswatter 2015-02-09 12:56:58

+0

@Patatoswatter我忘了清理一個緩衝區,所以填充strncat會留下一些分配的數據。 – 2015-02-09 18:01:11