我有一小段C代码。
#include<stdio.h>
int main()
{
char *name[2];
name[0] = '/bin/sh';
name[1] = NULL;
execve(name[0], name, NULL);
}
我有一个符号链接sh->zsh。当我运行这个程序时,什么也没发生,我就呆在同一个shell里。我知道我不是在一个新的外壳,因为当我退出时,一旦终端退出。如果我运行/bin/sh
,我会得到另一个shell。是我的代码错了,还是某种类型的安全措施不允许我这样做?
编译这个并发出警告会立即显示错误:
gcc -g t.c
t.c: In function ‘main’:
t.c:7:15: warning: character constant too long for its type
7 | name[0] = '/bin/sh';
| ^~~~~~~~~
t.c:7:13: warning: assignment to ‘char *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
7 | name[0] = '/bin/sh';
| ^
t.c:9:5: warning: implicit declaration of function ‘execve’ [-Wimplicit-function-declaration]
9 | execve(name[0], name, NULL);
| ^~~~~~
当然这个程序不起作用。您想要的字符串文字是"/bin/sh"
(在C
中使用的引号类型很重要(。