使用C 給Linux寫Shell指令碼(下篇)

2022-01-17 09:52:17 字數 2001 閱讀 4012

本篇中,我們將介紹:

(1)、c#直接呼叫bashshell所遭遇的問題

(2)、使用c的popen方式呼叫bashshell

(3)、通過呼叫c來間接的呼叫bashshell

一、c#直接呼叫bashshell所產生的問題

使用c#調其他應用,毫無疑問最直接的方法就是「system.diagnostics」中的process.start了。但當我們使用process.start時,卻發現連最簡單的命令都無法呼叫,更無從談起呼叫並接受返回了。

上圖為其中一種錯誤(當然還會有更多的問題出現,這裡就不列舉了)。

二、使用c的popen方式呼叫

正由於process.start無法直接呼叫bashshell的命令,我們需要繞道而行。

我們先看下c語言,c語言呼叫shell的方式有多種,我們選擇了popen函式的方式進行呼叫,先看一下以下的這個demo:

通過poepn管道並完成輸出重定向。

三、通過呼叫c來間接呼叫shell

既然c已經可以實現對bashshell的呼叫已經管道重定向,那我們則可以再通過c#呼叫c的方式,進而間接的完成對bashshell的呼叫。

我們先對自己的c函式進行改造,改造後的**如下(對具體操作有疑問的讀者可參見《如何讓c為c#提供函式》):

#include#include

void* converttocstr(char* input,char* res,int *length)

res[i]='\0'

;}void* bashhelper(char* cmdstr,int* cmdlength,char* output,int*length)

同樣的我們也把c# shell進行改造(沒有intellisense果然難寫,我先在控制台寫好再拷貝過來)

#!/bin/env csharp

using

system.diagnostics;

using

system.io;

using

system.runtime.interopservices;

class

clib}}

[dllimport(

"", callingconvention =callingconvention.stdcall)]

static

unsafe

extern

void bashhelper(char* cmdstr, int* cmdlength, char* output, int*length);

}var cmdstr = "

/bin/ls /";

var output =clib.invokebash(cmdstr);

console.write(output);

完成之後,我們再次在shell中呼叫。

成功執行bashshell命令並把返回輸出重定向到c#中。

可能有讀者會有這麼乙個疑問:「這跟直接寫bashshell沒啥差別啊?!」此言差矣,c#有c#的優勢,bash有bash的優勢,將兩者結合起來後,可以形成互補,利用bash可以快速的操作linux,而一些bash無法提供的功能,譬如寫入資料庫、呼叫某些服務的api、做其他bashshell無法做的事情等。

好的,本篇就寫這麼多了,非c內行,文中可能有不科學之處,僅提供思路,勿拍磚哈。謝謝。

Linux中使用shell指令碼向檔案中寫資料

以前沒寫過shell指令碼,懂得一些linux的操作命令。看了網上一些shell指令碼的方法。總結,發現用指令碼將一些資料寫入檔案比較實用。遂舉例如下 bin bash test echo this is shell to test cd home wxy shell if f 11 then rm...

快速給shell指令碼加上使用提示

我們只需通過在shell指令碼前面加上如下的 即可 bin bash my script does one thing well usage my script options input file to read.output file to write.use for stdout.h show...

使用sqlmap互動式寫shell

使用sqlmap互動式寫shell,只需 絕對路徑和乙個注入點 神器介紹 名字 sqlmap 簡介 國外牛人寫的一款強大的注入工具,問世一來一直被深受喜歡 使用案例 案例 sqlmap互動寫shell 互動寫shell條件 絕對路徑與注入點 互動寫shell命令 1 u 注入點 os shell 可...