關于iOS調用Shell命令

一開始認為iOS是Unix系統,肯定是可以調用Shell命令的。但是后面發覺事情并不是那么簡單。

確定是否能調用Shell命令的要項:

  1. 是否存在 Shell 程序
  2. 是否能使用多進程 (因為 shell 命令都是 fork 出一個進程進行處理的)

首先明白什么是 Shell?

Unix shell,一種殼層與命令行界面,是Unix操作系統下傳統的用戶和計算機的交互界面。第一個用戶直接輸入命令來執行各種各樣的任務。
普通意義上的shell就是可以接受用戶輸入命令的程序。它之所以被稱作shell是因為它隱藏了操作系統低層的細節。

意思就是 Shell 命令會執行系統的底層 API 進行,讓用戶通過簡單得命令執行復雜的系統操作。

首先確定iOS是否存在 Shell 程序 (這個還真的要確認一下),但是就目前的情況來看,iOS 并不存在任何 Shell 程序。

一開始我上網查找,找到最多的都是使用 system 函數

int  system(const char *)

system("ls -al")

后來一看,真機上毛輸出都沒有,返回結果是 0x7f00, 意思就是 沒有權限操作,真是坑了個爹。

然后看一下系統,發覺這個函數在 iOS8 被拋棄了,系統建議用 posix_spawn 好吧,可能跟這個有關系

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 上面找到一個帖子

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.

一看,好東西,原來真機上不行,但是在模擬器上可以搞,原以為很開心的,因為起碼能用,結果模擬器上使用system 函數輸出如下:

dyld: dyld_sim cannot be loaded in a restricted process

很是無語呀,iOS 應用上無法使用多進程。

想了想,越獄行不行,通過越獄的話,就可以使用多進程了,如果沒有 Shell 的話,直接使用 OpenSSH(OpenBSD Secure Shell),這樣我們就可以通過遠程連接來操作 iPhone了, 然后再通過 pc 進行 ssh 連接過去,然后就可以使用命令行了。
找到了文章證實了想法。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容