【问题标题】:C write file as executable ASCIIC 将文件写为可执行的 ASCII
【发布时间】:2015-02-09 11:16:33
【问题描述】:

我正在制作一些程序,服务器向客户端发送 shell 脚本。客户端获取代码并将其放入文件中,然后执行。

添加功能:

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

“有趣”的事情是,如果我使用 ./mount.sh 从我的 shell (zsh) 手动运行它,它会运行良好,但我有警告:

./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

Var 内容是一个 char *,通过网络发送。用户在 Web 界面中键入它,然后将其存储在 SQLite3 数据库中,然后再通过网络发送。

【问题讨论】:

  • char *content的内容是什么?该字符串很可能包含非 ASCII 字符。
  • 您不能定义file 类型。类型是从内容中猜测出来的。
  • 我猜你的脚本缺少shebang,但我不确定(你没有提供太多细节)。确保您的脚本以 #/bin/bash 为前缀(假设您的脚本是 Bash 脚本)。
  • @AndreaCorbellini #!/bin/bash
  • 在十六进制编辑器中查看您的非工作文件,寻找奇怪的字符。此外,请确保该文件中有正确的换行符,例如 \n。如果您使用的是 Windows 换行符\r\n,您的 shell 脚本将不会运行。

标签: c linux executable


【解决方案1】:

具有 hexedit 出现的不可打印字符,现在可以使用。

谢谢大家!

【讨论】:

  • 由于这些问答旨在帮助其他提出相同问题的人,也许您可​​以详细说明垃圾字符是如何潜入的?
  • @Potatoswatter 我忘了清理缓冲区,所以用 strncat 填充会留下一些分配数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多