【发布时间】: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