一開始認(rèn)為iOS是Unix系統(tǒng)孟害,肯定是可以調(diào)用Shell命令的。但是后面發(fā)覺事情并不是那么簡(jiǎn)單巢钓。
確定是否能調(diào)用Shell命令的要項(xiàng):
- 是否存在 Shell 程序
- 是否能使用多進(jìn)程 (因?yàn)?shell 命令都是 fork 出一個(gè)進(jìn)程進(jìn)行處理的)
首先明白什么是 Shell?
Unix shell塞淹,一種殼層與命令行界面,是Unix操作系統(tǒng)下傳統(tǒng)的用戶和計(jì)算機(jī)的交互界面摩瞎。第一個(gè)用戶直接輸入命令來執(zhí)行各種各樣的任務(wù)。
普通意義上的shell就是可以接受用戶輸入命令的程序孝常。它之所以被稱作shell是因?yàn)樗[藏了操作系統(tǒng)低層的細(xì)節(jié)旗们。
意思就是 Shell 命令會(huì)執(zhí)行系統(tǒng)的底層 API 進(jìn)行,讓用戶通過簡(jiǎn)單得命令執(zhí)行復(fù)雜的系統(tǒng)操作构灸。
首先確定iOS是否存在 Shell 程序 (這個(gè)還真的要確認(rèn)一下)上渴,但是就目前的情況來看,iOS 并不存在任何 Shell 程序喜颁。
一開始我上網(wǎng)查找稠氮,找到最多的都是使用 system
函數(shù)
int system(const char *)
system("ls -al")
后來一看,真機(jī)上毛輸出都沒有半开,返回結(jié)果是 0x7f00
, 意思就是 沒有權(quán)限操作隔披,真是坑了個(gè)爹。
然后看一下系統(tǒng)稿茉,發(fā)覺這個(gè)函數(shù)在 iOS8 被拋棄了锹锰,系統(tǒng)建議用 posix_spawn
好吧,可能跟這個(gè)有關(guān)系
pid_t pid;
char* argv[] =
{
"ls",
NULL
};
int result = posix_spawn(&pid, argv[0], NULL, NULL, argv, environ);
perror("posix_spawn");
waitpid(pid, NULL, 0);
等到的輸出漓库,一直是 posix_spawn: No child processes
恃慧。很是絕望。
沒辦法渺蒿,后來在 Stack Overflow 上面找到一個(gè)帖子痢士。
Yes, you can but it is extremely limited, and ping will probably not work... Regardless use the system() and check gdb.
But Quentin is right about using PING.
NOTE: This is only useful for debugging and shouldn't be used for actual apps.
一看,好東西茂装,原來真機(jī)上不行怠蹂,但是在模擬器上可以搞,原以為很開心的少态,因?yàn)槠鸫a能用城侧,結(jié)果模擬器上使用system
函數(shù)輸出如下:
dyld: dyld_sim cannot be loaded in a restricted process
很是無語呀,iOS 應(yīng)用上無法使用多進(jìn)程彼妻。
想了想嫌佑,越獄行不行豆茫,通過越獄的話,就可以使用多進(jìn)程了屋摇,如果沒有 Shell 的話揩魂,直接使用 OpenSSH(OpenBSD Secure Shell),這樣我們就可以通過遠(yuǎn)程連接來操作 iPhone了, 然后再通過 pc 進(jìn)行 ssh 連接過去炮温,然后就可以使用命令行了火脉。
找到了文章證實(shí)了想法。